Service Mesh開(kāi)源實(shí)現(xiàn)之Istio架構(gòu)概覽
本文轉(zhuǎn)載自微信公眾號(hào)「無(wú)敵碼農(nóng)」,作者無(wú)敵碼農(nóng)。轉(zhuǎn)載本文請(qǐng)聯(lián)系無(wú)敵碼農(nóng)眾號(hào)。
在之前關(guān)于Service Mesh(服務(wù)網(wǎng)格)的系列文章中,我們從實(shí)戰(zhàn)的角度分享了一些關(guān)于Istio的入門安裝、服務(wù)發(fā)現(xiàn)、熔斷限流及流量管理(灰度發(fā)布)等細(xì)節(jié)方面的內(nèi)容(可參考文末推薦閱讀)。
今天的文章將從更宏觀的概念和架構(gòu)入手,來(lái)全面介紹Istio這一最著名的服務(wù)網(wǎng)格開(kāi)源解決方案,以求從整體上將Istio實(shí)現(xiàn)服務(wù)網(wǎng)格的核心原理闡述清楚!
Istio中的關(guān)鍵概念
要學(xué)習(xí)Istio需要先明確以下幾個(gè)關(guān)鍵術(shù)語(yǔ)。
1.容器/容器鏡像
進(jìn)入到云原生時(shí)代(不了解云原生的概念可以參考《什么是云原生?》)的服務(wù)網(wǎng)格架構(gòu),應(yīng)用的發(fā)布、部署都是圍繞Kubernetes為代表的容器基礎(chǔ)設(shè)施展開(kāi)的。這就需要對(duì)容器及容器鏡像的概念有清晰的理解。
實(shí)際上,容器的普及要?dú)w功于Docker技術(shù)的流行,而從本質(zhì)上說(shuō)容器就是運(yùn)行在操作系統(tǒng)中的,受資源隔離限制的一組進(jìn)程,也稱為“容器運(yùn)行時(shí)”。它可以將用戶打包的代碼及其所賴的關(guān)系完整的還原出來(lái)。通過(guò)容器化運(yùn)行的應(yīng)用程序,可以更快、更可靠地運(yùn)行,而不受具體計(jì)算環(huán)境的影響。
容器鏡像,是容器化的重要介質(zhì)和載體。從形式上來(lái)說(shuō),它就是一個(gè)輕量級(jí)的、獨(dú)立的、可執(zhí)行的軟件包文件,包括了運(yùn)行應(yīng)用程序所需要的一切:代碼、工具、系統(tǒng)庫(kù)及各種設(shè)置。
容器技術(shù)的出現(xiàn),徹底顛覆了應(yīng)用構(gòu)建、發(fā)布及運(yùn)行的方式,目前已經(jīng)成為服務(wù)端應(yīng)用發(fā)布的事實(shí)標(biāo)準(zhǔn)。后續(xù)要聊到的Istio服務(wù)網(wǎng)格技術(shù),無(wú)論是“網(wǎng)格基礎(chǔ)組件”還是“應(yīng)用程序”,都是以容器的方式運(yùn)行在Kubernetes容器平臺(tái)之上的。
2.微服務(wù)
微服務(wù)是一種架構(gòu)風(fēng)格,它將一個(gè)龐大的單體服務(wù)拆分為一組松散耦合的微服務(wù)集合,該微服務(wù)集合提供了與單個(gè)單體應(yīng)用相同的功能。但微服務(wù)可以獨(dú)立于其他服務(wù)進(jìn)行獨(dú)立的開(kāi)發(fā)和部署。此外,微服務(wù)是圍繞業(yè)務(wù)能力組織的,可以由較小的團(tuán)隊(duì)擁有,因此,在開(kāi)發(fā)/部署上能夠?qū)崿F(xiàn)更小、更獨(dú)立的迭代。
目前主要的微服務(wù)架構(gòu)解決方案,以Spring Cloud為代表的微服務(wù)架構(gòu)體系是主流;但隨著云原生技術(shù)概念的流行,以Istio為代表的Service Mesh(服務(wù)網(wǎng)格)微服務(wù)架構(gòu)方案也在逐步得到推廣。
3.控制平面
在以Spring Cloud為代表的傳統(tǒng)微服務(wù)架構(gòu)中,應(yīng)用本身與服務(wù)治理邏輯是耦合在一起的。而在Service Mesh(服務(wù)網(wǎng)格)方案中,服務(wù)治理規(guī)則的管理、服務(wù)治理行為、應(yīng)用本身都是互相獨(dú)立,這就使得應(yīng)用可以專注于業(yè)務(wù),而服務(wù)治理邏輯則完全可以抽離出來(lái)由運(yùn)維團(tuán)隊(duì)進(jìn)行統(tǒng)一的管理。
像這種專門負(fù)責(zé)服務(wù)治理規(guī)則管理的邏輯或組件,在Service Mesh(服務(wù)網(wǎng)格)架構(gòu)中就叫做“控制平面“。“控制平面”主要由API和工具組成,用于管理服務(wù)治理行為(數(shù)據(jù)平面)。服務(wù)網(wǎng)格運(yùn)維人員可以操控控制平面,以配置服務(wù)網(wǎng)格中的數(shù)據(jù)平面行為。例如,將流量配置作用于控制平面——翻譯配置并將其推送到數(shù)據(jù)平面。
4.數(shù)據(jù)平面
在Service Mesh(服務(wù)網(wǎng)格)中,數(shù)據(jù)平面就是具體實(shí)現(xiàn)服務(wù)治理行為的代理。在Istio中數(shù)據(jù)平面由負(fù)責(zé)路由、負(fù)載均衡、服務(wù)發(fā)現(xiàn)、健康檢查和授權(quán)/認(rèn)證的Envoy代理組成。這些代理在每個(gè)服務(wù)實(shí)例的旁邊運(yùn)行(在k8s中,與應(yīng)用容器運(yùn)行在同一個(gè)Pod),攔截所有傳入和傳出的用戶流量,并在這一過(guò)程中根據(jù)控制平面下發(fā)的服務(wù)治理規(guī)則進(jìn)行流量管理。
5.Envoy
在Istio中,數(shù)據(jù)平面就是由Envoy代理實(shí)現(xiàn)的。它是一個(gè)現(xiàn)代的、高性能邊緣的小型L7代理。Envoy是為大型現(xiàn)代微服務(wù)架構(gòu)設(shè)計(jì)的,可以與Nginx和HAProxy等負(fù)載均衡器相匹配。
6.代理
在網(wǎng)絡(luò)中,代理是一個(gè)中間服務(wù)器,位于客戶端和服務(wù)端之間,可以管理請(qǐng)求和響應(yīng)。在Istio服務(wù)網(wǎng)格情況下,代理(Envoy)運(yùn)行在每個(gè)應(yīng)用實(shí)例的前面。當(dāng)向應(yīng)用程序發(fā)起請(qǐng)求時(shí),代理(Envoy)會(huì)攔截該請(qǐng)求,并將其轉(zhuǎn)發(fā)給應(yīng)用程序?qū)嵗?。同樣地,?dāng)應(yīng)用程序?qū)嵗噲D發(fā)出請(qǐng)求時(shí),代理(Envoy)也會(huì)攔截出站請(qǐng)求并將其發(fā)送到目的地。
由于代理(Envoy)攔截了所有請(qǐng)求,所以它可以修改請(qǐng)求,從而實(shí)現(xiàn)流量路由、故障注入、授權(quán)等功能。
7.L7代理
L7(第7層)代理在OSI模型的應(yīng)用層工作。在這一層,代理可以處理每個(gè)請(qǐng)求的內(nèi)容。例如Http就是一個(gè)流行的L7協(xié)議。因?yàn)榭梢栽L問(wèn)請(qǐng)求的數(shù)據(jù),所以L7代理(Envoy)就可以根據(jù)請(qǐng)求的內(nèi)容(URL、Cookies等)做出負(fù)載均衡的決定。
Istio的架構(gòu)及模塊組成
Service Mesh(服務(wù)網(wǎng)格)的架構(gòu)方式為我們提供了一種統(tǒng)一的方式來(lái)連接、保護(hù)和觀察微服務(wù)。網(wǎng)格內(nèi)的代理(如Envoy)可以捕獲網(wǎng)格內(nèi)所有的通信請(qǐng)求和指標(biāo)——每一次失敗或成功的調(diào)用、重試或超時(shí)的請(qǐng)求都可以被捕獲,并被可視化和報(bào)警。
這種將通信邏輯從業(yè)務(wù)和應(yīng)用邏輯中分離出來(lái)的架構(gòu)方式,可以使開(kāi)發(fā)人員專注于業(yè)務(wù)邏輯,而服務(wù)網(wǎng)格運(yùn)維人員則專注于服務(wù)網(wǎng)格配置。
前面通過(guò)對(duì)幾個(gè)關(guān)鍵術(shù)語(yǔ)的解釋,以及對(duì)服務(wù)網(wǎng)格架構(gòu)好處的介紹,相信大家或多或少理解了什么是服務(wù)網(wǎng)格。接下來(lái)將重點(diǎn)介紹Istio這一開(kāi)源的服務(wù)網(wǎng)格實(shí)現(xiàn)。
從宏觀上看,Istio主要支持以下功能:
1.流量管理
流量管理是Istio最核心的功能,通過(guò)配置,可以控制服務(wù)之間的流量——例如設(shè)置斷路器、超時(shí)或重試等服務(wù)治理機(jī)制,在Istio中都可以通過(guò)簡(jiǎn)單的配置改變來(lái)完成。
2.可觀察性
Istio可以通過(guò)跟蹤、監(jiān)控和記錄服務(wù)間的請(qǐng)求來(lái)更好地實(shí)現(xiàn)對(duì)服務(wù)的監(jiān)控,方便我們了解服務(wù)運(yùn)行情況,并及時(shí)發(fā)現(xiàn)和修復(fù)問(wèn)題。
3.安全性
Istio可以在代理層面來(lái)管理認(rèn)證、授權(quán)和通訊的加密,而無(wú)需對(duì)應(yīng)用本身造成侵入。而這些安全配置操作只需要通過(guò)快速的配置變更即可完成。
接下來(lái),我們看下Istio的架構(gòu)組成。如下圖所示:
如上圖所示,Istio實(shí)現(xiàn)服務(wù)網(wǎng)格,仍然遵循了將組件分離成“控制平面”和“數(shù)據(jù)平面”這一常見(jiàn)的分布式系統(tǒng)構(gòu)建模式。
Istio中的數(shù)據(jù)平面由Envoy代理組成,控制服務(wù)之間的通信。Envoy是一個(gè)用C++開(kāi)發(fā)的高性能代理。Istio將Enovy代理作為一個(gè)sidecar容器注入到應(yīng)用容器的旁邊,然后攔截該服務(wù)的所有入站和出站流量。而這些注入應(yīng)用容器旁邊的Enovy代理組合在一起就構(gòu)成了Istio服務(wù)網(wǎng)格的數(shù)據(jù)平面。
Istiod則是Istio的控制平面組件,主要提供服務(wù)發(fā)現(xiàn)、配置和證書管理等功能。Istiod采用YAML文件格式來(lái)編寫流量控制規(guī)則,并將其轉(zhuǎn)換為Envoy的可操作配置,之后通過(guò)xDS協(xié)議將配置傳播給網(wǎng)格中的所有sidecar代理。
Istiod主要由Pilot、Citadel、Galley這三個(gè)組件組成。其中Pilot抽象了特定平臺(tái)的服務(wù)發(fā)現(xiàn)機(jī)制(如Kubernetes、Consul或VM),并將其轉(zhuǎn)換為可以被sidecar使用的標(biāo)準(zhǔn)格式。Citadel則是Istio的核心安全組件,實(shí)現(xiàn)證書授權(quán)、證書生成,實(shí)現(xiàn)數(shù)據(jù)平面中sidecar代理之間的mTLS安全通信。
而Galley則主要服務(wù)配置管理,包括驗(yàn)證配置信息的格式和內(nèi)容正確性,并將這些配置信息提供給Pilot等其他控制平面組件使用。
Istio的流量管理實(shí)現(xiàn)
流量管理是Istio服務(wù)網(wǎng)格的核心能力。在《如何在Service Mesh微服務(wù)架構(gòu)中實(shí)現(xiàn)金絲雀發(fā)布?》這篇文章中,我們通過(guò)Istio的流量管理功能,演示了在服務(wù)網(wǎng)格中實(shí)現(xiàn)灰度發(fā)布的具體方法。接下來(lái),將從原理層面來(lái)總結(jié)下Istio實(shí)現(xiàn)流量管理的核心邏輯。
Istio流量管理示意圖如下:
如上圖所示,要在Istio服務(wù)網(wǎng)格中實(shí)現(xiàn)流量管理,需要通過(guò)VirtualService(虛擬服務(wù))及DestinationRule(路由規(guī)則)資源來(lái)管理流量路由規(guī)則。
而具體的路由規(guī)則流量的執(zhí)行由Istio網(wǎng)關(guān)資源來(lái)實(shí)現(xiàn)。其中Ingress Gateway(入口網(wǎng)關(guān))和Egress Gateway(出口網(wǎng)關(guān))是Istio服務(wù)網(wǎng)格組件的一部分,這兩個(gè)網(wǎng)關(guān)都運(yùn)行著一個(gè)Envoy代理實(shí)例,它們?cè)诜?wù)網(wǎng)格的邊緣作為負(fù)載均衡器運(yùn)行,入口網(wǎng)關(guān)接收入站連接,而出口網(wǎng)關(guān)則接收從集群出去的連接。
需要注意,這里理解入口網(wǎng)關(guān)和出口網(wǎng)關(guān)的概念不要狹義的理解為就是Istio服務(wù)網(wǎng)格的邊緣入口和出口。對(duì)于Istio服務(wù)網(wǎng)格來(lái)說(shuō)除了外部流量的進(jìn)出可以通過(guò)VitrualService(虛擬服務(wù))關(guān)聯(lián)Gateway(網(wǎng)關(guān)資源)來(lái)實(shí)現(xiàn)流量路由外,網(wǎng)格之間也可以通過(guò)該方式來(lái)實(shí)現(xiàn)流量的路由。
所以,在使用Istio服務(wù)網(wǎng)格來(lái)實(shí)現(xiàn)微服務(wù)的流量管理時(shí),可以根據(jù)場(chǎng)景來(lái)分別創(chuàng)建針對(duì)外部流量的Gateway+VirtualService資源,以及針對(duì)具體微服務(wù)網(wǎng)格間流量的Gateway+VirtualService資源,并通過(guò)VitrualService隨時(shí)修改相應(yīng)的路由規(guī)則。
而對(duì)于Gateway網(wǎng)格資源的創(chuàng)建來(lái)說(shuō),則根據(jù)是控制入口流量還是出口流量來(lái)選擇關(guān)聯(lián)Ingress Gateway(入口網(wǎng)關(guān))還是Egress Gateway(出口網(wǎng)關(guān))。
如果上述描述暫時(shí)還未能讓你完全理解Istio服務(wù)網(wǎng)格的流量管理方式,那么可以根據(jù)《如何在Service Mesh微服務(wù)架構(gòu)中實(shí)現(xiàn)金絲雀發(fā)布?》這篇文章中演示的具體的例子進(jìn)行體會(huì)。
后記
以上內(nèi)容就是對(duì)Istio服務(wù)網(wǎng)格實(shí)現(xiàn)流量管理核心邏輯的簡(jiǎn)單介紹,也是為了方便大家理解之前文章中的一些操作。雖然目前以Istio服務(wù)網(wǎng)格架構(gòu)還沒(méi)有完全替代Spring Cloud微服務(wù)體系,但服務(wù)網(wǎng)格這種將控制平面和數(shù)據(jù)平面分離的架構(gòu)思想,將是未來(lái)微服務(wù)架構(gòu)的主流。