本文整理自華為Cloud BU技術(shù)專家在K8S技術(shù)社上
成都創(chuàng)新互聯(lián)公司是專業(yè)的霞山網(wǎng)站建設(shè)公司,霞山接單;提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行霞山網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
關(guān)于Istio調(diào)用鏈的分享。
前言
大家好,我是idouba,來(lái)自華為Cloud BU,當(dāng)前在做Istio服務(wù)網(wǎng)格在華為云容器服務(wù)的產(chǎn)品化工作。今天跟大家分享的主題是Istio調(diào)用鏈相關(guān)內(nèi)容。通過(guò)剖析Istio的架構(gòu)機(jī)制與Istio中調(diào)用鏈的工作原理來(lái)解答一個(gè)大家經(jīng)常問(wèn)道的一個(gè)問(wèn)題:Istio是否像其官方文檔中宣傳的一樣,對(duì)業(yè)務(wù)代碼完全的無(wú)侵入,無(wú)需用做任何修改就可以完成所有的治理能力,包括調(diào)用鏈的埋點(diǎn)?
關(guān)于這個(gè)問(wèn)題,可以提前透漏下,答案是讓人有點(diǎn)沮喪的,得改點(diǎn)。在Isito中你不用在自己的代碼里使用各種埋點(diǎn)的SDK來(lái)做埋點(diǎn)的邏輯,但是必須要有適當(dāng)?shù)呐浜系男薷摹?/p>
為什么本來(lái)無(wú)侵入的Service Mesh形態(tài)的技術(shù)卻要求我們開(kāi)發(fā)者修改些代碼,到底要做哪些修改?Istio中調(diào)用鏈到底是怎么工作的?在下面的內(nèi)容中將逐個(gè)回答這些問(wèn)題。
本次分享的主題包括兩部分: 第一部分作為背景和基礎(chǔ),介紹Istio的架構(gòu)和機(jī)制;第二部分將重點(diǎn)介紹Istio調(diào)用鏈的相關(guān)內(nèi)容,解答前面提出的幾個(gè)問(wèn)題。
Isito的架構(gòu)和機(jī)制
Service Mesh
如官方介紹,Istio是一個(gè)用于連接、控制、保護(hù)和觀測(cè)服務(wù)的一個(gè)開(kāi)放平臺(tái)。即:智能控制服務(wù)間的流量和API調(diào)用;提供授權(quán)、認(rèn)證和通信加密機(jī)制自動(dòng)保護(hù)服務(wù)安全;并使用各種策略來(lái)控制調(diào)用者對(duì)服務(wù)的訪問(wèn);另外可以擴(kuò)展豐富的調(diào)用鏈、監(jiān)控、日志等手段來(lái)對(duì)服務(wù)的與性能進(jìn)行觀測(cè)。
Istio是Google繼Kubernetes之后的又一重要項(xiàng)目,提供了Service Mesh方式服務(wù)治理的完整的解決方案。2017年5月發(fā)布第一個(gè)版本 0.1, 2018年6月1日發(fā)布了0.8版本,第一個(gè)LTS版本,當(dāng)前在使用的1.0版本是今年7.31發(fā)布,對(duì)外宣傳可用于生產(chǎn)。最新的1.1版本將2018.11中旬最近發(fā)布(當(dāng)時(shí)規(guī)劃實(shí)際已延遲,作者注)。
Istio屬于Service Mesh的一種實(shí)現(xiàn)。通過(guò)一張典型圖來(lái)了解下Service Mesh。如圖示深色是Proxy,淺色的是服務(wù),所有流入流出服務(wù)的都通過(guò)Proxy。Service Mesh正是由這一組輕量代理組成,和應(yīng)用程序部署在一起,但是應(yīng)用程序感知不到他的存在。特別對(duì)于云原生應(yīng)用,服務(wù)間的應(yīng)用訪問(wèn)拓?fù)涠急容^復(fù)雜,可以通過(guò)Service Mesh來(lái)保證服務(wù)間的調(diào)用請(qǐng)求在可靠、安全的傳遞。在實(shí)現(xiàn)上一般會(huì)有一個(gè)統(tǒng)一的控制面,對(duì)這些代理有個(gè)統(tǒng)一的管理,所有的代理都接入一個(gè)控制面。對(duì)代理進(jìn)行生命期管理和統(tǒng)一的治理規(guī)則的配置。
這里是對(duì)Service Mesh特點(diǎn)的一個(gè)一般性描述,后面結(jié)合Isito的架構(gòu)和機(jī)制可以看下在Istio中對(duì)應(yīng)的實(shí)現(xiàn)。
可以看到Service Mesh最核心的特點(diǎn)是在Proxy中實(shí)現(xiàn)治理邏輯,從而做到應(yīng)用程序無(wú)感知。其實(shí)這個(gè)形態(tài)也是經(jīng)過(guò)一個(gè)演變的過(guò)程的:
最早的治理邏輯直接由業(yè)務(wù)代碼開(kāi)發(fā)人員設(shè)計(jì)和實(shí)現(xiàn),對(duì)服務(wù)間的訪問(wèn)進(jìn)行管理,在代碼里其實(shí)也不分治理和業(yè)務(wù),治理本身就是業(yè)務(wù)的一部分。這種形態(tài)的缺點(diǎn)非常明顯就是業(yè)務(wù)代碼和治理的耦合,同時(shí)公共的治理邏輯有大量的重復(fù)。
很容易想到封裝一個(gè)公共庫(kù),就是所謂的SDK,使用特定的SDK開(kāi)發(fā)業(yè)務(wù),則所有治理能力就內(nèi)置了。Spring Cloud和Netflix都是此類的工具,使用比較廣泛,除了治理能力外,SDK本身是個(gè)開(kāi)發(fā)框架,基于一個(gè)語(yǔ)言統(tǒng)一、風(fēng)格統(tǒng)一的開(kāi)發(fā)框架開(kāi)發(fā)新的項(xiàng)目非常好用。但這種形態(tài)語(yǔ)言相關(guān),當(dāng)前Java版本的SDK比較多。另外對(duì)于開(kāi)發(fā)人員有一定的學(xué)習(xí)成本,必須熟悉這個(gè)SDK才能基于他開(kāi)發(fā)。最重要的是推動(dòng)已經(jīng)在用的成熟的系統(tǒng)使用SDK重寫下也不是個(gè)容易的事情。比如我們客戶中就有用C開(kāi)發(fā)的系統(tǒng),運(yùn)行穩(wěn)定,基本不可能重寫。對(duì)這類服務(wù)的治理就需要一個(gè)服務(wù)外面的治理方式。
于是考慮是否可以繼續(xù)封裝,將治理能力提到進(jìn)程外面來(lái),作為獨(dú)立進(jìn)程。即Sidecar方式,也就是廣泛關(guān)注的Service Mesh 的。真正可以做到對(duì)業(yè)務(wù)代碼和進(jìn)程0侵入,這對(duì)于原來(lái)的系統(tǒng)完全不用改造,直接使用Sidecar進(jìn)行治理。
用一段偽代碼來(lái)表示以上形態(tài)的演變:
可以看到隨著封裝越來(lái)越加強(qiáng),從公共庫(kù)級(jí)別,到進(jìn)程級(jí)別。對(duì)業(yè)務(wù)的侵入越來(lái)越少,SDK的公共庫(kù)從業(yè)務(wù)代碼中解耦,Sidecar方式直接從業(yè)務(wù)進(jìn)程解耦了。對(duì)應(yīng)的治理位置越來(lái)越低,即生效的位置更加基礎(chǔ)了。尤其是Service Mesh方式下面訪問(wèn)通過(guò) Proxy執(zhí)行治理,所以Service Mesh的方式也已被稱為一種應(yīng)用的基礎(chǔ)設(shè)施層,和TCP/IP的協(xié)議棧一樣。TCP/IP負(fù)責(zé)將字節(jié)流可靠地在網(wǎng)絡(luò)節(jié)點(diǎn)間傳遞;而應(yīng)用基礎(chǔ)設(shè)施則保證服務(wù)間的請(qǐng)求在安全、可靠、可被管控的傳遞。這也對(duì)應(yīng)了前面Istio作為Service Mesh一種實(shí)現(xiàn)的定位。
Istio 關(guān)鍵能力
Istio官方介紹自己的關(guān)鍵能力如上所示,我把它分為兩部分:一部分是功能,另有一部分提供的擴(kuò)展能力。
功能上包括流量管理、策略執(zhí)行、安全和可觀察性。也正好應(yīng)對(duì)了首頁(yè)的連接、保護(hù)、控制和觀測(cè)四大功能。
流量管理:是Istio中最常用的功能。可以通過(guò)配置規(guī)則和訪問(wèn)路由,來(lái)控制服務(wù)間的流量和API調(diào)用。從而實(shí)現(xiàn)負(fù)載均衡、熔斷、故障注入、重試、重定向等服務(wù)治理功能,并且可以通過(guò)配置流量規(guī)則來(lái)對(duì)將流量切分到不同版本上從而實(shí)現(xiàn)灰度發(fā)布的流程。
策略執(zhí)行:指Istio支持支持訪問(wèn)控制、速率限制、配額管理的能力。這些能力都是通過(guò)可動(dòng)態(tài)插入的策略控制后端實(shí)現(xiàn)。
安全:Istio提供的底層的安全通道、管理服務(wù)通信的認(rèn)證、授權(quán),使得開(kāi)發(fā)任務(wù)只用關(guān)注業(yè)務(wù)代碼中的安全相關(guān)即可。
可觀察性:較之其他系統(tǒng)和平臺(tái),Istio比較明顯的一個(gè)特點(diǎn)是服務(wù)運(yùn)行的監(jiān)控?cái)?shù)據(jù)都可以動(dòng)態(tài)獲取和輸出,提供了強(qiáng)大的調(diào)用鏈、監(jiān)控和調(diào)用日志收集輸出的能力。配合可視化工具,運(yùn)維人員可以方便的看到系統(tǒng)的運(yùn)行狀況,并發(fā)現(xiàn)問(wèn)題進(jìn)而解決問(wèn)題。我們這次分享的主題調(diào)用鏈也正是Isito可觀察性的一個(gè)核心能力。
后面分析可以看到以上四個(gè)特性從管理面看,正好對(duì)應(yīng)Istio的三個(gè)重要組件。
擴(kuò)展性:主要是指Istio從系統(tǒng)設(shè)計(jì)上對(duì)運(yùn)行平臺(tái)、交互的相關(guān)系統(tǒng)都盡可能的解耦,可擴(kuò)展。這里列出的特性:
平臺(tái)支持:指Istio可以部署在各種環(huán)境上,支持Kubernetes、Consul等上部署的服務(wù),在之前版本上還支持注冊(cè)到Eureka上的Service,新版本對(duì)Eureka的支持被拿掉了;
集成和定制:指的Istio可以動(dòng)態(tài)的對(duì)接各種如訪問(wèn)控制、配額管理等策略執(zhí)行的后端和日志監(jiān)控等客觀性的后端。支持用戶根據(jù)需要按照模板開(kāi)發(fā)自己的后端方便的集成進(jìn)來(lái)。
其實(shí)這兩個(gè)擴(kuò)展性的能力正好也對(duì)應(yīng)了Istio的兩個(gè)核心組件Pilot和Mixer,后面Isito架構(gòu)時(shí)一起看下。
Istio 總體架構(gòu)
以上是Isito的總體架構(gòu)。上面是數(shù)據(jù)面,下半部分是控制面。
數(shù)據(jù)面Envoy是一個(gè)C++寫的輕量代理,可以看到所有流入流出服務(wù)的流量都經(jīng)過(guò)Proxy轉(zhuǎn)發(fā)和處理,前面Istio中列出的所有的治理邏輯都是在Envoy上執(zhí)行,正是攔截到服務(wù)訪問(wèn)間的流量才能進(jìn)行各種治理;另外可以看到Sidecar都連到了一個(gè)統(tǒng)一的控制面。
Istio其實(shí)專指控制面的幾個(gè)服務(wù)組件:
Pilot:Pilot干兩個(gè)事情,一個(gè)是配置,就是前面功能介紹的智能路由和流量管理功能都是通過(guò)Pilot進(jìn)行配置,并下發(fā)到Sidecar上去執(zhí)行;另外一個(gè)是服務(wù)發(fā)現(xiàn),可以對(duì)接不同的服務(wù)發(fā)現(xiàn)平臺(tái)維護(hù)服務(wù)名和實(shí)例地址的關(guān)系并動(dòng)態(tài)提供給Sidecar在服務(wù)請(qǐng)求時(shí)使用。Pilot的詳細(xì)功能和機(jī)制見(jiàn)后面組件介紹。
Mixer:Mixer是Istio中比較特殊,當(dāng)前甚至有點(diǎn)爭(zhēng)議的組件。前面Isito核心功能中介紹的遙測(cè)和策略執(zhí)行兩個(gè)大特性均是Mixer提供。而Istio官方強(qiáng)調(diào)的集成和定制也是Mixer提供。即可以動(dòng)態(tài)的配置和開(kāi)發(fā)策略執(zhí)行與遙測(cè)的后端,來(lái)實(shí)現(xiàn)對(duì)應(yīng)的功能。Mixer的詳細(xì)功能和機(jī)制見(jiàn)后面組件介紹。
Citadel:主要對(duì)應(yīng)Istio核心功能中的安全部分。配合Pilot和Mixer實(shí)現(xiàn)秘鑰和證書的管理、管理授權(quán)和審計(jì),保證客戶端和服務(wù)端的安全通信,通過(guò)內(nèi)置的身份和憑證提供服務(wù)間的身份驗(yàn)證,并進(jìn)而該通基于服務(wù)表示的策略執(zhí)行。
Isito主要組件Pilot
如Istio架構(gòu)中簡(jiǎn)介,Pilot實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和配置管理的功能。
作為服務(wù)發(fā)現(xiàn),Pilot中定義了一個(gè)抽象的服務(wù)模型,包括服務(wù)、服務(wù)實(shí)例、版本等。并且只定義的服務(wù)發(fā)現(xiàn)的接口,并未實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)的功能,而是通過(guò)Adapter機(jī)制以一種可擴(kuò)展的方式來(lái)集成各種不同的服務(wù)發(fā)現(xiàn),并轉(zhuǎn)換成Istio通用的抽象模型。 如在Kubernetes中,Pilot中的Kubernetes適配器通過(guò)Kube-APIServer服務(wù)器得到Kubernetes中對(duì)應(yīng)的資源信息。而對(duì)于像Eureka這種服務(wù)注冊(cè)表,則是使用一個(gè)Eureka的HTTP Client去訪問(wèn)Eureka的名字服務(wù)的集群,獲取服務(wù)實(shí)例的列表。不管哪種方式最終都轉(zhuǎn)換成Pilot的標(biāo)準(zhǔn)服務(wù)發(fā)現(xiàn)定義,進(jìn)而通過(guò)標(biāo)準(zhǔn)接口提供給Sidecar使用。
而配置管理,則是定義并維護(hù)各種的流量規(guī)則,來(lái)實(shí)現(xiàn)負(fù)載均衡、熔斷、故障注入、流量拆分等功能。并轉(zhuǎn)換成Envoy中標(biāo)準(zhǔn)格式推送給Envoy,從而實(shí)現(xiàn)治理功能。所有的這些功能用戶均不用修改代碼接口完成。詳細(xì)的配置方式可以參照Istio Traffic Routing中的規(guī)則定義。重點(diǎn)關(guān)注:VirtualService、 DestinationRule、 Gateway等規(guī)則定義。如可以使用流量規(guī)則來(lái)配置各種灰度發(fā)布,也可以通過(guò)注入一個(gè)故障來(lái)測(cè)試故障場(chǎng)景;可以配置熔斷來(lái)進(jìn)行故障恢復(fù);并且可以對(duì)HTTP請(qǐng)求根據(jù)我們的需要進(jìn)行重定向、重寫,重試等操作。
Istio主要組件Mixer
Mixer是Isito特有的一個(gè)組件。主要做兩個(gè)功能Check和Report,分別對(duì)應(yīng)Istio官方宣傳的兩個(gè)重大特性策略執(zhí)行和遙測(cè)功能。邏輯上理解每次服務(wù)間的請(qǐng)求都會(huì)通過(guò)proxy連接Mixer來(lái)進(jìn)行處理,由Mixer來(lái)將請(qǐng)求派發(fā)到對(duì)應(yīng)的后端上處理。通過(guò)擴(kuò)展不同的后端來(lái)增強(qiáng)Mixer的能力。如可以做訪問(wèn)控制、配額等這樣的控制,也可以對(duì)接不同的監(jiān)控后端來(lái)做監(jiān)控?cái)?shù)據(jù)的收集,進(jìn)而提供網(wǎng)格運(yùn)行的可觀察性能力。
Mixer通過(guò)使用通用插件模型實(shí)現(xiàn)的對(duì)接不同后端,避免了proxy為了完成不同的功能而去對(duì)接各種不同的后端。每個(gè)插件都被稱為Adapter。對(duì)于每個(gè)請(qǐng)求Sidecar會(huì)從每一次請(qǐng)求中收集相關(guān)信息,如請(qǐng)求的路徑,時(shí)間,源IP,目地服務(wù),tracing頭,日志等,并請(qǐng)這些屬性上報(bào)給Mixer。Mixer和后端服務(wù)之間是通過(guò)適配器進(jìn)行連接的,Mixer將Sidecar上報(bào)的內(nèi)容通過(guò)適配器發(fā)送給后端服務(wù)。可以在不停止應(yīng)用服務(wù)的情況下動(dòng)態(tài)切換后臺(tái)服務(wù)。
除了可以通過(guò)adapter機(jī)制接入不同的后端,mixer還支持根據(jù)需要定義收集的metric,和對(duì)metric的處理方式,如樣例所示,可以自定義監(jiān)控指標(biāo)。
后面我們會(huì)看到Istio中調(diào)用鏈的數(shù)據(jù)也可以通過(guò)Mixer來(lái)收集。
Istio和Kubernetes的天然結(jié)合
盡管Isito強(qiáng)調(diào)自己的可擴(kuò)展性的重要一點(diǎn)就是可以適配各種不同的平臺(tái),但實(shí)際場(chǎng)景上,甚至看Istio當(dāng)前代碼、設(shè)計(jì)可以發(fā)現(xiàn)其所有重要的能力都是基于Kubernetes展開(kāi)的。Istio與Kubernetes結(jié)合之緊密,甚至有描述說(shuō)看上去是一個(gè)團(tuán)隊(duì)開(kāi)發(fā)的。即Istio就是基于Kubernetes之上,對(duì)Kubernetes能力的補(bǔ)齊。
從功能場(chǎng)景看,Kubernetes提供了部署、升級(jí)和有限的運(yùn)行流量管理能力;利用Service的機(jī)制來(lái)做服務(wù)注冊(cè)和發(fā)現(xiàn),轉(zhuǎn)發(fā),通過(guò)Kubeproxy有一定的轉(zhuǎn)發(fā)和負(fù)載均衡能力。但是往上的如熔斷、限流降級(jí)、調(diào)用鏈等治理能力就沒(méi)有了。前面的功能介紹可以發(fā)現(xiàn)Istio很好的補(bǔ)齊了Kubernetes在服務(wù)治理上的這部分能力。即Kubernetes提供了基礎(chǔ)服務(wù)運(yùn)行能力,而Istio基于其上提供服務(wù)治理能力,對(duì)Kubernetes服務(wù)的治理能力。
除了功能互補(bǔ)外,從形態(tài)上看Istio也是基于Kubernetes構(gòu)建的。包括: Sicecar 運(yùn)行在Kubernetes Pod里,作為一個(gè)Proxy和業(yè)務(wù)容器部署在一起,部署過(guò)程對(duì)用戶透明。Mesh中要求業(yè)務(wù)程序的運(yùn)行感知不到Sidecar的存在,基于Kubernetes的pod的設(shè)計(jì)這部分做的更徹底,對(duì)用戶更透明,通過(guò)Isito的自動(dòng)注入用戶甚至感知不到部署Sidecar的這個(gè)過(guò)程,和部署一個(gè)一般的Deployment沒(méi)有任何差別。試想如果是通過(guò)VM上部署一個(gè)Agent,不會(huì)有這么方便。
另外Istio的服務(wù)發(fā)現(xiàn)也是非常完美基于Kubernetes的域名訪問(wèn)機(jī)制構(gòu)建。Isito中的服務(wù)就是Kubernetes的服務(wù),避免了之前使用獨(dú)立的微服務(wù)框架在Kubernetes上運(yùn)行時(shí)兩套名字服務(wù)的尬尷和困惑。機(jī)制上Pilot通過(guò)在kubernetes里面注冊(cè)一個(gè)controller來(lái)監(jiān)聽(tīng)事件,從而獲取Service和Kubernetes的Endpoint以及Pod的關(guān)系,并將這些映射關(guān)系轉(zhuǎn)換成為Istio的統(tǒng)一抽象模型下發(fā)到Envoy進(jìn)行轉(zhuǎn)發(fā)。
Istio所有的我們熟悉的路由規(guī)則、控制策略都是通過(guò)Kubernetes CRD表達(dá),不需要一個(gè)單獨(dú)的APIserver和后端的配置管理。所以Istio APIServer就是Kubernetes的KubeAPIServer,數(shù)據(jù)也當(dāng)然的存在了對(duì)應(yīng)Kubernetes的ETCD中。
就連Istio的命令行工具Istioctl都是類似Kubectl風(fēng)格的功能,提供基于命令行的配置功能。
分享標(biāo)題:Istio調(diào)用鏈埋點(diǎn)原理剖析—是否真的“零修改”分享實(shí)錄(上)
文章路徑:http://muchs.cn/article2/igepoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、自適應(yīng)網(wǎng)站、微信小程序、ChatGPT
聲明:本網(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)