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