AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Envoy 基于文件和 API 的動(dòng)態(tài)配置方式

來源: 責(zé)編: 時(shí)間:2023-10-30 09:07:09 267觀看
導(dǎo)讀前面我們和大家學(xué)習(xí)了 Envoy 的基礎(chǔ)知識(shí),使用靜態(tài)配置來認(rèn)識(shí)了 Envoy,但實(shí)際上 Envoy 的閃光點(diǎn)在于其動(dòng)態(tài)配置,動(dòng)態(tài)配置主要有基于文件和 API 兩種方式。基于文件的動(dòng)態(tài)配置Envoy 除了支持靜態(tài)配置之外,還支持動(dòng)態(tài)配置,而

CHx28資訊網(wǎng)——每日最新資訊28at.com

前面我們和大家學(xué)習(xí)了 Envoy 的基礎(chǔ)知識(shí),使用靜態(tài)配置來認(rèn)識(shí)了 Envoy,但實(shí)際上 Envoy 的閃光點(diǎn)在于其動(dòng)態(tài)配置,動(dòng)態(tài)配置主要有基于文件和 API 兩種方式。CHx28資訊網(wǎng)——每日最新資訊28at.com

基于文件的動(dòng)態(tài)配置

Envoy 除了支持靜態(tài)配置之外,還支持動(dòng)態(tài)配置,而且動(dòng)態(tài)配置也是 Envoy 重點(diǎn)關(guān)注的功能,本節(jié)我們將學(xué)習(xí)如何將 Envoy 靜態(tài)配置轉(zhuǎn)換為動(dòng)態(tài)配置,從而允許 Envoy 自動(dòng)更新。CHx28資訊網(wǎng)——每日最新資訊28at.com

Envoy 動(dòng)態(tài)配置

前面的章節(jié)中,我們都是直接使用的靜態(tài)配置,但是當(dāng)我們需要更改配置的時(shí)候就比較麻煩了,需要重啟 Envoy 代理才會(huì)生效。要解決這個(gè)問題,我們可以將靜態(tài)配置更改成動(dòng)態(tài)配置,當(dāng)我們使用動(dòng)態(tài)配置的時(shí)候,更改了配置,Envoy 將會(huì)自動(dòng)去重新加載配置。CHx28資訊網(wǎng)——每日最新資訊28at.com

Envoy 支持不同的模塊進(jìn)行動(dòng)態(tài)配置,可配置的有如下幾個(gè) API(統(tǒng)稱為 xDS):CHx28資訊網(wǎng)——每日最新資訊28at.com

  • EDS:端點(diǎn)發(fā)現(xiàn)服務(wù)(EDS)可以讓 Envoy 自動(dòng)發(fā)現(xiàn)上游集群的成員,這使得我們可以動(dòng)態(tài)添加或者刪除處理流量請(qǐng)求的服務(wù)。
  • CDS:集群發(fā)現(xiàn)服務(wù)(CDS)可以讓 Envoy 通過該機(jī)制自動(dòng)發(fā)現(xiàn)在路由過程中使用的上游集群。
  • RDS:路由發(fā)現(xiàn)服務(wù)(RDS)可以讓 Envoy 在運(yùn)行時(shí)自動(dòng)發(fā)現(xiàn) HTTP 連接管理過濾器的整個(gè)路由配置,這可以讓我們來完成諸如動(dòng)態(tài)更改流量分配或者藍(lán)綠發(fā)布之類的功能。
  • VHDS:虛擬主機(jī)發(fā)現(xiàn)服務(wù)(VHDS)允許根據(jù)需要與路由配置本身分開請(qǐng)求屬于路由配置的虛擬主機(jī)。該 API 通常用于路由配置中有大量虛擬主機(jī)的部署中。
  • SRDS:作用域路由發(fā)現(xiàn)服務(wù)(SRDS)允許將路由表分解為多個(gè)部分。該 API 通常用于具有大量路由表的 HTTP 路由部署中。
  • LDS:監(jiān)聽器發(fā)現(xiàn)服務(wù)(LDS)可以讓 Envoy 在運(yùn)行時(shí)自動(dòng)發(fā)現(xiàn)整個(gè)監(jiān)聽器。
  • SDS:密鑰發(fā)現(xiàn)服務(wù)(SDS)可以讓 Envoy 自動(dòng)發(fā)現(xiàn)監(jiān)聽器的加密密鑰(證書、私鑰等)以及證書校驗(yàn)邏輯(受信任的根證書、吊銷等)。
  • RTDS:運(yùn)行時(shí)發(fā)現(xiàn)服務(wù) (RTDS) API 允許通過 xDS API 獲取運(yùn)行時(shí)層。這可以通過文件系統(tǒng)層進(jìn)行補(bǔ)充或改善。
  • ECDS:擴(kuò)展配置發(fā)現(xiàn)服務(wù) (ECDS) API 允許獨(dú)立于偵聽器提供擴(kuò)展配置(例如 HTTP 過濾器配置)。當(dāng)構(gòu)建更適合與主控制平面分離的系統(tǒng)(例如 WAF、故障測(cè)試等)時(shí),這非常有用。
  • ADS:EDS、CDS 等都是單獨(dú)的服務(wù),具有不同的 REST/gRPC 服務(wù)名稱,例如 StreamListeners、StreamSecrets。對(duì)于希望強(qiáng)制資源按照不同類型的順序到達(dá) Envoy 的用戶來說,有聚合的 xDS,這是一個(gè)單獨(dú)的 gRPC 服務(wù),在一個(gè) gRPC 流中攜帶所有資源類型。(ADS 只支持 gRPC)。

動(dòng)態(tài)資源,是指由 Envoy 通過 xDS 協(xié)議發(fā)現(xiàn)所需要的各項(xiàng)配置的機(jī)制,相關(guān)的配置信息保存于稱之為管理服務(wù)器(Management Server )的主機(jī)上,經(jīng)由 xDS API 向外暴露;下面是一個(gè)純動(dòng)態(tài)資源的基礎(chǔ)配置框架。CHx28資訊網(wǎng)——每日最新資訊28at.com

{  "lds_config": "{...}",  "cds_config": "{...}",  "ads_config": "{...}"}

xDS API 為 Envoy 提供了資源的動(dòng)態(tài)配置機(jī)制,它也被稱為 Data Plane API。CHx28資訊網(wǎng)——每日最新資訊28at.com

CHx28資訊網(wǎng)——每日最新資訊28at.com

xDS APICHx28資訊網(wǎng)——每日最新資訊28at.com

Envoy 支持三種類型的配置信息的動(dòng)態(tài)發(fā)現(xiàn)機(jī)制,相關(guān)的發(fā)現(xiàn)服務(wù)及其相應(yīng)的 API 聯(lián)合起來 稱為 xDS API。CHx28資訊網(wǎng)——每日最新資訊28at.com

  • 基于文件系統(tǒng)發(fā)現(xiàn):指定要監(jiān)視的文件系統(tǒng)路徑
  • gRPC 服務(wù):?jiǎn)?dòng) gRPC 流。CHx28資訊網(wǎng)——每日最新資訊28at.com

  • REST 服務(wù):輪詢 REST-JSON URL。
  • 通過查詢一到多個(gè)管理服務(wù)器發(fā)現(xiàn):通過 DiscoveryRequest 協(xié)議報(bào)文發(fā)送請(qǐng)求,并要求服務(wù)方以 DiscoveryResponse 協(xié)議報(bào)文進(jìn)行響應(yīng)。

v3 版本的 xDS 支持如下幾種資源類型:CHx28資訊網(wǎng)——每日最新資訊28at.com

  • envoy.config.listener.v3.Listener
  • envoy.config.route.v3.RouteConfiguration
  • envoy.config.route.v3.ScopedRouteConfiguration
  • envoy.config.route.v3.VirtualHost
  • envoy.config.cluster.v3.Cluster
  • envoy.config.endpoint.v3.ClusterLoadAssignment
  • envoy.extensions.transport_sockets.tls.v3.Secret
  • envoy.service.runtime.v3.Runtime

Envoy 對(duì) xDS API 的管理由后端服務(wù)器實(shí)現(xiàn),包括 LDS、CDS、RDS、SRDS(Scoped Route)、VHDS (Virtual Host)、EDS、SDS、RTDS(Runtime )等。CHx28資訊網(wǎng)——每日最新資訊28at.com

  • 所有這些 API 都提供了最終的一致性,并且彼此間不存在相互影響;
  • 部分更高級(jí)別的操作(例如執(zhí)行服務(wù)的 A/B 部署)需要進(jìn)行排序以防止流量被丟棄,因此,基于一個(gè)管理服務(wù)器提供多類 API 時(shí)還需要使用聚合發(fā)現(xiàn)服務(wù)(ADS )API。
  • ADS API 允許所有其他 API 通過來自單個(gè)管理服務(wù)器的單個(gè) gRPC 雙向流進(jìn)行編組,從而允許對(duì)操作進(jìn)行確定性排序

接下來我們先更改配置來使用 EDS,讓 Envoy 根據(jù)配置文件的數(shù)據(jù)來動(dòng)態(tài)添加節(jié)點(diǎn)。CHx28資訊網(wǎng)——每日最新資訊28at.com

Cluster ID

首先我們這里定義了一個(gè)基本的 Envoy 配置文件,如下所示:CHx28資訊網(wǎng)——每日最新資訊28at.com

# envoy.yamladmin:  access_log_path: /tmp/admin_access.log  address:    socket_address:      address: 0.0.0.0      port_value: 9901static_resources:  listeners:    - name: listener_0 # 監(jiān)聽器的名稱      address:        socket_address:          address: 0.0.0.0 # 監(jiān)聽器的地址          port_value: 10000 # 監(jiān)聽器的端口      filter_chains:        - filters:            - name: envoy.filterswork.http_connection_manager              typed_config:                "@type": type.googleapis.com/envoy.extensions.filterswork.http_connection_manager.v3.HttpConnectionManager                stat_prefix: ingress_http                access_log:                  - name: envoy.access_loggers.stdout                    typed_config:                      "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog                http_filters: # 定義http過濾器鏈                  - name: envoy.filters.http.router # 調(diào)用7層的路由過濾器                    typed_config:                      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router                route_config:                  name: local_route                  virtual_hosts:                    - name: backend                      domains: ["*"]                      routes:                        - match:                            prefix: "/"                          route:                            cluster: targetCluster

現(xiàn)在我們還沒有配置 clusters 集群部分,這是因?yàn)槲覀円ㄟ^使用 EDS 來進(jìn)行自動(dòng)發(fā)現(xiàn)。CHx28資訊網(wǎng)——每日最新資訊28at.com

首先我們需要添加一個(gè) node 節(jié)點(diǎn)讓 Envoy 來識(shí)別并應(yīng)用這一個(gè)唯一的配置,動(dòng)態(tài)配置中 Envoy 實(shí)例需要有唯一的 id 標(biāo)識(shí)。將下面的配置放置在配置文件的頂部區(qū)域:CHx28資訊網(wǎng)——每日最新資訊28at.com

node:  id: envoy_eds_id  cluster: youdianzhishi_cluster

除了 id 和 cluster 之外,我們還可以配置基于區(qū)域的一些位置信息來進(jìn)行聲明,比如 region、zone、sub_zone 等。CHx28資訊網(wǎng)——每日最新資訊28at.com

EDS 配置

端點(diǎn)發(fā)現(xiàn)服務(wù) EDS 是基于 gRPC 或 REST-JSON API 服務(wù)器的 xDS 管理服務(wù)器,Envoy 使用它來獲取集群成員。集群成員在 Envoy 術(shù)語中稱為“端點(diǎn)”。對(duì)于每個(gè)集群,Envoy 從發(fā)現(xiàn)服務(wù)獲取端點(diǎn),EDS 是首選的服務(wù)發(fā)現(xiàn)機(jī)制:CHx28資訊網(wǎng)——每日最新資訊28at.com

  • Envoy 明確了解每個(gè)上游主機(jī)(相對(duì)于通過 DNS 解析的負(fù)載均衡器進(jìn)行路由),并且可以做出更智能的負(fù)載均衡決策。
  • 每個(gè)主機(jī)的發(fā)現(xiàn) API 響應(yīng)中攜帶的額外屬性告知 Envoy 主機(jī)的負(fù)載均衡權(quán)重、金絲雀狀態(tài)、區(qū)域等。這些附加屬性由 Envoy 網(wǎng)格在負(fù)載均衡、統(tǒng)計(jì)收集等過程中全局使用。

接下來我們就可以來定義 EDS 配置了,可以來動(dòng)態(tài)控制上游集群數(shù)據(jù)。在前面這部分的靜態(tài)配置是這樣的:CHx28資訊網(wǎng)——每日最新資訊28at.com

clusters:  - name: targetCluster    connect_timeout: 0.25s    type: STRICT_DNS    dns_lookup_family: V4_ONLY    lb_policy: ROUND_ROBIN    load_assignment:      cluster_name: targetCluster      endpoints:        - lb_endpoints:            - endpoint:                address:                  socket_address:                    address: 192.168.215.3                    port_value: 80            - endpoint:                address:                  socket_address:                    address: 192.168.215.4                    port_value: 80

現(xiàn)在我們將上面的靜態(tài)配置轉(zhuǎn)換成動(dòng)態(tài)配置,首先需要轉(zhuǎn)換為基于 EDS 的 eds_cluster_config 屬性,并將類型更改為 EDS,將下面的集群配置添加到 Envoy 配置的末尾:CHx28資訊網(wǎng)——每日最新資訊28at.com

clusters:  - name: targetCluster    connect_timeout: 0.25s    lb_policy: ROUND_ROBIN    type: EDS    eds_cluster_config:      service_name: localservices # 可選,代替集群的名稱,提供給 EDS 服務(wù)      eds_config: # 集群的 EDS 更新源配置        path_config_source: # 本地文件配置源          path: "/etc/envoy/eds.yaml"          # watched_directory: # 可選,監(jiān)視目錄中的文件更改          #   path: "/etc/envoy"

在上面的集群配置中我們?cè)O(shè)置了 type: EDS,表示這是一個(gè)基于 EDS 的集群配置,然后使用 eds_cluster_config 屬性來定義 EDS 的配置信息,其中 service_name 屬性是可選的,如果沒有設(shè)置則使用集群的名稱,這個(gè)屬性是提供給 EDS 服務(wù)的,eds_config 屬性定義了 EDS 更新源的配置,這里我們使用的是本地文件配置源,所以使用 path_config_source 屬性來指定本地配置文件的路徑,這里我們使用的是 /etc/envoy/eds.yaml 這個(gè)文件,這個(gè)文件將會(huì)被 Envoy 代理監(jiān)視,當(dāng)文件內(nèi)容發(fā)生變化的時(shí)候,Envoy 將會(huì)自動(dòng)更新配置。CHx28資訊網(wǎng)——每日最新資訊28at.com

此外還可以配置一個(gè) watched_directory 屬性來監(jiān)視目錄中的文件更改,當(dāng)該目錄中的文件被移動(dòng)到時(shí),該路徑將被重新加載。這在某些部署場(chǎng)景中是必需的。比如如果我們使用 Kubernetes ConfigMap 來加載 xDS 資源,則可能會(huì)使用以下配置:CHx28資訊網(wǎng)——每日最新資訊28at.com

  • 將 xds.yaml 存儲(chǔ)在 ConfigMap 內(nèi)。
  • 將 ConfigMap 掛載到 /config_map/xds
  • 配置路徑 /config_map/xds/xds.yaml
  • 配置監(jiān)視目錄 /config_map/xds

上述配置將確保 Envoy 監(jiān)視所屬目錄的移動(dòng),這是由于 Kubernetes 在原子更新期間管理 ConfigMap 符號(hào)鏈接的方式而必需的。CHx28資訊網(wǎng)——每日最新資訊28at.com

上游的服務(wù)器 192.168.215.3 和 192.168.215.3 就將來自于 /etc/envoy/eds.yaml 這個(gè)文件,我們創(chuàng)建一個(gè)如下所示的 eds.yaml 文件,內(nèi)容如下所示:CHx28資訊網(wǎng)——每日最新資訊28at.com

resources:  - "@type": type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment    cluster_name: localservices # 集群的名稱,如果在集群 eds_cluster_config 中指定,這將是 service_name 值。    endpoints:      - lb_endpoints:          - endpoint:              address:                socket_address:                  address: 192.168.215.3                  port_value: 80

上面我們暫時(shí)只定義了 192.168.215.3 這一個(gè)端點(diǎn)。該配置文件是以 DiscoveryResponse 的格式提供響應(yīng)實(shí)例的。CHx28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在配置完成后,我們可以啟動(dòng) Envoy 代理來進(jìn)行測(cè)試。執(zhí)行下面的命令啟動(dòng) Envoy 容器:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ docker run --name=proxy-eds -d /    -p 9901:9901 /    -p 80:10000 /    -v $(pwd)/manifests/3.Envoy:/etc/envoy /    envoyproxy/envoy:v1.28.0

然后同樣和前面一樣運(yùn)行兩個(gè) HTTP 服務(wù)來作為上游服務(wù)器:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ docker run -d cnych/docker-http-server; docker run -d cnych/docker-http-server;$ docker psCONTAINER ID   IMAGE                      COMMAND                  CREATED              STATUS          PORTS                                                                                NAMES4ee790db09db   cnych/docker-http-server   "/app"                   3 seconds ago        Up 3 seconds    80/tcp                                                                               fervent_khoranaf9456b56f1ff   cnych/docker-http-server   "/app"                   4 seconds ago        Up 3 seconds    80/tcp                                                                               wonderful_carsonf9ce95dcc434   envoyproxy/envoy:v1.28.0   "/docker-entrypoint.…"   About a minute ago   Up 44 seconds   0.0.0.0:9901->9901/tcp, :::9901->9901/tcp, 0.0.0.0:80->10000/tcp, :::80->10000/tcp   proxy-eds

根據(jù)上面的 EDS 配置,Envoy 將把所有的流量都發(fā)送到 192.168.215.3 這一個(gè)節(jié)點(diǎn)上去,我們可以使用 curl localhost 來測(cè)試下:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ curl localhost<h1>This request was processed by host: f9456b56f1ff</h1>$ curl localhost<h1>This request was processed by host: f9456b56f1ff</h1>

可以看到可以正常得到響應(yīng),而且都是由 f9456b56f1ff 這個(gè)容器來處理的請(qǐng)求。現(xiàn)在我們來嘗試更新上面的 EDS 配置添加上另外的一個(gè)節(jié)點(diǎn),觀察 Envoy 代理是否會(huì)自動(dòng)生效。CHx28資訊網(wǎng)——每日最新資訊28at.com

由于我們這里使用的是 EDS 動(dòng)態(tài)配置,所以當(dāng)我們要擴(kuò)展上游服務(wù)的時(shí)候,只需要將新的端點(diǎn)添加到上面我們指定的 eds.yaml 配置文件中即可,然后 Envoy 就會(huì)自動(dòng)將新添加的端點(diǎn)包含進(jìn)來。用上面同樣的方式添加 192.168.215.4 這個(gè)端點(diǎn),eds.yaml 內(nèi)容如下所示:CHx28資訊網(wǎng)——每日最新資訊28at.com

resources:  - "@type": type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment    cluster_name: localservices # 集群的名稱,如果在集群 eds_cluster_config 中指定,這將是 service_name 值。    endpoints:      - lb_endpoints:          - endpoint:              address:                socket_address:                  address: 192.168.215.3                  port_value: 80          - endpoint:              address:                socket_address:                  address: 192.168.215.4                  port_value: 80

更新后,正常情況下 Envoy 就會(huì)自動(dòng)重新加載配置并將新的端點(diǎn)添加到負(fù)載均衡中去,這個(gè)時(shí)候我們?cè)賮碓L問代理:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ curl localhost<h1>This request was processed by host: 2135ba4e10c9</h1>$ curl localhost<h1>This request was processed by host: f9456b56f1ff</h1>

可以看到已經(jīng)可以自動(dòng)訪問到另外的端點(diǎn)去了。CHx28資訊網(wǎng)——每日最新資訊28at.com

我在測(cè)試階段發(fā)現(xiàn)在 Mac 系統(tǒng)下面并沒有自動(dòng)熱加載,在 Linux 系統(tǒng)下面是可以正常重新加載的。CHx28資訊網(wǎng)——每日最新資訊28at.com

CDS 配置

現(xiàn)在已經(jīng)配置好了 EDS,接下來我們就可以去擴(kuò)大上游集群的規(guī)模了,如果我們想要能夠動(dòng)態(tài)添加新的域名和集群,就需要實(shí)現(xiàn)集群發(fā)現(xiàn)服務(wù)(CDS)API,在下面的示例中,我們將配置集群發(fā)現(xiàn)服務(wù)(CDS)和監(jiān)聽器發(fā)現(xiàn)服務(wù)(LDS)來進(jìn)行動(dòng)態(tài)配置。CHx28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建一個(gè)名為 cds.yaml 的文件來配置集群服務(wù)發(fā)現(xiàn)的數(shù)據(jù),文件內(nèi)容如下所示:CHx28資訊網(wǎng)——每日最新資訊28at.com

resources:  - "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster    name: targetCluster    connect_timeout: 0.25s    lb_policy: ROUND_ROBIN    type: EDS    eds_cluster_config:      service_name: localservices      eds_config:        path: /etc/envoy/eds.yaml

此外,還需要?jiǎng)?chuàng)建一個(gè)名為 lds.yaml 的文件來放置監(jiān)聽器的配置,文件內(nèi)容如下所示:CHx28資訊網(wǎng)——每日最新資訊28at.com

resources:  - "@type": type.googleapis.com/envoy.config.listener.v3.Listener    name: listener_0 # 監(jiān)聽器的名稱    address:      socket_address:        address: 0.0.0.0 # 監(jiān)聽器的地址        port_value: 10000 # 監(jiān)聽器的端口    filter_chains:      - filters:          - name: envoy.filterswork.http_connection_manager            typed_config:              "@type": type.googleapis.com/envoy.extensions.filterswork.http_connection_manager.v3.HttpConnectionManager              stat_prefix: ingress_http              access_log:                - name: envoy.access_loggers.stdout                  typed_config:                    "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog              http_filters: # 定義http過濾器鏈                - name: envoy.filters.http.router # 調(diào)用7層的路由過濾器                  typed_config:                    "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router              route_config:                name: local_route                virtual_hosts:                  - name: backend                    domains: ["*"]                    routes:                      - match:                          prefix: "/"                        route:                          cluster: targetCluster

仔細(xì)觀察可以發(fā)現(xiàn) cds.yaml 和 lds.yaml 配置文件的內(nèi)容基本上和之前的靜態(tài)配置文件一致的。我們這里只是將集群和監(jiān)聽器拆分到外部文件中去,這個(gè)時(shí)候我們需要修改 Envoy 的配置來引用這些文件,我們可以通過將 static_resources 更改為 dynamic_resources 來進(jìn)行配置。CHx28資訊網(wǎng)——每日最新資訊28at.com

重新新建一個(gè) Envoy 配置文件,命名為 envoy-dynamic.yaml,內(nèi)容如下所示:CHx28資訊網(wǎng)——每日最新資訊28at.com

# envoy-dynamic.yamlnode:  id: envoy_eds_id  cluster: youdianzhishi_clusteradmin:  access_log_path: "/dev/null"  address:    socket_address:      address: 0.0.0.0      port_value: 9901dynamic_resources: # 動(dòng)態(tài)配置  lds_config:    path: "/etc/envoy/lds.yaml"  cds_config:    path: "/etc/envoy/cds.yaml"

然后使用上面的配置文件重新啟動(dòng)一個(gè)新的 Envoy 代理,命令如下所示:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ docker run --name=proxy-xds -d /    -p 9901:9901 /    -p 80:10000 /    -v $(pwd)/manifests/3.Envoy:/etc/envoy /    -v $(pwd)/manifests/3.Envoy/envoy-dynamic.yaml:/etc/envoy/envoy.yaml /    envoyproxy/envoy:v1.28.0

啟動(dòng)完成后,同樣可以訪問 Envoy 代理來測(cè)試是否生效了:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ curl localhostcurl localhost<h1>This request was processed by host: 4ee790db09db</h1>$ curl localhost<h1>This request was processed by host: f9456b56f1ff</h1>

現(xiàn)在我們?cè)倩谏厦媾渲玫?nbsp;CDS、LDS、EDS 的配置來動(dòng)態(tài)添加一個(gè)新的集群。比如添加一個(gè)名為 newTargetCluster 的集群,內(nèi)容如下所示:CHx28資訊網(wǎng)——每日最新資訊28at.com

# cds.yamlresources:  - "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster    name: targetCluster    connect_timeout: 0.25s    lb_policy: ROUND_ROBIN    type: EDS    eds_cluster_config:      service_name: localservices      eds_config:        path: /etc/envoy/eds.yaml  - "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster    name: newTargetCluster    connect_timeout: 0.25s    lb_policy: ROUND_ROBIN    type: EDS    eds_cluster_config:      service_name: localservices      eds_config:        path: /etc/envoy/eds-1.yaml

上面我們新增了一個(gè)新的集群,對(duì)應(yīng)的 eds_config 配置文件是 eds-1.yaml,所以我們同樣需要去創(chuàng)建該文件去配置新的端點(diǎn)服務(wù)數(shù)據(jù),內(nèi)容如下所示:CHx28資訊網(wǎng)——每日最新資訊28at.com

resources:  - "@type": type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment    cluster_name: localservices # 集群的名稱,如果在集群 eds_cluster_config 中指定,這將是 service_name 值。    endpoints:      - lb_endpoints:          - endpoint:              address:                socket_address:                  address: 192.168.215.5                  port_value: 80          - endpoint:              address:                socket_address:                  address: 192.168.215.6                  port_value: 80

這個(gè)時(shí)候新的集群添加上了,但是還沒有任何路由來使用這個(gè)新集群,我們可以在 lds.yaml 中去配置,將之前配置的 targetCluster 替換成 newTargetCluster。CHx28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然同樣我們這里還需要運(yùn)行兩個(gè)簡(jiǎn)單的 HTTP 服務(wù)來作為上游服務(wù)提供服務(wù),執(zhí)行如下所示的命令:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ docker run -d cnych/docker-http-server; docker run -d cnych/docker-http-server;

這個(gè)時(shí)候 Envoy 應(yīng)該就會(huì)自動(dòng)重新加載并添加新的集群,我們同樣可以執(zhí)行 curl localhost 命令來驗(yàn)證:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ curl localhost<h1>This request was processed by host: 5f43efcb9432</h1>$ curl localhost<h1>This request was processed by host: 4986b39d716f</h1>

可以看到已經(jīng)變成了新的兩個(gè)端點(diǎn)數(shù)據(jù)了,證明我們這里基于文件的 xDS 動(dòng)態(tài)配置已經(jīng)生效了。CHx28資訊網(wǎng)——每日最新資訊28at.com

基于 API 的動(dòng)態(tài)配置

當(dāng)在 Envoy 配置中定義了上游集群后,Envoy 需要知道如何解析集群成員,這就是服務(wù)發(fā)現(xiàn)。端點(diǎn)發(fā)現(xiàn)服務(wù)(EDS)是 Envoy 基于 gRPC 或者用來獲取集群成員的 REST-JSON API 服務(wù)的 xDS 管理服務(wù)。在本節(jié)我們將學(xué)習(xí)如何使用 REST-JSON API 來配置端點(diǎn)的自動(dòng)發(fā)現(xiàn)。CHx28資訊網(wǎng)——每日最新資訊28at.com

在前面的章節(jié)中,我們使用文件來定義了靜態(tài)和動(dòng)態(tài)配置,在這里我們將介紹另外一種方式來進(jìn)行動(dòng)態(tài)配置:API 動(dòng)態(tài)配置。CHx28資訊網(wǎng)——每日最新資訊28at.com

Envoy 項(xiàng)目在 Java 和 Golang 中都提供了 EDS 和其他服務(wù)發(fā)現(xiàn)的 gRPC 實(shí)現(xiàn)參考。CHx28資訊網(wǎng)——每日最新資訊28at.com

REST-JSON 服務(wù)

接下來我們將更改配置來使用 EDS,從而允許基于來自 REST-JSON API 服務(wù)的數(shù)據(jù)進(jìn)行動(dòng)態(tài)添加節(jié)點(diǎn)。CHx28資訊網(wǎng)——每日最新資訊28at.com

EDS 配置

下面是提供的一個(gè) Envoy 配置的初始配置 envoy.yaml,文件內(nèi)容如下所示:CHx28資訊網(wǎng)——每日最新資訊28at.com

# envoy.yamladmin:  access_log_path: /tmp/admin_access.log  address:    socket_address:      address: 0.0.0.0      port_value: 9901static_resources:  listeners:    - name: listener_0 # 監(jiān)聽器的名稱      address:        socket_address:          address: 0.0.0.0 # 監(jiān)聽器的地址          port_value: 10000 # 監(jiān)聽器的端口      filter_chains:        - filters:            - name: envoy.filterswork.http_connection_manager              typed_config:                "@type": type.googleapis.com/envoy.extensions.filterswork.http_connection_manager.v3.HttpConnectionManager                stat_prefix: ingress_http                access_log:                  - name: envoy.access_loggers.stdout                    typed_config:                      "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog                http_filters: # 定義http過濾器鏈                  - name: envoy.filters.http.router # 調(diào)用7層的路由過濾器                    typed_config:                      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router                route_config:                  name: local_route                  virtual_hosts:                    - name: backend                      domains: ["*"]                      routes:                        - match:                            prefix: "/"                          route:                            cluster: targetCluster

接下來需要添加一個(gè) EDS 類型的集群配置,并在 eds_config 中配置使用 REST API:CHx28資訊網(wǎng)——每日最新資訊28at.com

clusters:  - name: targetCluster    type: EDS    connect_timeout: 0.25s    eds_cluster_config:      service_name: myservice      eds_config:        resource_api_version: V3 # xDS資源的API版本,支持 AUTO、V2、V3,如果未指定,默認(rèn)為 v2。        api_config_source: # api_config_source的數(shù)據(jù)來自于 xDS API Server,即 Management Server。          api_type: REST          cluster_names: [xds_cluster] # 該字段只用于REST,cluster_names 的集群必須是靜態(tài)定義的,其類型不能是EDS。          transport_api_version: V3          refresh_delay: 5s

上面配置中我們使用 api_config_source 來使用 REST API 的配置,其中 api_type 屬性指定了使用 REST API,cluster_names 屬性指定了使用 xds_cluster 這個(gè)集群來獲取數(shù)據(jù),refresh_delay 屬性指定了刷新間隔時(shí)間,這里我們?cè)O(shè)置為 5 秒。CHx28資訊網(wǎng)——每日最新資訊28at.com

然后需要定義 xds_cluster 的解析方式,這里我們可以使用靜態(tài)配置:CHx28資訊網(wǎng)——每日最新資訊28at.com

- name: xds_cluster  type: STATIC  connect_timeout: 0.25s  load_assignment:    cluster_name: xds_cluster    endpoints:      - lb_endpoints:          - endpoint:              address:                socket_address:                  address: 192.168.0.112                  port_value: 8080

然后同樣啟動(dòng)一個(gè) Envoy 代理實(shí)例來進(jìn)行測(cè)試:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ docker run --name=api-eds -d /    -p 9901:9901 /    -p 80:10000 /    -v $(pwd)/manifests/4.Envoy:/etc/envoy /    envoyproxy/envoy:v1.28.0

然后啟動(dòng)一個(gè)如下所示的上游端點(diǎn)服務(wù):CHx28資訊網(wǎng)——每日最新資訊28at.com

$ docker run -p 8081:8081 -d -e EDS_SERVER_PORT='8081' cnych/docker-http-server:v4

啟動(dòng)完成后我們可以使用如下命令來測(cè)試上游的端點(diǎn)服務(wù):CHx28資訊網(wǎng)——每日最新資訊28at.com

$ curl http://localhost:8081 -iHTTP/1.0 200 OKContent-Type: text/html; charset=utf-8Content-Length: 36Server: Werkzeug/0.15.4 Python/2.7.16Date: Fri, 27 Oct 2023 06:58:29 GMT4caf19d5-6765-470b-a95c-a3615aea9796

現(xiàn)在我們啟動(dòng)了 Envoy 代理和上游的服務(wù)集群,但是由于我們這里啟動(dòng)的服務(wù)并不是 xds_cluster 中配置的服務(wù),所以還沒有連接它們。這個(gè)時(shí)候我們?nèi)ゲ榭?Envoy 代理得日志,可以看到如下所示的一些錯(cuò)誤:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ docker logs -f api-eds[2023-10-27 08:43:48.964][1][warning][config] [source/extensions/config_subscription/rest/http_subscription_impl.cc:120] REST update for /v3/discovery:endpoints failed......

啟動(dòng) EDS 服務(wù)

為了讓 Envoy 獲取端點(diǎn)服務(wù),我們需要啟動(dòng) xds_cluster,我們這里將使用 python 實(shí)現(xiàn)的一個(gè) REST-JSON 的管理服務(wù),代碼如下所示:CHx28資訊網(wǎng)——每日最新資訊28at.com

# server.pyfrom flask import Flask, request, jsonifyimport uuidapp = Flask(__name__)# 存儲(chǔ) endpoints 的數(shù)據(jù)庫(kù)endpoints_db = {}@app.route('/endpoints', methods=['POST'])def add_endpoint():    data = request.get_json()    endpoint_id = str(uuid.uuid4())    endpoints_db[endpoint_id] = data    return jsonify({"id": endpoint_id}), 201@app.route('/v3/discovery:endpoints', methods=['POST'])def discovery_endpoints():    xds_response = {  # 構(gòu)造 xDS v3 EDS 響應(yīng)格式        "version_info": "0",        "resources": [            {"@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment",             "cluster_name": "myservice",             "endpoints": [{"lb_endpoints": [{"endpoint": {"address": {"socket_address": endpoint}}}                                              for endpoint in endpoints_db.values()]}]             }        ],        "type_url": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment",        "nonce": "0"    }    return jsonify(xds_response)if __name__ == '__main__':    app.run(host="0.0.0.0", port=8080, debug=True)

上面的代碼中我們使用 Flask 實(shí)現(xiàn)了一個(gè) /v3/discovery:endpoints 的 POST 接口,這個(gè)是 Envoy 用來請(qǐng)求發(fā)現(xiàn) Endpoints 端點(diǎn)的接口,需要注意的是該接口必須返回 DiscoveryResponse 協(xié)議格式的數(shù)據(jù),我們這里就是組裝一個(gè) ClusterLoadAssignment。CHx28資訊網(wǎng)——每日最新資訊28at.com

我們這里直接在本地啟動(dòng)(當(dāng)然也可以打包成 Docker 鏡像在容器中啟動(dòng)):CHx28資訊網(wǎng)——每日最新資訊28at.com

$ python server.py * Serving Flask app 'server' * Debug mode: onWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:8080 * Running on http://192.168.0.112:8080Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 131-555-179

要注意前面配置的 xds_cluster 的地址和端口要和上面的服務(wù)一致,并要能夠訪問到。CHx28資訊網(wǎng)——每日最新資訊28at.com

然后我們就可以將上游的服務(wù)配置添加到 EDS 服務(wù)中去了,這樣可以讓 Envoy 來自動(dòng)發(fā)現(xiàn)上游服務(wù)。上面的管理服務(wù)中我們定義了一個(gè) /endpoints 的添加端點(diǎn)的接口,我們只需要將要添加的端點(diǎn)提交給這個(gè)接口即可,然后在發(fā)現(xiàn)接口里面會(huì)自動(dòng)獲取添加的端點(diǎn),然后 Envoy 就可以動(dòng)態(tài)感知到了。CHx28資訊網(wǎng)——每日最新資訊28at.com

$ curl --location --request POST 'http://localhost:8080/endpoints' /--header 'Content-Type: application/json' /--data-raw '{    "address": "192.168.215.7",    "port_value": 8081}'

由于我們已經(jīng)啟動(dòng)了上面注冊(cè)的上游服務(wù),所以現(xiàn)在我們可以通過 Envoy 代理訪問到它了:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ curl -i http://localhostHTTP/1.1 200 OKcontent-type: text/html; charset=utf-8content-length: 36server: envoydate: Fri, 27 Oct 2023 09:02:07 GMTx-envoy-upstream-service-time: 84caf19d5-6765-470b-a95c-a3615aea9796

接下來我們?cè)谏嫌渭褐羞\(yùn)行更多的節(jié)點(diǎn),并調(diào)用 API 來進(jìn)行動(dòng)態(tài)注冊(cè),使用如下所示的命令來向上游集群再添加 4 個(gè)節(jié)點(diǎn):CHx28資訊網(wǎng)——每日最新資訊28at.com

for i in 8082 8083 8084 8085  do    docker run -d -e EDS_SERVER_PORT=$i cnych/docker-http-server:v4;    sleep .5done

然后將上面的 4 個(gè)節(jié)點(diǎn)注冊(cè)到 EDS 服務(wù)上面去,同樣使用如下所示的 API 接口調(diào)用:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ curl --location --request POST 'http://localhost:8080/endpoints' /--header 'Content-Type: application/json' /--data-raw '{    "address": "192.168.215.8",    "port_value": 8082}'$ curl --location --request POST 'http://localhost:8080/endpoints' /--header 'Content-Type: application/json' /--data-raw '{    "address": "192.168.215.9",    "port_value": 8083}'$ curl --location --request POST 'http://localhost:8080/endpoints' /--header 'Content-Type: application/json' /--data-raw '{    "address": "192.168.215.10",    "port_value": 8084}'$ curl --location --request POST 'http://localhost:8080/endpoints' /--header 'Content-Type: application/json' /--data-raw '{    "address": "192.168.215.11",    "port_value": 8085}'

注冊(cè)成功后,我們可以通過如下所示的命令來驗(yàn)證網(wǎng)絡(luò)請(qǐng)求是否與注冊(cè)的節(jié)點(diǎn)之間是均衡的:CHx28資訊網(wǎng)——每日最新資訊28at.com

$ while true; do curl http://localhost; sleep .5; printf '/n'; done2a73139d-5929-4224-a227-a1aa560162df4caf19d5-6765-470b-a95c-a3615aea97964395d85c-a216-46e4-bed7-04cc122c19039a22d774-62aa-47cc-bc35-c592015e55804caf19d5-6765-470b-a95c-a3615aea97962a73139d-5929-4224-a227-a1aa560162df......

根據(jù)上面的輸出結(jié)果可以看到每次請(qǐng)求的服務(wù)是不同的響應(yīng),我們一共注冊(cè)了 5 個(gè)端點(diǎn)服務(wù)。CHx28資訊網(wǎng)——每日最新資訊28at.com

到這里我們就實(shí)現(xiàn)了基于 REST-JSON 方式的 EDS 動(dòng)態(tài)配置了,當(dāng)然在實(shí)際使用的時(shí)候,更多的時(shí)候會(huì)使用 gRPC 的方式來實(shí)現(xiàn)管理服務(wù),這樣可以實(shí)現(xiàn)流式的數(shù)據(jù)傳輸,更加高效,可以查看官方提供的 go-control-plane 示例了解如何實(shí)現(xiàn)(https://github.com/envoyproxy/go-control-plane/blob/main/internal/example/server.go)。CHx28資訊網(wǎng)——每日最新資訊28at.com

gRPC xDS 服務(wù)相比 REST-JSON xDS 服務(wù),通常更為復(fù)雜一些,因?yàn)?gRPC 是基于 HTTP/2 的,并且使用 Protocol Buffers 作為序列化協(xié)議。CHx28資訊網(wǎng)——每日最新資訊28at.com

首先我們需要定義一個(gè) gRPC 服務(wù)來實(shí)現(xiàn) xDS API。可以從 Envoy 的 data-plane-api(https://github.com/envoyproxy/data-plane-api/blob/main/envoy/service/endpoint/v3/eds.proto) 獲取 .proto 文件,然后可以使用 protoc 編譯器生成 Python 代碼,然后就可以去實(shí)現(xiàn)具體的業(yè)務(wù)邏輯了,比如 istio 就類似這種方式。CHx28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-15765-0.htmlEnvoy 基于文件和 API 的動(dòng)態(tài)配置方式

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 微服務(wù)之負(fù)載均衡使用場(chǎng)景

下一篇: Spring事務(wù)的傳播機(jī)制

標(biāo)簽:
  • 熱門焦點(diǎn)
Top