日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Istio 网关中的 Gateway 和 VirtualService 配置深度解析

發(fā)布時(shí)間:2024/4/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Istio 网关中的 Gateway 和 VirtualService 配置深度解析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文鏈接:請(qǐng)求都去哪了?

通過(guò)前幾篇文章的學(xué)習(xí)與實(shí)踐,我們對(duì) Gateway、VirtualService 和 Destinationrule 的概念和原理有了初步的認(rèn)知,本篇將對(duì)這幾個(gè)對(duì)象資源的配置文件進(jìn)行深度地解析,具體細(xì)節(jié)將會(huì)深入到每一個(gè)配置項(xiàng)與 Envoy 配置項(xiàng)的映射關(guān)系。

在開(kāi)始之前,需要先搞清楚我們創(chuàng)建的這些對(duì)象資源最后都交給誰(shuí)來(lái)處理了,負(fù)責(zé)處理這些資源的就是 pilot。

1. pilot總體架構(gòu)

首先我們回顧一下 pilot 總體架構(gòu),上面是官方關(guān)于pilot的架構(gòu)圖,因?yàn)槭?old_pilot_repo 目錄下,可能與最新架構(gòu)有出入,僅供參考。所謂的 pilot 包含兩個(gè)組件:pilot-agent 和 pilot-discovery。圖里的 agent 對(duì)應(yīng) pilot-agent 二進(jìn)制,proxy 對(duì)應(yīng) Envoy 二進(jìn)制,它們兩個(gè)在同一個(gè)容器中,discovery service 對(duì)應(yīng) pilot-discovery 二進(jìn)制,在另外一個(gè)跟應(yīng)用分開(kāi)部署的單獨(dú)的 Deployment 中。

  • discovery service : 從 Kubernetes apiserver list/watch service、endpoint、pod、node 等資源信息,監(jiān)聽(tīng) istio 控制平面配置信息(如VirtualService、DestinationRule等), 翻譯為 Envoy 可以直接理解的配置格式。
  • proxy : 也就是 Envoy,直接連接 discovery service,間接地從 Kubernetes 等服務(wù)注冊(cè)中心獲取集群中微服務(wù)的注冊(cè)情況。
  • agent : 生成 Envoy 配置文件,管理 Envoy 生命周期。
  • service A/B : 使用了 Istio 的應(yīng)用,如 Service A/B,的進(jìn)出網(wǎng)絡(luò)流量會(huì)被 proxy 接管。

簡(jiǎn)單來(lái)說(shuō) Istio 做為管理面,集合了配置中心和服務(wù)中心兩個(gè)功能,并把配置發(fā)現(xiàn)和服務(wù)發(fā)現(xiàn)以一組統(tǒng)一的 xDS 接口提供出來(lái),數(shù)據(jù)面的 Envoy 通過(guò) xDS 獲取需要的信息來(lái)做服務(wù)間通信和服務(wù)治理。

2. pilot-discovery 為 Envoy 提供的 xds 服務(wù)

所謂 xds

pilot-discovery 為數(shù)據(jù)面(運(yùn)行在 sidecar 中的 Envoy 等 proxy 組件)提供控制信息服務(wù),也就是所謂的 discovery service 或者 xds 服務(wù)。這里的 x 是一個(gè)代詞,類(lèi)似云計(jì)算里的 XaaS 可以指代 IaaS、PaaS、SaaS 等。在 Istio 中,xds 包括 cds(cluster discovery service)、lds(listener discovery service)、rds(route discovery service)、eds(endpoint discovery service),而 ads(aggregated discovery service) 是對(duì)這些服務(wù)的一個(gè)統(tǒng)一封裝。

以上 cluster、endpoint、route 等概念的詳細(xì)介紹和實(shí)現(xiàn)細(xì)節(jié)可以參考 Envoy 在社區(qū)推廣的 data plane api(github.com/envoyproxy/…),這里只做簡(jiǎn)單介紹:

  • endpoint : 一個(gè)具體的“應(yīng)用實(shí)例”,對(duì)應(yīng) ip 和端口號(hào),類(lèi)似 Kubernetes 中的一個(gè) Pod。
  • cluster : 一個(gè) cluster 是一個(gè)“應(yīng)用集群”,它對(duì)應(yīng)提供相同服務(wù)的一個(gè)或多個(gè) endpoint。cluster 類(lèi)似 Kubernetes 中 Service 的概念,即一個(gè) Kubernetes Service 對(duì)應(yīng)一個(gè)或多個(gè)用同一鏡像啟動(dòng),提供相同服務(wù)的 Pod。
  • route : 當(dāng)我們做灰度發(fā)布、金絲雀發(fā)布時(shí),同一個(gè)服務(wù)會(huì)同時(shí)運(yùn)行多個(gè)版本,每個(gè)版本對(duì)應(yīng)一個(gè) cluster。這時(shí)需要通過(guò) route 規(guī)則規(guī)定請(qǐng)求如何路由到其中的某個(gè)版本的 cluster 上。

以上這些內(nèi)容實(shí)際上都是對(duì) Envoy 等 proxy 的配置信息,而所謂的 cluster discovery service、route discovery service 等 xxx discovery service 就是 Envoy 等從 pilot-discovery 動(dòng)態(tài)獲取 endpoint、cluster 等配置信息的協(xié)議和實(shí)現(xiàn)。為什么要做動(dòng)態(tài)配置加載,自然是為了使用 istioctl 等工具統(tǒng)一、靈活地配置 service mesh。至于如何通過(guò) istioctl 來(lái)查看 xds 信息,下文將會(huì)詳細(xì)介紹。

而為什么要用 ads 來(lái)“聚合”一系列 xds,并非僅為了在同一個(gè) gRPC 連接上實(shí)現(xiàn)多種 xds 來(lái)省下幾個(gè)網(wǎng)絡(luò)連接,ads 還有一個(gè)非常重要的作用是解決 cds、rds 信息更新順序依賴(lài)的問(wèn)題,從而保證以一定的順序同步各類(lèi)配置信息,這方面的討論可以詳見(jiàn) Envoy官網(wǎng)。

如何查看 xds

pilot-discovery 在初始化階段依次 init 了各種模塊,其中 discovery service 就是 xDS 相關(guān)實(shí)現(xiàn)。envoy API reference 可以查到 v1 和 v2 兩個(gè)版本的 API 文檔。envoy control plane 給了 v2 grpc 接口相關(guān)的數(shù)據(jù)結(jié)構(gòu)和接口。

那么如何查看 xds 的信息呢?雖然 v2 是 grpc 的接口,但是 pilot 提供了 InitDebug,可以通過(guò) debug 接口查詢(xún)服務(wù)和 routes 等服務(wù)和配置信息。

查看 eds

首先找到 Service istio-pilot 的 Cluster IP:

$ export PILOT_SVC_IP=$(kubectl -n istio-system get svc istio-pilot -o go-template='{{.spec.clusterIP}}') 復(fù)制代碼

然后查看 eds:

$ curl http://$PILOT_SVC_IP:8080/debug/edsz 復(fù)制代碼[{"clusterName": "outbound|9080||reviews.nino.svc.cluster.local","endpoints": [{"lbEndpoints": [{"endpoint": {"address": {"socketAddress": {"address": "10.244.0.56","portValue": 9080}}}}, {"endpoint": {"address": {"socketAddress": {"address": "10.244.0.58","portValue": 9080}}}}, {"endpoint": {"address": {"socketAddress": {"address": "10.244.2.25","portValue": 9080}}}}]}] }, {"clusterName": "outbound|9080|v3|reviews.nino.svc.cluster.local","endpoints": [{"lbEndpoints": [{"endpoint": {"address": {"socketAddress": {"address": "10.244.0.58","portValue": 9080}}}}]}] }] 復(fù)制代碼

查看 cds

$ curl http://$PILOT_SVC_IP:8080/debug/cdsz 復(fù)制代碼[{"node": "sidecar~172.30.104.45~fortio-deploy-56dcc85457-b2pkc.default~default.svc.cluster.local-10", "addr": "172.30.104.45:43876", "connect": "2018-08-07 06:31:08.161483005 +0000 UTC m=+54.337448884","Clusters":[{"name": "outbound|9080||details.default.svc.cluster.local","type": "EDS","edsClusterConfig": {"edsConfig": {"ads": {}},"serviceName": "outbound|9080||details.default.svc.cluster.local"},"connectTimeout": "1.000s","circuitBreakers": {"thresholds": [{}]} }, ... {"name": "outbound|9090||prometheus-k8s.monitoring.svc.cluster.local","type": "EDS","edsClusterConfig": {"edsConfig": {"ads": {}},"serviceName": "outbound|9090||prometheus-k8s.monitoring.svc.cluster.local"},"connectTimeout": "1.000s","circuitBreakers": {"thresholds": [{}]} }, {"name": "BlackHoleCluster","connectTimeout": "5.000s" }]} ] 復(fù)制代碼

查看 ads

$ curl http://$PILOT_SVC_IP:8080/debug/adsz 復(fù)制代碼

3. Envoy 基本術(shù)語(yǔ)回顧

為了讓大家更容易理解后面所講的內(nèi)容,先來(lái)回顧一下 Envoy 的基本術(shù)語(yǔ)。

  • Listener : 監(jiān)聽(tīng)器(listener)是服務(wù)(程序)監(jiān)聽(tīng)者,就是真正干活的。 它是可以由下游客戶(hù)端連接的命名網(wǎng)絡(luò)位置(例如,端口、unix域套接字等)。Envoy 公開(kāi)一個(gè)或多個(gè)下游主機(jī)連接的偵聽(tīng)器。一般是每臺(tái)主機(jī)運(yùn)行一個(gè) Envoy,使用單進(jìn)程運(yùn)行,但是每個(gè)進(jìn)程中可以啟動(dòng)任意數(shù)量的 Listener(監(jiān)聽(tīng)器),目前只監(jiān)聽(tīng) TCP,每個(gè)監(jiān)聽(tīng)器都獨(dú)立配置一定數(shù)量的(L3/L4)網(wǎng)絡(luò)過(guò)濾器。Listenter 也可以通過(guò) Listener Discovery Service(LDS)動(dòng)態(tài)獲取。
  • Listener filter : Listener 使用 listener filter(監(jiān)聽(tīng)器過(guò)濾器)來(lái)操作鏈接的元數(shù)據(jù)。它的作用是在不更改 Envoy 的核心功能的情況下添加更多的集成功能。Listener filter 的 API 相對(duì)簡(jiǎn)單,因?yàn)檫@些過(guò)濾器最終是在新接受的套接字上運(yùn)行。在鏈中可以互相銜接以支持更復(fù)雜的場(chǎng)景,例如調(diào)用速率限制。Envoy 已經(jīng)包含了多個(gè)監(jiān)聽(tīng)器過(guò)濾器。
  • Http Route Table : HTTP 的路由規(guī)則,例如請(qǐng)求的域名,Path 符合什么規(guī)則,轉(zhuǎn)發(fā)給哪個(gè) Cluster。
  • Cluster : 集群(cluster)是 Envoy 連接到的一組邏輯上相似的上游主機(jī)。Envoy 通過(guò)服務(wù)發(fā)現(xiàn)發(fā)現(xiàn)集群中的成員。Envoy 可以通過(guò)主動(dòng)運(yùn)行狀況檢查來(lái)確定集群成員的健康狀況。Envoy 如何將請(qǐng)求路由到集群成員由負(fù)載均衡策略確定。

更多詳細(xì)信息可以參考 Envoy 的架構(gòu)與基本術(shù)語(yǔ),本文重點(diǎn)突出 Listener、Route 和 Cluster 這三個(gè)基本術(shù)語(yǔ),同時(shí)需要注意流量經(jīng)過(guò)這些術(shù)語(yǔ)的先后順序,請(qǐng)求首先到達(dá) Listener,然后通過(guò) Http Route Table 轉(zhuǎn)到具體的 Cluster,最后由具體的 Cluster 對(duì)請(qǐng)求做出響應(yīng)。

4. Gateway 和 VirtualService 配置解析

還是拿之前 Istio 流量管理 這篇文章中的例子來(lái)解析吧,首先創(chuàng)建了一個(gè) Gateway,配置文件如下:

apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: ingressgateway # use istio default controller servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" 復(fù)制代碼

然后又創(chuàng)建了一個(gè) VirtualService:

apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo spec: hosts: - "*" gateways: - bookinfo-gateway http: - match: - uri: exact: /productpage - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products route: - destination: host: productpage port: number: 9080 復(fù)制代碼

VirtualService 映射的就是 Envoy 中的 Http Route Table,大家可以注意到上面的 VirtualService 配置文件中有一個(gè) gateways 字段,如果有這個(gè)字段,就表示這個(gè) Http Route Table 是綁在 ingressgateway 的 Listener 中的;如果沒(méi)有這個(gè)字段,就表示這個(gè) Http Route Table 是綁在 Istio 所管理的所有微服務(wù)應(yīng)用的 Pod 上的。

為了分清主次,我決定將本文拆分成兩篇文章來(lái)講解,本篇主要圍繞 ingressgateway 來(lái)解析 Gateway 和 VirtualService,而微服務(wù)應(yīng)用本身的 VirtualService 和 DestinationRule 解析放到下一篇文章再說(shuō)。

顯而易見(jiàn),上面這個(gè) VirtualService 映射的 Http Route Table 是被綁在 ingressgateway 中的,可以通過(guò) istioctl 來(lái)查看,istioctl 的具體用法請(qǐng)參考:調(diào)試 Envoy 和 Pilot。

首先查看 Listener 的配置項(xiàng):

$ istioctl -n istio-system pc listeners istio-ingressgateway-b6db8c46f-qcfks --port 80 -o json 復(fù)制代碼[{"name": "0.0.0.0_80","address": {"socketAddress": {"address": "0.0.0.0","portValue": 80}},"filterChains": [{"filters": [{"name": "envoy.http_connection_manager","config": {..."rds": {"config_source": {"ads": {}},"route_config_name": "http.80"},...}}]}]} ] 復(fù)制代碼

通過(guò) rds 配置項(xiàng)的 route_config_name 字段可以知道該 Listener 使用的 Http Route Table 的名字是 http.80。

查看 Http Route Table 配置項(xiàng):

$ istioctl -n istio-system pc routes istio-ingressgateway-b6db8c46f-qcfks --name http.80 -o json 復(fù)制代碼[{"name": "http.80","virtualHosts": [{"name": "bookinfo:80","domains": ["*"],"routes": [{"match": {"path": "/productpage"},"route": {"cluster": "outbound|9080||productpage.default.svc.cluster.local","timeout": "0.000s","maxGrpcTimeout": "0.000s"},...},...{"match": {"prefix": "/api/v1/products"},"route": {"cluster": "outbound|9080||productpage.default.svc.cluster.local","timeout": "0.000s","maxGrpcTimeout": "0.000s"},...},...]}],"validateClusters": false} ] 復(fù)制代碼
  • VirtualService 中的 hosts 字段對(duì)應(yīng) Http Route Table 中 virtualHosts 配置項(xiàng)的 domains 字段。這里表示可以使用任何域名來(lái)通過(guò) ingressgateway 訪(fǎng)問(wèn)服務(wù)(也可以直接通過(guò) IP 來(lái)訪(fǎng)問(wèn))。
  • VirtualService 中的 exact 字段對(duì)應(yīng) Http Route Table 中 routes.match 配置項(xiàng)的 path 字段。
  • VirtualService 中的 prefix 字段對(duì)應(yīng) Http Route Table 中 routes.match 配置項(xiàng)的 prefix 字段。
  • VirtualService 中的 route.destination 配置項(xiàng)對(duì)應(yīng) Http Route Table 中 routes.route 配置項(xiàng)的 cluster 字段。

關(guān)于 Envoy 中的 HTTP 路由解析可以參考我之前的文章:HTTP 路由解析。

查看 Cluster 配置項(xiàng):

$ istioctl -n istio-system pc clusters istio-ingressgateway-b6db8c46f-qcfks --fqdn productpage.default.svc.cluster.local --port 9080 -o json 復(fù)制代碼[{"name": "outbound|9080||productpage.default.svc.cluster.local","type": "EDS","edsClusterConfig": {"edsConfig": {"ads": {}},"serviceName": "outbound|9080||productpage.default.svc.cluster.local"},"connectTimeout": "1.000s","circuitBreakers": {"thresholds": [{}]}} ] 復(fù)制代碼

可以看到,Cluster 最終將集群外通過(guò) ingressgateway 發(fā)起的請(qǐng)求轉(zhuǎn)發(fā)給實(shí)際的 endpoint,也就是 Kubernetes 集群中的 Service productpage 下面的 Pod(由 serviceName 字段指定)。

實(shí)際上 istioctl 正是通過(guò) pilot 的 xds 接口來(lái)查看 Listener 、Route 和 Cluster 等信息的。

好了,現(xiàn)在請(qǐng)求已經(jīng)轉(zhuǎn)交給 productpage 了,那么接下來(lái)這個(gè)請(qǐng)求將會(huì)如何走完整個(gè)旅程呢?請(qǐng)聽(tīng)下回分解!

5. 參考

  • Service Mesh深度學(xué)習(xí)系列(三)| istio源碼分析之pilot-discovery模塊分析(中)
  • 調(diào)試 Envoy 和 Pilot
  • Envoy 的架構(gòu)與基本術(shù)語(yǔ)

轉(zhuǎn)載于:https://juejin.im/post/5ca09524f265da30d561e8a4

與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的Istio 网关中的 Gateway 和 VirtualService 配置深度解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。