得益于良好的模塊化設(shè)計,Istio的各個組件設(shè)計清晰,分工明確,幾個大的組件之間甚至可以獨(dú)立工作,所以接下來我們將逐一深入分析Istio的各個組件。本文首先詳細(xì)分析一下我們最常用的流量管理功能所對應(yīng)的模塊——Pilot和Envoy。
創(chuàng)新互聯(lián)長期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為蔚縣企業(yè)提供專業(yè)的網(wǎng)站設(shè)計、做網(wǎng)站,蔚縣網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。Istio基本架構(gòu)圖如下圖所示,網(wǎng)格東西向及南北向的流量控制,核心思路是由Pilot維護(hù)管理策略,并通過標(biāo)準(zhǔn)接口下發(fā)到Envoy Proxy中,由Envoy最終實現(xiàn)流量的轉(zhuǎn)發(fā)。
Istio服務(wù)網(wǎng)格邏輯上分為數(shù)據(jù)平面和控制平面:
其中與流量管理相關(guān)的主要包括控制層面的Pilot以及數(shù)據(jù)層面的Envoy Proxy。
Pilot的基本架構(gòu)如下圖所示。
根據(jù)上圖,Pilot主要實現(xiàn)下述功能:
1.統(tǒng)一服務(wù)模型
統(tǒng)一服務(wù)模型主要功能是從底層平臺獲取服務(wù)相關(guān)信息以及通過RuleAPI定義的服務(wù)間流量規(guī)則,以kubernetes為例,統(tǒng)一服務(wù)模型從平臺上獲取注冊在Pod、Service、Node以及流量規(guī)則信息,獲取到各種信息后轉(zhuǎn)變成數(shù)據(jù)平面上可理解的數(shù)據(jù)格式存儲在Abstract Model中。
2. 標(biāo)準(zhǔn)數(shù)據(jù)平面API
獲取到各種服務(wù)信息以及流量規(guī)則之后,會通過該API下發(fā)到數(shù)據(jù)面的Sidecar中。
3. 業(yè)務(wù)DSL語言(Domain Speci?c Language)
SL語言提供了面向業(yè)務(wù)的高層抽象,可以被運(yùn)維人員理解和使用。運(yùn)維人員使用該DSL定義流量規(guī)則并下發(fā)到Pilot,這些規(guī)則被Pilot翻譯成數(shù)據(jù)面的配置,再通過標(biāo)準(zhǔn)API分發(fā)到Envoy實例,可以在運(yùn)行期對微服務(wù)的流量進(jìn)行控制和調(diào)整。
Pilot的規(guī)則DSL是采用K8S API Server中的Custom Resource (CRD)實現(xiàn)的,因此和其他資源類型如Service Pod Deployment的創(chuàng)建和使用方法類似,都可以用Kubectl進(jìn)行創(chuàng)建。
通過運(yùn)用不同的流量規(guī)則,可以對網(wǎng)格中微服務(wù)進(jìn)行精細(xì)化的流量控制,如按版本分流,斷路器,故障注入,灰度發(fā)布等。
與Pilot相關(guān)的服務(wù)主要有兩個:
(1)Discovery Service
對應(yīng)的docker為gcr.io/istio-release/pilot,進(jìn)程為pilot-discovery,該組件的功能包括:
從Service Provider中獲取服務(wù)信息,除了這里主要介紹的Kubernetes之外,Istio還支持Consul作為Service Provider。
從Kubernetes API Server中獲取流量規(guī)則(Kubernetes CRD Resource)。
將服務(wù)信息和流量規(guī)則轉(zhuǎn)化為數(shù)據(jù)面可以理解的格式,通過標(biāo)準(zhǔn)的數(shù)據(jù)面API下發(fā)到網(wǎng)格中的各個Sidecar中。
(2)Kubernetes API Server
提供Pilot相關(guān)的CRD Resource的增、刪、改、查。和Pilot相關(guān)的CRD有以下幾種:
Virtualservice:用于定義路由規(guī)則,如根據(jù)來源或 Header 制定規(guī)則,或在不同服務(wù)版本之間分拆流量。
DestinationRule:定義目的服務(wù)的配置策略以及可路由子集。策略包括斷路?、負(fù)載均衡以及 TLS 等。
ServiceEntry:用 ServiceEntry 可以向Istio中加入附加的服務(wù)條目,以使網(wǎng)格內(nèi)可以向Istio 服務(wù)網(wǎng)格之外的服務(wù)發(fā)出請求。
Gateway:為網(wǎng)格配置網(wǎng)關(guān),以允許一個服務(wù)可以被網(wǎng)格外部訪問。
EnvoyFilter:可以為Envoy配置過濾?。由于Envoy已經(jīng)支持Lua過濾?,因此可以通過EnvoyFilter啟用Lua過濾?,動態(tài)改變Envoy的過濾鏈行為。我之前一直在考慮如何才能動態(tài)擴(kuò)展Envoy的能力,EnvoyFilter提供了很靈活的擴(kuò)展性。
Istio通過K8s的Admission Webhook機(jī)制實現(xiàn)了sidecar的自動注入,Istio集群中的每個微服務(wù)會被加入Envoy相關(guān)的容?。下面是官方示例productpage微服務(wù)的Pod內(nèi)容,可見除productpage之外,Istio還在該P(yáng)od中注入了兩個容?gcr.io/istio-release/proxy_init和gcr.io/istio-release/proxyv2。
1.初始化容器?proxy_init
Productpage的Pod中有一個InitContainer proxy_init,InitContrainer是K8S提供的機(jī)制,用于在Pod中執(zhí)行一些初始化任務(wù),在Initialcontainer執(zhí)行完畢并退出后,才會啟動Pod中的其它c(diǎn)ontainer。
在proxy_init中執(zhí)行iptables.sh腳本,該腳本的作用是通過配置iptable來劫持Pod中的流量。
2.運(yùn)行時Sidecar容器?proxyv2
Envoy的大部分配置都是dynamic resource,包括網(wǎng)格中服務(wù)相關(guān)的service cluster, listener, route規(guī)則等。這些dynamic resource是通過xDS接口從Istio控制面中動態(tài)獲取的。但Envoy如何知道xDS server的地址呢?這是在Envoy初始化配置文件中以static resource的方式配置的。
在Proxyv2容器運(yùn)行時,有兩個進(jìn)程pilot-agent和envoy。
1)pilot-agent進(jìn)程
該進(jìn)程根據(jù)K8S API Server中的配置信息生成Envoy的配置文件,并負(fù)責(zé)啟動Envoy進(jìn)程。注意Envoy的大部分配置信息都是通過xDS接口從Pilot中動態(tài)獲取的,因此Agent生成的只是用于初始化Envoy的少量靜態(tài)配置。
2)envoy進(jìn)程
Envoy由Pilot-agent進(jìn)程啟動,啟動后,Envoy讀取Pilot-agent為它生成的配置文件,然后根據(jù)該文件的配置獲取到Pilot的地址,通過數(shù)據(jù)面標(biāo)準(zhǔn)API的xDS接口從pilot拉取動態(tài)配置信息,包括路路由(route),監(jiān)聽器?(listener),服務(wù)集群(cluster)和服務(wù)端點(diǎn)(endpoint)。Envoy初始化完成后,就根據(jù)這些配置信息對微服務(wù)間的通信進(jìn)行尋址和路由。
數(shù)據(jù)面組件中涉及的概念比較多,這里列舉如下。
Envoy的配置包含兩部分,初始化配置和動態(tài)更新的配置。
1.Envoy初始配置
Pilot-agent進(jìn)程根據(jù)啟動參數(shù)和K8S API Server中的配置信息生成Envoy的初始配置文件,并負(fù)責(zé)啟動Envoy進(jìn)程。從ps命令輸出可以看到Pilot-agent在啟動Envoy進(jìn)程時傳入了pilot地址和zipkin地址,并為Envoy生成了一個初始化配置文件envoy-rev0.json。
2.Envoy動態(tài)更新配置
通過管理接口獲取完整配置。從Envoy初始化配置文件中,我們可以大致看到Istio通過Envoy來實現(xiàn)服務(wù)發(fā)現(xiàn)和流量管理的基本原理。即控制面將xDS server信息通過static resource的方式配置到Envoy的初始化配置文件中,Envoy啟動后通過xDS server獲取到dynamic resource,包括網(wǎng)格中的service信息及路由規(guī)則。
詳細(xì)流程如下:
下圖表述了服務(wù)與服務(wù)之間通過sidecar進(jìn)行交互的流程。
基本流程分析如下:
參考鏈接
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
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。