Service Mesh框架選型對(duì)比分析:Linkerd、Envoy、Istio、Conduit
作者:xcbeyond
瘋狂源自夢(mèng)想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫(kù)、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。
當(dāng)前,業(yè)界主要有以下主要幾種Service Mesh框架,下面進(jìn)行詳細(xì)的說明及對(duì)比。
1、Linkerd
Linkerd是Buoyant公司2016年率先開源的高性能網(wǎng)絡(luò)代理,是業(yè)界的第一款Service Mesh框架。其主要用于解決分布式環(huán)境中服務(wù)之間通信面臨的一些問題,如網(wǎng)絡(luò)不可靠、不安全、延遲丟包等問題。
Linkerd使用Scala語(yǔ)言編寫,運(yùn)行于JVM,底層基于Twitter的Finagle庫(kù),并對(duì)其做了相應(yīng)的擴(kuò)展。最主要的是Linkerd具有快速、輕量級(jí)、高性能等特點(diǎn),每秒以最小的延遲及負(fù)載處理萬(wàn)級(jí)請(qǐng)求,易于水平擴(kuò)展。除此之外,還有以下功能:
支持多平臺(tái):可運(yùn)行于多種平臺(tái),比如Kubernetes、DC/OS、Docker,甚至虛擬機(jī)或物理機(jī)。
無(wú)縫集成多種服務(wù)發(fā)現(xiàn)工具。
支持多協(xié)議,如gRPC、HTTP/1.x、HTTP/2,甚至可通過linkerd-tcp支持TCP協(xié)議。
支持與第三方分布式追蹤系統(tǒng)Zipkin集成。
靈活性、擴(kuò)展性高,可通過其提供的接口開發(fā)自定義插件。
目前,Linkerd和Linkerd2并行開發(fā),其情況如下:
Linkerd:Linkerd使用**Scala語(yǔ)言編寫**,運(yùn)行于JVM,底層基于Twitter的Finagle庫(kù),并對(duì)其做了相應(yīng)的擴(kuò)展。
Linkerd2:使用Go語(yǔ)言和Rust語(yǔ)言完全重寫了Linkerd,專門用于Kubernetes。
Linkerd本身是數(shù)據(jù)平面,負(fù)責(zé)將數(shù)據(jù)路由到目標(biāo)服務(wù),同時(shí)保證數(shù)據(jù)在分布式環(huán)境中傳輸是安全、可靠、快速的。另外,Linkerd還包括控制平面組件Namerd,通過控制平面Namerd實(shí)現(xiàn)中心化管理和存儲(chǔ)路由規(guī)則、中心化管理服務(wù)發(fā)現(xiàn)配置、支持運(yùn)行時(shí)動(dòng)態(tài)路由以及暴露Namerd
API管理接口。
控制平面
是在Kubernetes特定命名空間中運(yùn)行的一組服務(wù)。這些服務(wù)可以完成各種事情:聚集遙測(cè)數(shù)據(jù),提供面向用戶的API,向數(shù)據(jù)平面代理提供控制數(shù)據(jù)等。
由以下部分組成:
Controller:由public-api容器組成,該容器為CLI和dashboard提供接口API。
Destination:數(shù)據(jù)平面中的每個(gè)代理都使用此組件來查找將請(qǐng)求發(fā)送到哪里。還用于獲取服務(wù)配置信息,如:路由指標(biāo),重試和超時(shí)等。
Identity:該組件提供了證書的頒發(fā),接受來自代理的CSRs并返回正確身份簽名的證書。這些證書由代理在啟動(dòng)時(shí)獲取,并且必須在代理準(zhǔn)備就緒之前發(fā)出。隨后,它們可用于Linkerd代理之間的任何連接以實(shí)現(xiàn)mTLS。
Proxy Injector:是一個(gè)注入程序,每次創(chuàng)建一個(gè)pod時(shí),它都會(huì)接收一個(gè)webhook請(qǐng)求。該注入程序檢查資源以查找特定于Linkerd的注釋(linkerd.io/inject: enabled)。當(dāng)存在該注釋時(shí),注入器將更改容器的規(guī)范,并添加 initContainer包含代理本身的以及附屬工具。
Service Profile Validator:用于在保存新服務(wù)配置文件之前先對(duì)其進(jìn)行驗(yàn)證。
Tap:從CLI和dashboard接收請(qǐng)求,以實(shí)時(shí)監(jiān)視請(qǐng)求和響應(yīng)。
數(shù)據(jù)平面
由輕量級(jí)代理組成,這些代理作為sidecar容器與服務(wù)代碼的每個(gè)實(shí)例一起部署。為了將服務(wù)“添加”到Linkerd服務(wù)網(wǎng)格,必須重新部署該服務(wù)的Pod,以在每個(gè)Pod中包含數(shù)據(jù)平面代理。
2、Envoy
同Linkerd一樣,Envoy也是一款高性能的網(wǎng)絡(luò)代理,于2016年10月份有Lyft公司開源,為云原生應(yīng)用而設(shè)計(jì),可作為邊界入口,處理外部流量,此外,也作為內(nèi)部服務(wù)間通信代理,實(shí)現(xiàn)服務(wù)間可靠通信。Envoy的實(shí)現(xiàn)借鑒現(xiàn)有生產(chǎn)級(jí)代理及負(fù)載均衡器,如Nginx、HAProxy、硬件負(fù)載均衡器及云負(fù)載均衡器的實(shí)踐經(jīng)驗(yàn),同時(shí)基于C++編寫及Lyft公司生產(chǎn)實(shí)踐證明,Envoy性能非常優(yōu)秀、穩(wěn)定。
Envoy既可用作獨(dú)立代理層運(yùn)行,也可作為Service Mesh架構(gòu)中數(shù)據(jù)平面層,因此通常Envoy跟服務(wù)運(yùn)行在一起,將應(yīng)用的網(wǎng)絡(luò)功能抽象化,Envoy提供通用網(wǎng)絡(luò)功能,實(shí)現(xiàn)平臺(tái)及語(yǔ)言無(wú)法性。除此之外,還有以下功能:
優(yōu)先支持HTTP/2和gRPC,同時(shí)支持Websocket和TCP代理。
API驅(qū)動(dòng)的配置管理方式,支持動(dòng)態(tài)管理、更新配置以及無(wú)連接和請(qǐng)求丟失的熱重啟功能。
L3/L4層過濾器形成Envoy核心的連接管理功能。
通過與多種指標(biāo)收集工具及分布式追蹤系統(tǒng)集成,實(shí)現(xiàn)運(yùn)行時(shí)指標(biāo)收集、分布式追蹤,提供整個(gè)系統(tǒng)及服務(wù)的運(yùn)行時(shí)可見性。
內(nèi)存資源使用率低,sidecar是Envoy最常用的部署模式。
3、Istio
Istio是由Google、IBM和Lyft發(fā)起的開源的Service Mesh框架。該項(xiàng)目在2017年推出,并在2018年7月發(fā)布了1.0版本。
Istio是Service Mesh目前的實(shí)現(xiàn)的典型代表,如果Sidecar是整個(gè)Service Mesh的數(shù)據(jù)面,那么Istio主要在控制面上做了更多的改進(jìn),Istio使用Envoy作為Sidecar,控制面相關(guān)全部使用Golang編寫,性能上有了很大的提升。
Istio 首先是一個(gè)服務(wù)網(wǎng)格,但是Istio又不僅僅是服務(wù)網(wǎng)格:在 Linkerd,Envoy 這樣的典型服務(wù)網(wǎng)格之上,Istio提供了一個(gè)完整的解決方案,為整個(gè)服務(wù)網(wǎng)格提供行為洞察和操作控制,以滿足微服務(wù)應(yīng)用程序的多樣化需求。
Istio在服務(wù)網(wǎng)絡(luò)中統(tǒng)一提供了許多關(guān)鍵功能:
流量管理:控制服務(wù)之間的流量和API調(diào)用的流向,使得調(diào)用更可靠,并使網(wǎng)絡(luò)在惡劣情況下更加健壯。
可觀察性:了解服務(wù)之間的依賴關(guān)系,以及它們之間流量的本質(zhì)和流向,從而提供快速識(shí)別問題的能力。
策略執(zhí)行:將組織策略應(yīng)用于服務(wù)之間的互動(dòng),確保訪問策略得以執(zhí)行,資源在消費(fèi)者之間良好分配。策略的更改是通過配置網(wǎng)格而不是修改應(yīng)用程序代碼。
服務(wù)身份和安全:為網(wǎng)格中的服務(wù)提供可驗(yàn)證身份,并提供保護(hù)服務(wù)流量的能力,使其可以在不同可信度的網(wǎng)絡(luò)上流轉(zhuǎn)。
除此之外,Istio針對(duì)可擴(kuò)展性進(jìn)行了設(shè)計(jì),以滿足不同的部署需要。
平臺(tái)支持:Istio旨在在各種環(huán)境中運(yùn)行,包括跨云, 預(yù)置,Kubernetes,Mesos等。最初專注于Kubernetes,但很快將支持其他環(huán)境。
集成和定制:策略執(zhí)行組件可以擴(kuò)展和定制,以便與現(xiàn)有的ACL,日志,監(jiān)控,配額,審核等解決方案集成。
這些功能極大的減少了應(yīng)用程序代碼,底層平臺(tái)和策略之間的耦合,使微服務(wù)更容易實(shí)現(xiàn)。
Istio架構(gòu)圖中各個(gè)子模塊功能如下:
Envoy:負(fù)責(zé)各個(gè)應(yīng)用服務(wù)之間通信。
Pilot:管理和配置Envoy,提供服務(wù)發(fā)現(xiàn)、負(fù)載均衡和智能路由,保證彈性服務(wù)(服務(wù)超時(shí)次數(shù)、重試、熔斷策略)。
Mixer:信息監(jiān)控檢查。
Istio-Auth:提供服務(wù)和服務(wù)、用戶和服務(wù)之間的認(rèn)證服務(wù),實(shí)現(xiàn)訪問控制,解決是誰(shuí)訪問的是哪個(gè) API 的問題。
其中,圖中的通信代理組件為Envoy,這是Istio原生引入的,但Linkerd也能夠集成對(duì)接Istio。
4、Conduit
Conduit于2017年12月發(fā)布,作為由Buoyant繼Linkerd后贊助的另外一個(gè)開源項(xiàng)目,作為L(zhǎng)inkerd面向Kubernetes的獨(dú)立版本。Conduit旨在徹底簡(jiǎn)化用戶在Kubernetes使用服務(wù)網(wǎng)格的復(fù)雜度,提高用戶體驗(yàn),而不是像Linkerd一樣針對(duì)各種平臺(tái)進(jìn)行優(yōu)化。
Conduit的主要目標(biāo)是輕量級(jí)、高性能、安全并且非常容易理解和使用。同Linkerd和Istio,Conduit也包含數(shù)據(jù)平面和控制平面,其中數(shù)據(jù)平面由Rust語(yǔ)言開發(fā),使得Conduit使用極少的內(nèi)存資源,而控制平面由Go語(yǔ)言開發(fā)。Conduit依然支持Service Mesh要求的功能,而且還包括以下功能:
超級(jí)輕量級(jí)和極快的性能。
專注于支持Kubernetes平臺(tái),提高運(yùn)行在Kubernetes平臺(tái)上服務(wù)的可靠性、可見性及安全性。
支持gRPC、HTTP/2和HTTP/1.x請(qǐng)求及所有TCP流量。
Conduit以極簡(jiǎn)主義架構(gòu),以零配置理念為中心,旨在減少用戶與Conduit的交互,實(shí)現(xiàn)開箱即用。
5、對(duì)比總結(jié)
下面對(duì)上述各種Service Mesh框架進(jìn)行簡(jiǎn)單的比較匯總,見下表所示:
綜上對(duì)比,推薦選擇生態(tài)比較完善的Istio。