本篇內(nèi)容介紹了“如何掌握Envoy”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括蓋州網(wǎng)站建設(shè)、蓋州網(wǎng)站制作、蓋州網(wǎng)頁(yè)制作以及蓋州網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,蓋州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到蓋州省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Envoy 是一個(gè)具有反向代理和負(fù)載均衡功能的單機(jī)軟件,和 Nginx、Haproxy 屬于同一類軟件。與 Nginx 和 Haproxy 相比,Envoy 有一個(gè)的重要特色是:自帶配置 API。
以 Nginx、Haproxy 為代表的負(fù)載均衡軟件,在過(guò)去很多年的實(shí)際應(yīng)用中,很少會(huì)在軟件運(yùn)行的時(shí)候更改配置,即使偶爾要修改配置文件,使用 reload 等命令重新加載就能滿足需要。
以 Kubernetes 為代表的 PaaS 或者容器管理系統(tǒng)出現(xiàn)后,IT 系統(tǒng)沿著“分工專業(yè)化、更少的人做更多同質(zhì)事情”的路線演進(jìn),在當(dāng)前的演進(jìn)過(guò)程中,反向代理與負(fù)載均衡的能力被集中管理、統(tǒng)一提供。
這一演進(jìn)在 Kubernetes 中體現(xiàn)為作為集群出口的 ingress 代理集群內(nèi)所有服務(wù),在以 istio 為代表的 ServiceMesh 中體現(xiàn)為分散在各處的代理軟件在同一個(gè)中心的控制下流轉(zhuǎn)流量。 無(wú)論是作為 Kubernetes 的出口,還是作為 Mesh 中的一個(gè)節(jié)點(diǎn),承擔(dān)流量轉(zhuǎn)發(fā)功能的組件都需要完成一個(gè)挑戰(zhàn): 在運(yùn)行過(guò)程中頻繁的更新配置。
新場(chǎng)景中的更新的頻率是每秒 N 次,遠(yuǎn)遠(yuǎn)超過(guò)以往的場(chǎng)景中以周、月乃至年為周期的更新頻率。這種情形下,熱加載配置文件的方式明顯遲緩笨重,有一些項(xiàng)目通過(guò)開(kāi)發(fā)一個(gè)帶有 API 功能的組件,實(shí)現(xiàn)生成配置文件、觸發(fā)熱加載的功能,以此賦予 Nginx、Haproxy 等傳統(tǒng)負(fù)載均衡軟件高頻更新配置的能力。
但是,如果有一個(gè)軟件原生帶有配置 API,且專注于數(shù)據(jù)平面,它作為可靠的第三方存在,能夠讓控制平面專心于規(guī)則管理,那么它是不是會(huì)很受歡迎呢?
Envoy 就是這樣一款軟件。注意,這里只是在交代背景,不為 envoy 吹票,nginx、haproxy 等都在更新演進(jìn)以適應(yīng)場(chǎng)景的變化。
Envoy 的功能和使用細(xì)節(jié)繁雜,但只要搞清楚了 Cluster、Listener 和 Filter 的用途,就把握住了大方向。
Cluster 就是一組 IP,相當(dāng)于 Nginx 中 upstream,負(fù)載均衡策略在 cluster 中設(shè)置,cluster 中可以是 IP 也可以是域名:
Envoy 的配置文件是從零開(kāi)始了解 Envoy 時(shí)遇到的最大困難,它的配置比較繁雜,而且缺少系統(tǒng)的介紹。
配置文件在 envoy 啟動(dòng)時(shí),用 -c
指定,內(nèi)容分為以下幾個(gè)部分:
{ "node": { "id": "...", "cluster": "...", "metadata": "{...}", "locality": "{...}", "build_version": "..." }, "static_resources": { "listeners": [], "clusters": [], "secrets": [] }, "dynamic_resources": { "lds_config": "{...}", "cds_config": "{...}", "ads_config": "{...}" }, "cluster_manager": { "local_cluster_name": "...", "outlier_detection": "{...}", "upstream_bind_config": "{...}", "load_stats_config": "{...}" }, "hds_config": { "api_type": "...", "cluster_names": [], "grpc_services": [], "refresh_delay": "{...}", "request_timeout": "{...}", "rate_limit_settings": "{...}" }, "flags_path": "...", "stats_sinks": [ { "name": "...", "config": "{...}" } ], "stats_config": { "stats_tags": [], "use_all_default_tags": "{...}", "stats_matcher": "{...}" }, "stats_flush_interval": "{...}", "watchdog": { "miss_timeout": "{...}", "megamiss_timeout": "{...}", "kill_timeout": "{...}", "multikill_timeout": "{...}" }, "tracing": { "http": "{...}" }, "rate_limit_service": { "grpc_service": "{...}" }, "runtime": { "symlink_root": "...", "subdirectory": "...", "override_subdirectory": "..." }, "admin": { "access_log_path": "...", "profile_path": "...", "address": "{...}" }, "overload_manager": { "refresh_interval": "{...}", "resource_monitors": [], "actions": [] } }
查看 envoy 容器中的默認(rèn)配置文件,有助于建立感性認(rèn)識(shí),內(nèi)容如下:
admin: access_log_path: /tmp/admin_access.log address: socket_address: protocol: TCP address: 127.0.0.1 port_value: 9901 static_resources: listeners: - name: listener_0 address: socket_address: protocol: TCP address: 0.0.0.0 port_value: 10000 filter_chains: - filters: - name: envoy.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: local_service domains: ["*"] routes: - match: prefix: "/" route: host_rewrite: www.google.com cluster: service_google http_filters: - name: envoy.router clusters: - name: service_google connect_timeout: 0.25s type: LOGICAL_DNS # Comment out the following line to test on v6 networks dns_lookup_family: V4_ONLY lb_policy: ROUND_ROBIN load_assignment: cluster_name: service_google endpoints: - lb_endpoints: - endpoint: address: socket_address: address: www.google.com port_value: 443 tls_context: sni: www.google.com
掌握 envoy 的配置文件,是把握住這款軟件的關(guān)鍵一步,如何才能掌握 envoy 的配置呢?把它所有的配置細(xì)節(jié)記住當(dāng)然算是掌握了,但是大多數(shù)時(shí)候我們并不需要如此,只需要知道實(shí)時(shí)反應(yīng)配置文件全部細(xì)節(jié)的文檔在哪里就足夠了,剩下的交給時(shí)間和好奇心:
幾乎可以這樣說(shuō),在實(shí)際應(yīng)用中最常提及的 envoy 功能都是 filter 提供的, filter 是流量在 envoy 內(nèi)流轉(zhuǎn)時(shí)經(jīng)歷的一個(gè)又一個(gè)處理環(huán)節(jié),每個(gè)環(huán)節(jié)都會(huì)解讀一些信息、作出一些判斷,影響下一個(gè)環(huán)節(jié)的處理。
Cluster 和 Listener 中都有 filter 的位置,有的 filter 比較復(fù)雜還實(shí)現(xiàn)了 子 filter
,例如專門(mén)處理 http 協(xié)議的 HttpConnectionManager。
這些 filter 的名稱很好的展示了 envoy 能夠做的事情,http、thrift、dubbo、zookeeper、MySQL、mongo、redis,看起來(lái)是不是挺誘人的?
envoy 的一大賣(mài)點(diǎn)就是自帶配置 API,但要把它自帶的 API 用起來(lái)還挺周折。envoy 率先提出使用統(tǒng)一的 data-plane-api ,定義了一套 API 標(biāo)準(zhǔn),并期待能夠得到廣泛的認(rèn)同和采納,從新起的 Api 網(wǎng)關(guān)和 ServiceMesh 開(kāi)源項(xiàng)目的選擇來(lái)看,這一策略是有效的。
go-controller-plane 是 envoy 提出的 data-plane-api 的 go 語(yǔ)言實(shí)現(xiàn),可以用它向 envoy 下發(fā)配置,這個(gè)庫(kù)的使用方法三言兩語(yǔ)說(shuō)不清楚,先弄清楚下面三個(gè)項(xiàng)目的關(guān)系: envoy 就是單機(jī)軟件 envoy,data-plane-api 是 API 接口標(biāo)準(zhǔn),go-control-plane 是 API 接口標(biāo)準(zhǔn)的實(shí)現(xiàn)。
“如何掌握Envoy”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!