【進階之路】服務網格Service Mesh到底是什麼

2021-02-15 南橘ryc

首先,看到Service Mesh這個詞,相信很多同學都聽說過這個詞,但是具體它是幹什麼的,每個人就各有各的理解了。我第一次系統地了解Service Mesh的時候,也是通過幫同事買課返現,意外地看到這個名詞,旺盛的好奇心迫使我點了進去。然後,不多時,我便一頭霧水的走了出來。啊這,裡面的彎彎繞繞比盥洗室之主還複雜啊!於是乎,在經過一段時間的學習,對Service Mesh有所了解之後,我決定寫下這篇文章與大家分享我的理解。

一、什麼是Service Mesh

開門見山,先站在前輩的肩膀上給出定義:

Service Mesh這個詞的發明人,Buoyant的CEO William Morgan 如此解釋:服務網格是一個基礎設施層,用於處理服務間通信雲原生應用有著複雜的服務拓撲,服務網格保證請求在這些拓撲中可靠地穿梭。在實際應用當中,服務網格通常是由一系列輕量級的網絡代理組成的,它們與應用程式部署在一起,但對應用程式透明

Service Mesh,中文名叫作服務網格,用於處理服務間通信的基礎設施層,通常是一組與應用一起部署,但對應用透明的輕量級網絡代理。簡單來說就是將可以配置的代理層和服務部署在一起,作為微服務基礎設施層接管服務間的流量,並提供通用的服務註冊發現、負載均衡、身份驗證、精準路由、服務鑑權等基礎功能

Service Mesh與傳統基礎設施層不同之處在於,它形成了一個分布式的互連代理網絡,以sidecar形式部署在服務兩側,服務對於代理無感知,且服務間所有通信都由代理進行路由。它最重要的變革,就是引入了數據面控制面的概念,通過sidecar模式(原意是摩託車的邊車,用到軟體架構中,就是Sidecar應用是連接到父應用,並為其擴展或增強功能)將原本在SDK中的代碼獨立出來,用控制面代替配置中心的部分功能,以透明代理的形式提供安全、快速、可靠的服務間通信,同時也能實現微服務所需的基本組件功能。

實際上,Service Mesh 需要的基礎組件和傳統的微服務並沒有太大的差別,很多公司選擇自研控制面的原因,很多就是出於兼容老的微服務的基礎組件的考慮

好的,我們總結一下之前的發言,Service Mesh到底是做什麼的:

數據面:代理了服務的所有通信。
控制面:運行期間的服務控制,如流量控制和配置管理等。

二、Service Mesh 的演進歷程1、sidecar時代

Netflix是最早採用微服務的公司之一。為了跟上其增長速度,Netflix決定從龐大而單一的數據中心轉向基於雲的微服務架構,以實現高可用,大規模和速度。基於其成功案例,Netflix開源了許多工具/技術,為微服務架構提供支持。這個時候 Netflix發現開發多語言的SDK要耗費大量的人力,畢竟在Spring Cloud中的組件可不是一般的多,為每個語言開發一套,顯然所需花費的人力物力太大。於是乎,就想到了使用sidecar模式,把SDK裡的功能轉移到sidecar中。

所謂sidecar,其實就是一個部署在本地的代理伺服器,它既接管了入口流量,也接管了出口流量。把所有的sidecar組合到一起,就成了服務網格(Service Mesh)。

2、初代 Service Mesh

在sidecar模式中,更多的是為了解決公司非主力語言的SDK開發問題,採取Adapter模式,非主力語言通過sidecar連接,而主力語言還是正常使用SDK的方式。

雖然sidecar能夠解決一些微服務時代的SDK問題,但許多一直存在於微服務架構中的問題卻沒有辦法處理。

1、缺乏統一的管控手段。比如 sidecar 的服務治理相關配置文件的維護,可能需要運維手動維護、無法集中管理,因為這個原因,控制面誕生了。2、雖然框架本身屏蔽了分布式系統通信的一些通用功能實現細節,但開發者卻要花更多精力去掌握和管理複雜的框架本身,在實際應用中,去追蹤和解決框架出現的問題也絕非易事(追蹤服務本身的問題倒還可以引入鏈路追蹤之類的方法)。3、框架以lib庫的形式和服務聯編,複雜項目依賴時的庫版本兼容問題非常棘手,同時,框架庫的升級也無法對服務透明,服務會因為和業務無關的lib庫升級而被迫升級

隨著技術不斷發展,大家慢慢意識到統一流量處理模型的重要性,於是誕生了第一代Service Mesh,其中比較出名的是Linkerd和Envoy。在這一代Service Mesh中,它將分布式服務的通信抽象為單獨一層,在這一層中實現負載均衡、服務發現、認證授權、監控追蹤、流量控制等分布式系統所需要的功能,作為一個和服務對等的代理服務,和服務部署在一起,接管服務的流量,通過代理之間的通信間接完成服務之間的通信請求。這樣之前所說的sidercar未能解決的問題也得到了解決。

3、第二代 Service Mesh

由於第一代Service Mesh由一系列獨立運行的單機代理服務構成,為了降低開發運維人員的維護成本,提供統一的上層運維入口,演化出了集中式的控制面板,所有的單機代理組件通過和控制面板交互進行網絡拓撲策略的更新和單機數據的匯報。新一代Service Mesh,比如大家熟知的Istio了。它引入了控制面的概念,讓Service Mesh成為完全體,如下圖所示:

Istio使用Envoy作為數據面,控制面和Kubernetes 深度綁定,早期版本將流量治理的功能放在 mixer 中,形成了一套完整的 Service Mesh 解決方案。控制面負責了資源管理、配置下發、證書管理等功能,解決了數據面配置難以管理的問題。

至此,我們也大體地對Service Mesh有了初步的印象,接下來,咱一起分析分析,Service Mesh到底解決了傳統微服務架構中的哪些痛點吧!

三、Service Mesh的優勢1、語言無關

早在sidecar時代,Netflix將SDK的功能集成到sidecar中就體現了Service Mesh的優勢。雖然我們在微服務架構也經常提到這個優點,但是對於傳統的微服務架構而言,Service Mesh 做到了真正的語言無關:傳統的微服務架構要為各種語言開發SDK,而Service Mesh將SDK的功能集成到sidecar中,實現了真正的語言無關性。

2、只關注業務邏輯

Service Mesh與傳統微服務相比,屏蔽了分布式系統通信的複雜性,將可以配置的代理層和服務部署在一起,作為微服務基礎設施層接管服務間的流量,並提供通用的服務註冊發現、負載均衡、身份驗證、精準路由、服務鑑權等基礎功能。

3、基礎設施獨立演進

傳統微服務架構中,業務代碼和框架、SDK等全都混合在一起,框架想要升級就會變得非常困難而且被動,一個地方有變動,所有相關的項目都需要升級。當微服務的數量變多時,想要在公司內推動框架的全量升級基本上就和重構差不多了(正好我們公司的項目在升級重構)。而Service Mesh 架構將框架中和業務無關的通用功能放在sidecar中,升級時只要升級sidecar就可以了,這樣做到了基礎設施的獨立演進。

當然,這樣也會導致Service Mesh拉長了網絡請求的軌跡,在一套標準的雲原生環境裡,我們的流量可能需要先經過這麼幾個步驟:

集群外的負載均衡器 → 集群網關 → Service Mesh的Ingress → Sidecar → 業務服務

而且,後續鏈路每多一個業務服務,都會額外流經一個 Sidecar,即便如此多的基礎設施名義上是為了保障業務穩定性,但每一個節點,也都同樣會帶來額外的隱患,一定程度上會降低通信系統性能,並增加系統資源開銷。

4、簡化系統網關的功能

實際上 sidecar 本身就是一個網關,或者說是反向代理,自然可以將以前 Nginx/Kong 之類的系統網關遷移到sidecar上來,這樣就可以維護一套統一的代碼。更進一步,可以將以前邊緣網關的工作,比如鑑權、trace初始化等工作下沉到 sidecar 上,進一步簡化系統網關的功能。但是,同時額外引入的大量Service Mesh服務實例的運維和管理也是一個挑戰。

四、一點感觸

整體來看,如果業務還處在一個起步階段,還是不適合使用Service Mesh來進行開發,因為架構演進的一個重要的原則,就是組織架構要和技術架構相匹配,Service Mesh適合重構更勝於從零開始。

記得在剛剛學習Service Mesh的時候,有大佬曰:Service Mesh是微服務時代的TCP協議,歷史總是驚人的相似。為了解決端到端的字節碼通信問題,TCP協議誕生,讓多機通信變得簡單可靠;微服務時代,Service Mesh應運而生,屏蔽了分布式系統的諸多複雜性,讓開發者可以回歸業務,聚焦真正的價值。

到底是忠實於技術,還是回歸於業務,對於我這樣的普通程式設計師而言,還是太過遙遠,但是卻能讓我們慢慢地看清自己的道路。

正如我的籤名所言,一步一天,是為通天,不積跬步,又如何能通向自己的夢想呢?


相關焦點

  • service mesh - 微服務通信進化之路
    導語 | service mesh 致力於做微服務時代的 TCP,以 TCP 的方式解決微服務的通信問題。那麼它解決的是微服務時代的什麼問題?
  • 從侵入式服務治理到Service Mesh
    目前service mesh技術在網際網路公司中越來越流行,那麼之前分布式系統是如何服務治理的呢,又是如何一步步發展成service mesh的呢?Service Mesh的定義最早是由出品Linkerd的Buoyant公司的CEO William在他的經典博客文章What's a service mesh? And why do I need one?中給出的。
  • Google Cloud 服務網格:Traffic Director 與 Anthos Service Mesh 的左右互搏
    Google Cloud 同時推出兩個 Service Mesh 產品的原因是什麼?這兩個產品的定位有何不同?本文將分別分析這兩個產品的架構和功能,以試圖解答該疑問。,該能力是建立在 Google Cloud 強大的 VPC 機制基礎上的, Google Cloud 的 VPC 可以跨越多個 Region,因此一個 VPC 中的服務網格中可以有來自多個 Region 的服務。
  • Traefik 團隊開源的輕量級 Service Mesh 工具 Maesh
    Containous(Traefik 團隊)推出了全新設計的輕量級 service mesh(服務網格)工具:Maesh,Maesh 允許對 Kubernetes
  • 微服務架構與服務網格Service Mesh
    作者:阿二 | 編輯:皮皮哥今天我們來聊一聊:服務網格(Service Mesh )以及字節跳動的服務治理平臺MS。
  • Service Mesh 淺析:從概念、產品到實踐
    1 Service Mesh - 服務通信的濟世良方 Service Mesh(中文譯做服務網格)這一概念由 Buoyant 公司的 CEO,William Morg」n 首先提出。2017 年 4 月該公司發布了第一個 Service Mesh 產品 Linkerd,這篇同一時間發表的文章 What’s a service mesh?
  • 正確入門Service Mesh:起源、發展和現狀
    不得不說,起名真是門藝術,Micro-Services -> Service Mesh,多麼承前啟後和順其自然啊,光看名字就能很形象地理解這玩意兒所做的事情:把微服務的各個service(服務)節點,用一張mesh(網格)連接起來。
  • ​ABAQUS網格劃分之『Bottom-up mesh』
    ,介紹ABAQUS中的Bottom-up mesh網格劃分方法,並對該方法需要注意的問題進行闡述。由於前三中網格生成方法更為常用和簡單,本文僅對第四種方法進行介紹。以圖1所示模型為例我們使用bottom-up進行網格生成。首先進入mesh模塊,將mesh controls設置為bottom-up方法。之後進入劃分窗口,如圖2所示。
  • 測試Istio 1.6 Service Mesh引入虛擬機Workload (筆記與感悟)
    各大服務網格在布道過程中都遇到了傳統服務向網格遷移的障礙, 而巨大的VM業務形態的存量市場也不是現在的服務網格能短時間內撼動的.  與其說是一種妥協, 我認為這是一種更務實的態度, 採用Universal的框架, 降低使用門檻, 才能使得推廣服務網格的路更加寬廣. 畢竟那些未曾使用服務網格的用戶並不非不知道服務網格的益處.
  • 微服務之Service Mesh淺析
    Service Mesh 這個概念最早由開發Linkerd 的 Buoyant, Inc 公司 CEO William Morgan 提出:服務網格即通過將這些功能插入平臺層而非應用程式層來向應用程式添加可觀察性,安全性和可靠性功能的工具。具體什麼意思呢?
  • 什麼是Service Mesh
    那麼到底什麼是Service Mesh?一言以蔽之:Service Mesh是微服務時代的TCP協議。有了這樣一個感性的初步認知,我們再來看到底什麼是Service Mesh。提到Service Mesh,就不得不提微服務。
  • 詳細教程丨如何利用Rancher和Kong實現服務網格?
    掃描下方二維碼或點擊文末【閱讀原文】即可報名:服務網格(Service mesh)是當前新興的架構模式,越來越受到人們的青睞。與Kubernetes一起,服務網格可以形成一個強大的平臺,它可以解決在微服務集群或服務基礎設施上發現的高度分布式環境中出現的技術需求。服務網格是一個專門的基礎設施層,用於促進微服務之間的服務到服務通信。
  • 服務網格比較:Istio vs Linkerd
    根據 CNCF[2] 的 最新年度調查 [3],很明顯,很多人對在他們的項目中使用服務網格表現出了極大的興趣,並且許多人已經在他們的生產中使用它們。將近 69% 的人正在評估 Istio,64% 的人正在研究 Linkerd。Linkerd 是市場上第一個服務網格,但是 Istio 的服務網格更受歡迎。這兩個項目都是最前沿的,而且競爭非常激烈,因此選擇哪一個是一個艱難的選擇。
  • 使用 SkyWalking 和 Envoy 訪問日誌服務對服務網格進行觀察
    不過自從 v1.5 版本,由於 Mixer 在大型集群中差強人意的表現,Istio 開始棄用 Mixer。Mixer 的功能現已遷至 Envoy 代理,並獲 Istio 1.7 版本支持。 代理傳入請求︰在此情況下,Envoy 會作為伺服器端的 Sidecar,以 inbound|portNumber|portName|Hostname[or]SidecarScopeID 格式設定 upstream_cluster。
  • 服務網格在Cookpad網站中的實踐
    目前,我想介紹一下在 Cookpad 上構建和使用服務網格所獲得的知識。對於服務網格本身,我認為您將對以下文章,公告和教程有完整的了解:https://speakerdeck.com/taiki45/observability-service-mesh-and-microserviceshttps://buoyant.io/2017/04/25/whats-a-service-mesh-and-why-do-i-need-one
  • Service Mesh 是什麼,我們為什麼需要它?
    但是什麼是真正的 Service Mesh?它又為何突然變的如此重要?在這篇文章,我會講解 Service Mesh 的定義,並通過應用服務架構過去十年的發展追溯其起源。並將 Service Mesh 與其他相似的概念,包括 API 網關,邊緣代理以及 ESB (enterprise service bus)進行區分。
  • Unity Mesh基礎系列(一)生成網格(程序生成)
    它可以來自於其他軟體製作的3D模型進行導入,可以是由代碼動態生成出來的,也可以是一個sprite、UI元素或者是粒子系統,這些統統都是要用到mesh的,就連一些屏幕的後處理特效都需要使用mesh來渲染。所以,那麼到底Mesh是什麼呢?
  • 2020年-Service Mesh工具對比
    如果沒有服務網格,則每個微服務都需要配置接收(或發送)來自其他微服務的流量。服務網格完全改變了這一點。有了服務網格,微服務就能夠以可靠,安全和可控制的方式相互通信,而不必進行手動配置,也不必花費大量時間和精力來維護微服務之間的連接。Kubernetes和服務網格是相互協作的,同時使用服務網格可以很輕鬆地實現更複雜的容器化架構。
  • 了解 Linkerd Service Mesh 架構
    控制平面是一組服務,提供對 Linkerd 整體的控制。數據平面由在每個服務實例「旁邊」運行的透明微代理(micro-proxies)組成,作為 Pod 中的 sidecar。這些代理會自動處理進出服務的所有 TCP 流量,並與控制平面進行通信以進行配置。Linkerd 還提供了一個 CLI,可用於與控制平面和數據平面進行交互。
  • WePay服務網格系統的高可用實踐
    具體來說,我們將會從監控和告警兩個角度來查看服務網格系統的健康性,並講述如何使用各組數據來定義WePay基礎設施中服務網格架構的高可用。和我們在本系列中前面討論的服務網格設定一樣,這裡給出的例子是一個跑在Google Kubernetes Engine(GKE)的Kubernetes集群上的高可用及模塊化的服務網格。