Service Mesh 介紹

璩陽何月發表於2020-04-26

傳統單體應用的侷限性說明

  • 傳統單體應用程式碼體量龐大繁雜,不利於理解,也不利於團隊合作開發,更不利於頻繁更新和部署,增加服務當機的風險。
  • 耦合性高,功能程式碼塊之前很容易造成強依賴,只要其中任何一個程式碼邏輯發生更改,將重新部署整個應用。
  • 擴充套件性差,單體應用只能橫向擴充套件,隨著功能越來越多,單個應用程式碼會越來越臃腫冗餘,擴充套件的時候也只能把整個程式碼部署多個例項。
  • 不利於基礎設施的資源分配,比如根據CPU密集型,IO密集型等不同型別應用型別資源消耗來進行單獨擴充套件優化。
  • 技術棧受限,可能會迫使開發人員長期專注於一種技術棧,如果後期要引入新的技術棧可能需要修改整個程式碼邏輯,工作量和技術難度巨大。

微服務架構的優點與不足

從單體應該的侷限性看出,一個成熟健康的開發團隊,不應該把業務邏輯都構建在一個應用中,隨著技術架構的不斷演化,就有了後來的微服務架構。
經過一系列複雜和長期的拆分之後,由多個微服務構建的複雜系統,彼此通過網路進行通訊,很好地解決了單體應用的一系列難題。但是隨著業務體量越來越大,業務邏輯也越來越複雜,微服務的弱點也隨之顯現。下面就總結了微服務架構的一些優點和缺點。

優點:

  • 通過分解巨大單體式應用為多個服務方法解決了複雜性問題,每個微服務相對較小;
  • 每個單體應用不侷限於固定的技術棧,開發者可以自由選擇開發技術,提供API服務;
  • 每個微服務獨立的開發,部署,方便靈活;
  • 功能邏輯單一,很簡單,只關注於一個業務模組;
  • 易於團隊協作,多個開發團隊並行開發,每個團隊負責一塊業務模組;
  • 服務之間耦合性低,一個服務當機不會影響其他的服務。

缺點:

  • 開發者需要應對建立分散式系統產生的額外的技術複雜度;
  • 測試團隊需要針對單個應用逐個測試,工作更加複雜;
  • 需要採用服務間的通訊機制,需要提前規劃好統一的介面規範;
  • 需要保證複雜網路環境中微服務間的可靠通訊,提高SLA的複雜度;
  • 很難在不採用分散式事務的情況下跨服務實現業務功能;
  • 跨服務實現要求功能要求團隊之間的緊密協作;
  • 部署複雜大量提升,對運維團隊的技術水平也有所提高;
  • 為了達到合理的業務健壯性,可能需要分配更多的基礎設施資源。

 

什麼是 Service Mesh 

Service Mesh 最早使用由開發 Linkerd 的 Buoyant 公司提出,並在內部使用。2016 年 9 月 29 日第一次公開使用這個術語。2017 年的時候隨著 Linkerd 的傳入,Service Mesh 進入國內技術社群的視野。Service Mesh 的定義是由 Linkerd 的 CEO William 給出來的。Linkerd 是業界第一個 Service Mesh 服務,最早翻譯為“服務齧合層”,這個詞比較拗口。後來改成了服務網格。服務網格是一個基礎設施層,處理服務間通訊,實現請求的可靠傳遞。在實踐中,服務網格通常實現為輕量級網路代理,通常與應用程式繫結在一起進行部署,但是對應用程式是透明的。客戶端應用例項作為請求發起者,會首先使用遠端呼叫方式將請求傳送到本地的 Service Mesh 例項。Service Mesh 例項之間會完成完整的服務間呼叫流程,如服務發現,負載均衡,最後將請求傳送給目標服務。這種應用程式和Service Mesh例項之間的部署方式稱為 Sidecar 模式。Sidecar 這個詞一般中文稱為邊車,一個開一個坐的那種。

應用服務之間呼叫時, Service Mesh 這一層被稱之為服務間通訊專用基礎設施層。Service Mesh 會接管整個網路,把所有的請求在服務之間做轉發。在這種情況下,應用服務不再負責傳遞請求的具體邏輯,只負責完成業務處理。服務間通訊的環節就從應用裡面剝離出來,呈現出一個抽象層。


如果有大量的應用服務,就會表現出來網格的形態。圖中左邊綠色方格是應用,右邊藍色的方框是 Service Mesh,藍色之間的線條是表示服務之間的呼叫關係。sidecar 之間的連線就會形成一個網路,這個就是服務網格名字的由來。

 

為什麼要用Service Mesh

Service Mesh作為透明代理,它幾乎可以執行在任何基礎設施環境,跟應用繫結在一起,功能非常強大。

  • Service Mesh使得微服務執行時具有下列效能。
  • 可見性(visiblity):執行時指標、分散式跟蹤。
  • 可管理性(manageablity):服務發現、負載均衡、執行時動態路 由。
  • 健壯性(resilience):超時重試、請求最後期限、熔斷機制。 ·安全性(security):服務間訪問控制、TLS加密通訊。
  • 安全性(security):服務間訪問控制、TLS加密通訊。

下面針對這些特性分別介紹:

負載均衡

實際執行環境中服務例項通常處於動態變化狀態,比如在程式碼釋出,硬體故障,網路變動,訪問壓力增加等情況都有可能導致個別或者部分例項不能正常提供服務的情況。但由於所有網路請求對Service Mesh來說都是可見的,因此可以通過提供高階負載均衡演算法來實現更加智慧、高效的流量分發,提高可靠性。

服務發現

以微服務模式執行的應用變更非常頻繁,應用例項的頻繁增加或減少帶來的問題就是如何精確地發現新增例項以及避免將請求傳送給已不存在的例項變得更加複雜。Service Mesh可以提供簡單、統一、 平臺無關的多種服務發現機制,如基於DNS、K/V鍵值對儲存的服務發現機制。 

熔斷

服務例項中斷或者不健康導致服務中斷可能時有發生,這就要求應用或其他工具具有快速監測並從負載均衡池中移除不提供服務例項的能力,這種能力也稱熔斷,以此使得應用無需消耗更多不必要的資源不斷地嘗試,而是快速失敗或者降級,甚至這樣可避免一些 潛在的關聯性錯誤。 

動態路由

隨著服務提供商以提供高穩定性、高可用性以及高SLA 服務為主要目標,為了實現所述目標,出現各種應用部署策略儘可能從技術手段達到無服務中斷部署,例如藍綠部署和金絲雀部署,但是傳統部署框架實現這些高階部署策略通常非常困難。
Service Mesh提供的動態路由機制和特定的部署策略讓上述目標的實現變得更加容易。維人員可以輕鬆地將應用流量從staging環境切換到產線環境,一個版本切換到另外一個版本,甚至可以通過一箇中心控制層控制多少比例的流量被切換。

安全通訊

無論何時,安全在整個公司、業務系統中都有著舉足輕重的位置,也是非常難以實現和控制的部分。而微服務環境中,不同的服務例項間通訊變得更加複雜,那麼如何保證這些通訊是在安全、有授權的情況下進行就非常重要。通過將安全機制如TLS加解密和授權實現在 Service Mesh上,不僅可以避免在不同應用上的重複實現,而且很容易在整個基礎設施層更新安全機制,甚至無需對應用做任何操作。

多語言支援

由於Service Mesh作為獨立執行的透明代理,跟應用程式程式語言無關,可以支援任何一種程式語言。

多協議支援

不通框架支援的協議不一樣,Istio支援:HTTP/1.1、HTTP/2、gRPC、TCP等,Linkerd支援HTTP/2和gRPC等。 

指標和分散式追蹤

Service Mesh對整個基礎設施層的可見性使得它不僅可以暴露單個服務的執行指標,而且可以暴露整個叢集的執行指標。 

重試和最後期限

Service Mesh的重試功能避免將其嵌入到業務程式碼,同時最後期限使得應用允許一個請求的最長生命週期,而不是無休止的重試。

 


常見Service Mesh產品

1、Linkerd

Linkerd是Buoyant公司2016年率先開源的高效能網路代理程式,是業界的第一款Service Mesh產品,甚至可以說Linkerd的誕生即Service Mesh時代的開始,其引領後來Service Mesh的快速發展。其主要用於解決分散式環境中服務之間通訊面臨的一些問題,比如網路不可靠、不安全、 延遲丟包等問題。Linkerd具有快速、輕量級、高效能等特點,每秒以最小的時延及負載處理萬級請求,易於水平擴充套件,經過產線測試及驗證,可執行任何平臺的產線級Service Mesh工具。Linkerd除了具有上述所闡述的Service Mesh的功能外,還具有下列特性。

  • 支援多平臺,可執行於多種平臺,比如Kubernetes、DC/OS、 Docker甚至虛擬機器或者物理機。
  • 無縫整合多種服務發現工具。
  • 支援多協議,如gRPC、HTTP/2、HTTP/1.x。
  • 支援與第三方分散式追蹤系統Zipkin。
  • 靈活性、擴充套件性高,可通過其提供的介面開發自定義外掛。

除此之外,據不完全統計,超過50家公司在產線使用Linkerd,應該 是目前產線使用最多的Service Mesh產品。還有,Linkerd是CNCF官方支援的專案之一。

 

2、Envoy

Envoy也是一款高效能的網路代理程式,於2016年10 月份由Lyft公司開源,為雲原生應用而設計,可作為邊界入口,處理外部流量,當然,也作為內部服務間通訊代理,實現服務間可靠通訊。Envoy 的實現借鑑現有產線級代理及負載均衡器,如Nginx、HAProxy、硬體負載 均衡器及雲負載均衡器的實踐經驗,基於Lyft公司產線實 踐證明,Envoy效能非常優秀、穩定。Envoy既可用作獨立代理層執行,也可作為Service Mesh架構中資料平面層,因此通常Envoy跟服務執行在一 起,將應用的網路功能抽象化,Envoy提供通用網路功能,實現平臺及語言無關。作為Service Mesh工具,Envoy除了支援上述Service Mesh的功能外,還有下列特性。

  • 大規模負載下,Envoy保證P99延時非常低。
  • 優先支援HTTP/2和gRPC,同時支援Websocket和TCP代理。
  • API驅動的配置管理方式,支援動態管理、更新配置以及無連線和 請求丟失的熱重啟功能。
  • L3/L4層過濾器形成Envoy核心的連線管理功能。
  • 通過與多種指標收集工具及分散式追蹤系統整合,實現執行時指標 收集,分散式追蹤,提供整個系統及服務的執行時可見性。
  • 記憶體資源使用率低,sidecar是Envoy最常用的部署模式。

目前,Envoy已經在Lyft及其他公司如騰訊、Stripe、Twilio等執行於生產環境。 基於Envoy實現的另一款Service Mesh工具Istio可能更廣為人知。而且 Envoy也是CNCF官方支援的專案之一。

 


3、Istio

Istio作為一款開源的為微服務提供服務間連線、管理以及安全保障的平臺軟體,支援執行在Kubernetes、Mesos等容 器管理工具,但不限於Kubernetes、Mesos,其底層依賴於Envoy。Istio 提供一種簡單的方法實現服務間的負載均衡、服務間認證、監控等功能, 而且無需應用層程式碼調整。其控制平面由Mixer、Pilot及Citadel組成, 資料平面由Envoy實現,通常情況下,資料平面代理Envoy以sidecar模式部署,使得所有服務間的網路通訊均由Envoy實現,而Istio的控制平面則 負責服務間流量管理、安全通訊策略等功能。由於其底層是Envoy,Envoy 支援的各種功能以及Service Mesh要求的功能Istio均支援,除此之外還 有以下功能。

  • 完善的流量管理機制,如故障注入。
  • 增強服務間安全保障,如服務身份認證,金鑰管理和基於RBAC的訪 問控制策略。
  • 支援多平臺部署。

相對Linkerd和Envoy,Istio在2017年5月才釋出,目前處於快速開發及迭代過程中,很多功能還不是很穩定。Istio社群非常活躍,有 Google、IBM、Lyft及其他公司如RedHat的大力支援及推廣。

 


4、Conduit

Conduit於2017年12月釋出,作為由 Buoyant繼Linkerd後贊助的另一個開源專案。Conduit旨在徹底簡化使用者在Kubernetes使用服務網格的複雜度,提高使用者體驗,而不是像Linkerd 一樣針對各種平臺進行優化。Conduit的主要目標是輕量級、高效能、安 全並且非常容易理解和使用。同Linkerd和Istio,Conduit也包含資料平面和控制平面,其中資料平面由Rust開發,使得Conduit使用極少的記憶體 資源,而控制平面由Go開發。Conduit依然支援Service Mesh要求的功能,而且還包括以下功能。

  • 超級輕量級及極快的效能,亞毫秒級P99延遲。
  • 專注於支援Kubernetes平臺,提高執行在Kubernetes平臺上服務的 可靠性、可見性及安全性。
  • 支援gRPC、HTTP/2和HTTP/1.x請求及所有TCP流量。

Conduit以極簡主義架構,以零配置理念為中心,旨在減少使用者與 Conduit的互動,實現開箱即用。作為Buoyant公司的第二款Service Mesh 軟體,其設計依據Linkerd在產線的實際使用經驗而設計,其設計目標即專為解決使用者管理產線環境執行的分散式應用程式所面臨的挑戰,並以最 小複雜性作為設計基礎。 Conduit正處於不斷開發的過程中,目前不建議在生產環境中使用。

相關文章