得益于良好的模塊化設(shè)計(jì),Istio的各個(gè)組件設(shè)計(jì)清晰,分工明確,幾個(gè)大的組件之間甚至可以獨(dú)立工作,所以接下來(lái)我們將逐一深入分析Istio的各個(gè)組件。本文首先詳細(xì)分析一下我們最常用的流量管理功能所對(duì)應(yīng)的模塊——Pilot和Envoy。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),鳳陽(yáng)企業(yè)網(wǎng)站建設(shè),鳳陽(yáng)品牌網(wǎng)站建設(shè),網(wǎng)站定制,鳳陽(yáng)網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,鳳陽(yáng)網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
Istio基本架構(gòu)圖如下圖所示,網(wǎng)格東西向及南北向的流量控制,核心思路是由Pilot維護(hù)管理策略,并通過(guò)標(biāo)準(zhǔn)接口下發(fā)到Envoy Proxy中,由Envoy最終實(shí)現(xiàn)流量的轉(zhuǎn)發(fā)。
Istio服務(wù)網(wǎng)格邏輯上分為數(shù)據(jù)平面和控制平面:
其中與流量管理相關(guān)的主要包括控制層面的Pilot以及數(shù)據(jù)層面的Envoy Proxy。
Pilot的基本架構(gòu)如下圖所示。
根據(jù)上圖,Pilot主要實(shí)現(xiàn)下述功能:
1.統(tǒng)一服務(wù)模型
統(tǒng)一服務(wù)模型主要功能是從底層平臺(tái)獲取服務(wù)相關(guān)信息以及通過(guò)RuleAPI定義的服務(wù)間流量規(guī)則,以kubernetes為例,統(tǒng)一服務(wù)模型從平臺(tái)上獲取注冊(cè)在Pod、Service、Node以及流量規(guī)則信息,獲取到各種信息后轉(zhuǎn)變成數(shù)據(jù)平面上可理解的數(shù)據(jù)格式存儲(chǔ)在Abstract Model中。
2. 標(biāo)準(zhǔn)數(shù)據(jù)平面API
獲取到各種服務(wù)信息以及流量規(guī)則之后,會(huì)通過(guò)該API下發(fā)到數(shù)據(jù)面的Sidecar中。
3. 業(yè)務(wù)DSL語(yǔ)言(Domain Speci?c Language)
SL語(yǔ)言提供了面向業(yè)務(wù)的高層抽象,可以被運(yùn)維人員理解和使用。運(yùn)維人員使用該DSL定義流量規(guī)則并下發(fā)到Pilot,這些規(guī)則被Pilot翻譯成數(shù)據(jù)面的配置,再通過(guò)標(biāo)準(zhǔn)API分發(fā)到Envoy實(shí)例,可以在運(yùn)行期對(duì)微服務(wù)的流量進(jìn)行控制和調(diào)整。
Pilot的規(guī)則DSL是采用K8S API Server中的Custom Resource (CRD)實(shí)現(xiàn)的,因此和其他資源類型如Service Pod Deployment的創(chuàng)建和使用方法類似,都可以用Kubectl進(jìn)行創(chuàng)建。
通過(guò)運(yùn)用不同的流量規(guī)則,可以對(duì)網(wǎng)格中微服務(wù)進(jìn)行精細(xì)化的流量控制,如按版本分流,斷路器,故障注入,灰度發(fā)布等。
與Pilot相關(guān)的服務(wù)主要有兩個(gè):
(1)Discovery Service
對(duì)應(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ù)面可以理解的格式,通過(guò)標(biāo)準(zhǔn)的數(shù)據(jù)面API下發(fā)到網(wǎng)格中的各個(gè)Sidecar中。
(2)Kubernetes API Server
提供Pilot相關(guān)的CRD Resource的增、刪、改、查。和Pilot相關(guān)的CRD有以下幾種:
Virtualservice:用于定義路由規(guī)則,如根據(jù)來(lái)源或 Header 制定規(guī)則,或在不同服務(wù)版本之間分拆流量。
DestinationRule:定義目的服務(wù)的配置策略以及可路由子集。策略包括斷路?、負(fù)載均衡以及 TLS 等。
ServiceEntry:用 ServiceEntry 可以向Istio中加入附加的服務(wù)條目,以使網(wǎng)格內(nèi)可以向Istio 服務(wù)網(wǎng)格之外的服務(wù)發(fā)出請(qǐng)求。
Gateway:為網(wǎng)格配置網(wǎng)關(guān),以允許一個(gè)服務(wù)可以被網(wǎng)格外部訪問(wèn)。
EnvoyFilter:可以為Envoy配置過(guò)濾?。由于Envoy已經(jīng)支持Lua過(guò)濾?,因此可以通過(guò)EnvoyFilter啟用Lua過(guò)濾?,動(dòng)態(tài)改變Envoy的過(guò)濾鏈行為。我之前一直在考慮如何才能動(dòng)態(tài)擴(kuò)展Envoy的能力,EnvoyFilter提供了很靈活的擴(kuò)展性。
Istio通過(guò)K8s的Admission Webhook機(jī)制實(shí)現(xiàn)了sidecar的自動(dòng)注入,Istio集群中的每個(gè)微服務(wù)會(huì)被加入Envoy相關(guān)的容?。下面是官方示例productpage微服務(wù)的Pod內(nèi)容,可見(jiàn)除productpage之外,Istio還在該P(yáng)od中注入了兩個(gè)容?gcr.io/istio-release/proxy_init和gcr.io/istio-release/proxyv2。
1.初始化容器?proxy_init
Productpage的Pod中有一個(gè)InitContainer proxy_init,InitContrainer是K8S提供的機(jī)制,用于在Pod中執(zhí)行一些初始化任務(wù),在Initialcontainer執(zhí)行完畢并退出后,才會(huì)啟動(dòng)Pod中的其它c(diǎn)ontainer。
在proxy_init中執(zhí)行iptables.sh腳本,該腳本的作用是通過(guò)配置iptable來(lái)劫持Pod中的流量。
2.運(yùn)行時(shí)Sidecar容器?proxyv2
Envoy的大部分配置都是dynamic resource,包括網(wǎng)格中服務(wù)相關(guān)的service cluster, listener, route規(guī)則等。這些dynamic resource是通過(guò)xDS接口從Istio控制面中動(dòng)態(tài)獲取的。但Envoy如何知道xDS server的地址呢?這是在Envoy初始化配置文件中以static resource的方式配置的。
在Proxyv2容器運(yùn)行時(shí),有兩個(gè)進(jìn)程pilot-agent和envoy。
1)pilot-agent進(jìn)程
該進(jìn)程根據(jù)K8S API Server中的配置信息生成Envoy的配置文件,并負(fù)責(zé)啟動(dòng)Envoy進(jìn)程。注意Envoy的大部分配置信息都是通過(guò)xDS接口從Pilot中動(dòng)態(tài)獲取的,因此Agent生成的只是用于初始化Envoy的少量靜態(tài)配置。
2)envoy進(jìn)程
Envoy由Pilot-agent進(jìn)程啟動(dòng),啟動(dòng)后,Envoy讀取Pilot-agent為它生成的配置文件,然后根據(jù)該文件的配置獲取到Pilot的地址,通過(guò)數(shù)據(jù)面標(biāo)準(zhǔn)API的xDS接口從pilot拉取動(dòng)態(tài)配置信息,包括路路由(route),監(jiān)聽(tīng)器?(listener),服務(wù)集群(cluster)和服務(wù)端點(diǎn)(endpoint)。Envoy初始化完成后,就根據(jù)這些配置信息對(duì)微服務(wù)間的通信進(jìn)行尋址和路由。
數(shù)據(jù)面組件中涉及的概念比較多,這里列舉如下。
Envoy的配置包含兩部分,初始化配置和動(dòng)態(tài)更新的配置。
1.Envoy初始配置
Pilot-agent進(jìn)程根據(jù)啟動(dòng)參數(shù)和K8S API Server中的配置信息生成Envoy的初始配置文件,并負(fù)責(zé)啟動(dòng)Envoy進(jìn)程。從ps命令輸出可以看到Pilot-agent在啟動(dòng)Envoy進(jìn)程時(shí)傳入了pilot地址和zipkin地址,并為Envoy生成了一個(gè)初始化配置文件envoy-rev0.json。
2.Envoy動(dòng)態(tài)更新配置
通過(guò)管理接口獲取完整配置。從Envoy初始化配置文件中,我們可以大致看到Istio通過(guò)Envoy來(lái)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和流量管理的基本原理。即控制面將xDS server信息通過(guò)static resource的方式配置到Envoy的初始化配置文件中,Envoy啟動(dòng)后通過(guò)xDS server獲取到dynamic resource,包括網(wǎng)格中的service信息及路由規(guī)則。
詳細(xì)流程如下:
下圖表述了服務(wù)與服務(wù)之間通過(guò)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
本文標(biāo)題:深度解析Istio系列之流量控制篇
文章鏈接:http://chinadenli.net/article44/giehee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、手機(jī)網(wǎng)站建設(shè)、微信小程序、用戶體驗(yàn)、網(wǎng)站設(shè)計(jì)公司、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)