您好,登錄后才能下訂單哦!
得益于良好的模塊化設計,Istio的各個組件設計清晰,分工明確,幾個大的組件之間甚至可以獨立工作,所以接下來我們將逐一深入分析Istio的各個組件。本文首先詳細分析一下我們最常用的流量管理功能所對應的模塊——Pilot和Envoy。
Istio基本架構圖如下圖所示,網格東西向及南北向的流量控制,核心思路是由Pilot維護管理策略,并通過標準接口下發到Envoy Proxy中,由Envoy最終實現流量的轉發。
Istio服務網格邏輯上分為數據平面和控制平面:
其中與流量管理相關的主要包括控制層面的Pilot以及數據層面的Envoy Proxy。
Pilot的基本架構如下圖所示。
根據上圖,Pilot主要實現下述功能:
1.統一服務模型
統一服務模型主要功能是從底層平臺獲取服務相關信息以及通過RuleAPI定義的服務間流量規則,以kubernetes為例,統一服務模型從平臺上獲取注冊在Pod、Service、Node以及流量規則信息,獲取到各種信息后轉變成數據平面上可理解的數據格式存儲在Abstract Model中。
2. 標準數據平面API
獲取到各種服務信息以及流量規則之后,會通過該API下發到數據面的Sidecar中。
3. 業務DSL語言(Domain Speci?c Language)
SL語言提供了面向業務的高層抽象,可以被運維人員理解和使用。運維人員使用該DSL定義流量規則并下發到Pilot,這些規則被Pilot翻譯成數據面的配置,再通過標準API分發到Envoy實例,可以在運行期對微服務的流量進行控制和調整。
Pilot的規則DSL是采用K8S API Server中的Custom Resource (CRD)實現的,因此和其他資源類型如Service Pod Deployment的創建和使用方法類似,都可以用Kubectl進行創建。
通過運用不同的流量規則,可以對網格中微服務進行精細化的流量控制,如按版本分流,斷路器,故障注入,灰度發布等。
與Pilot相關的服務主要有兩個:
(1)Discovery Service
對應的docker為gcr.io/istio-release/pilot,進程為pilot-discovery,該組件的功能包括:
從Service Provider中獲取服務信息,除了這里主要介紹的Kubernetes之外,Istio還支持Consul作為Service Provider。
從Kubernetes API Server中獲取流量規則(Kubernetes CRD Resource)。
將服務信息和流量規則轉化為數據面可以理解的格式,通過標準的數據面API下發到網格中的各個Sidecar中。
(2)Kubernetes API Server
提供Pilot相關的CRD Resource的增、刪、改、查。和Pilot相關的CRD有以下幾種:
Virtualservice:用于定義路由規則,如根據來源或 Header 制定規則,或在不同服務版本之間分拆流量。
DestinationRule:定義目的服務的配置策略以及可路由子集。策略包括斷路?、負載均衡以及 TLS 等。
ServiceEntry:用 ServiceEntry 可以向Istio中加入附加的服務條目,以使網格內可以向Istio 服務網格之外的服務發出請求。
Gateway:為網格配置網關,以允許一個服務可以被網格外部訪問。
EnvoyFilter:可以為Envoy配置過濾?。由于Envoy已經支持Lua過濾?,因此可以通過EnvoyFilter啟用Lua過濾?,動態改變Envoy的過濾鏈行為。我之前一直在考慮如何才能動態擴展Envoy的能力,EnvoyFilter提供了很靈活的擴展性。
Istio通過K8s的Admission Webhook機制實現了sidecar的自動注入,Istio集群中的每個微服務會被加入Envoy相關的容?。下面是官方示例productpage微服務的Pod內容,可見除productpage之外,Istio還在該Pod中注入了兩個容?gcr.io/istio-release/proxy_init和gcr.io/istio-release/proxyv2。
1.初始化容器?proxy_init
Productpage的Pod中有一個InitContainer proxy_init,InitContrainer是K8S提供的機制,用于在Pod中執行一些初始化任務,在Initialcontainer執行完畢并退出后,才會啟動Pod中的其它container。
在proxy_init中執行iptables.sh腳本,該腳本的作用是通過配置iptable來劫持Pod中的流量。
2.運行時Sidecar容器?proxyv2
Envoy的大部分配置都是dynamic resource,包括網格中服務相關的service cluster, listener, route規則等。這些dynamic resource是通過xDS接口從Istio控制面中動態獲取的。但Envoy如何知道xDS server的地址呢?這是在Envoy初始化配置文件中以static resource的方式配置的。
在Proxyv2容器運行時,有兩個進程pilot-agent和envoy。
1)pilot-agent進程
該進程根據K8S API Server中的配置信息生成Envoy的配置文件,并負責啟動Envoy進程。注意Envoy的大部分配置信息都是通過xDS接口從Pilot中動態獲取的,因此Agent生成的只是用于初始化Envoy的少量靜態配置。
2)envoy進程
Envoy由Pilot-agent進程啟動,啟動后,Envoy讀取Pilot-agent為它生成的配置文件,然后根據該文件的配置獲取到Pilot的地址,通過數據面標準API的xDS接口從pilot拉取動態配置信息,包括路路由(route),監聽器?(listener),服務集群(cluster)和服務端點(endpoint)。Envoy初始化完成后,就根據這些配置信息對微服務間的通信進行尋址和路由。
數據面組件中涉及的概念比較多,這里列舉如下。
Envoy的配置包含兩部分,初始化配置和動態更新的配置。
1.Envoy初始配置
Pilot-agent進程根據啟動參數和K8S API Server中的配置信息生成Envoy的初始配置文件,并負責啟動Envoy進程。從ps命令輸出可以看到Pilot-agent在啟動Envoy進程時傳入了pilot地址和zipkin地址,并為Envoy生成了一個初始化配置文件envoy-rev0.json。
2.Envoy動態更新配置
通過管理接口獲取完整配置。從Envoy初始化配置文件中,我們可以大致看到Istio通過Envoy來實現服務發現和流量管理的基本原理。即控制面將xDS server信息通過static resource的方式配置到Envoy的初始化配置文件中,Envoy啟動后通過xDS server獲取到dynamic resource,包括網格中的service信息及路由規則。
詳細流程如下:
下圖表述了服務與服務之間通過sidecar進行交互的流程。
基本流程分析如下:
參考鏈接
https://zhaohuabing.com/post/2018-09-25-istio-traffic-management-impl-intro/
https://istio.io/zh/docs/concepts/what-is-istio/
https://www.cnblogs.com/xishuai/p/microservices-and-service-mesh.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。