ServiceMesh實戰-服務網格是什麼?


       牛頓有曰:如果說我看得比別人更遠些,那是因爲我站在巨人的肩膀上。 學習前人的成果,就是先努力站到巨人的肩膀上;掌握前人的成果是前進的必要過程。有些人不學就懂了,直飛“巨人的肩膀”,很牛逼,爲了更好體現天才的價值,該往更遠處看看了。然而很多人,剛摸到“巨人的腳”,在爬“巨人的大腿”上,甚至有些人巨人在哪呢還沒找到。

      好了,開始“抱腿”——Service Mesh的大腿。

1. Service Mesh

       Service - 服務,各種服務,不過不是指建QQ號,拉微信消息,買域名等等具體的業務服務實例,而是一種抽象,指各種 GRPC/HTTP/FTB/SSH/Telnet 服務等等。

       Mesh - 網格,最常見的造型就是橫豎間隔組成的方格子,比如圍棋盤,治沙乾草格,防蟲窗紗等等都稱爲mesh。也有翻譯成格柵的,但是丟了"網"這種拓撲的神韻。

       兩個單詞組合起來 Service Mesh - 翻譯成"服務網格"。意思就是有一網格,把各種服務種到每個格子裏,埋上土,倒上水,通上電,然後把網格放到陽光下,迎上風,能不能長出來新服務不知道,反正服務之間可以愉快的侃大山了。哈哈,是的,你沒看錯,這就是“服務網格”的通俗解釋。莫慌,這是一種比方,繼續看爲啥這就是Service Mesh。

       原 Twitter 工程師威廉 · 摩根(Willian Morgan) ,發起 Linkerd項目的創始人之一(另一位是Oliver Gould),並在創建的 Buoyant 公司擔任 CEO。其發起的 Linkerd (第一個服務網絡項目)項目催生了“Service Mesh”這個術語。由此“Service Mesh”面世並迅速的得到認可。 在他的文章《 WHAT’S A SERVICE MESH? AND WHY DO I NEED ONE? 》中定義了什麼是 Service Mesh,以及爲什麼雲原生應用需要Service Mesh。

定義原文如下:

A service mesh is a dedicated infrastructure layer for making service-to-service communication safe, fast, and reliable.

WHAT IS A SERVICE MESH?

A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware. (But there are variations to this idea, as we’ll see.)

在這個定義中明確說明了Service Mesh的環境,目的和實現方式三個方面:

1. 雲原生應用有着複雜的服務拓撲;
2. Service Mesh 是一基礎設施層,用於處理服務間通訊;保證請求在這些拓撲之間安全,快速,可靠的穿梭;
3. Service Mesh 通常有一系列的輕量級的網絡代理組成,它們與應用程序部署在一起,但是應用程序不需要知道它們的存在。

       第1點,特別指明服務網格誕生的背景和應用環境。第2點,強調服務網格是一種網絡模型,提供“服務-服務”這種端對端的通信抽象模型,並假設網絡的不可靠和不安全性,然後由服務網格提供安全,快速,可靠的保證。第3點,意味着需要輕量級的網絡代理和服務部署在一起,並攔截服務之間的調用,由這些代理做相應的“基礎工作”,讓服務程序不再關心這些“基礎工作”,也無需感知誰在做這些工作,代理的管理協調也由服務網格負責,從而達到第2點的目標。

       因此,服務網格並沒有提供什麼新的功能,只是將“基礎工作”從服務剝離並下沉成基礎設施而已。也就是開篇比方中的“風雨陽光,水土電”,讓服務不再關心如何通風通水通電(構建基礎設施)以及不擔心斷水斷電(網絡的不可靠性),而只關心業務的功能邏輯實現,然後“拎包入住”的“種”(部署)到網格里,並且專業技術爲你提供便利服務。

       服務網格在架構設計上也十分簡單。實現方式就是在用戶空間裏,由部署在服務的“旁邊”的代理,加上一組協調管理代理的過程組成。 代理稱爲服務網格的數據平面,管理過程稱爲其控制平面。

       以上對定義的粗略分析,對服務網格有個大致的認識。下面針對這三點做更具體詳細的討論,討論清楚了,也就明白了“服務網格”到底是個什麼東西了。(有一些網文,花裏胡哨說一堆,其實分析最本質的定義即可)

2. 服務拓撲

       說到“拓撲”二字,想到大學裏有一門數學課程叫拓撲學(topology),它是研究幾何圖形或空間在連續改變形狀後還能保持一些性質不變的學科。我曾經上過這課,當時學的雲裏霧裏的,現在全還給老師了。不過在這裏不需要系統學習一遍拓撲學,涉及一堆數學理論和符號,大部分看不懂,也和本文沒多大關係。

       但是有個經典案例你需要知道,那就是祖師爺歐拉在300年前將哥尼斯堡七橋問題完美解決了,併發明瞭歐拉定理。其思想是把小島和河岸看成點,把連接小島和河岸的橋看成線,然後將實際的物理事物關係抽象成了數學幾何圖形。不關心橋是混凝土還是石拱橋,小島綠意蔥蔥,繁華熱鬧還是人跡罕至,荒無人煙;不關心橋面多寬多長,建在河岸什麼位置,小島多大面積等等。至於畫出來的圖形漂不漂亮,線直還是螞蟻線,實心圓點還是空心圓點都不在考慮範圍之內。重要的是將不可變更的物理實體,抽象之後搬到一張紙上,就成了數學家的玩物,任由其擺弄了。

       通過這個故事,傳達一個核心思想,拓撲學只考慮物體間的位置關係而不考慮它們的形狀和大小。對於計算機網絡而言,這就足夠了。至於連通性與緊緻性這兩個重要拓撲性質也不用關心(有興趣的可以去看看)。因爲在計算機網絡中,僅僅利用了拓撲學中不考慮形狀和大小而只研究點和線關係的方法。沒有再多的拓撲學知識了。

       依葫蘆畫瓢,把網絡中的計算機和通信設備抽象爲一個點,把通信鏈路抽象爲一條線,由點和線組成的幾何圖形就是計算機網絡的拓撲結構。網絡的拓撲結構反映出網中各實體的結構關係。計算機網絡常見的拓撲結構包括:星型結構,環形結構,總線型結構,樹形結構,網狀結構,蜂窩結構,混合拓撲結構等等。

       明白了網絡拓撲是什麼,那麼服務拓撲又是什麼呢?原理是一樣的,表現形式不同而已,換言之側重點不同,服務的層次要比網絡更高,不是精神層次,而是類似七層網絡模型中的邏輯層次一樣,是更高一層的抽象視角。服務拓撲的節點不再指網絡拓撲中的實體計算機和通信設備,而是一個具體的端口,一個上層服務;線路不再是一般而言的通信鏈路而是服務之間的調用關係。
       比如一個小公司,有一個核心的業務,幾個旁支業務。以爲核心業務爲中心,其他旁支業務都去核心業務請求服務。如此形成一種樹狀的服務拓撲。隨着公司規模逐漸變大,業務會隨之變多而且業務拆分也更細化,那麼服務自然也會越來越多。業務之間的合作伴隨着服務之間的相互調用而體現。這時候服務之間的調用關係,形成一個網狀服務拓撲。傳統的業務服務拓撲並不會太複雜,因爲服務量級不會太大。敢這樣說的原因是隨着微服務的興起,服務的量級在迅速擴大。服務拓撲在發生着改變。

       我們通過拓撲學的經典案例來了解拓撲學的核心思想,並介紹瞭如何利用拓撲學的原理來研究網絡拓撲結構。最後在網絡拓撲基礎上說明了服務拓撲具體是什麼,這樣理解起來也更清晰明瞭。隨着軟件技術的不斷升級換代,在微服務興起的大背景下,服務拓撲將面臨更多的問題。下面介紹一下微服務。

3. 微服務

       微服務的誕生歷史就不贅述了。直接看看什麼是微服務。

       微服務有很多種定義,業界尚未統一,所以不一而論。但是它們都包含微服務的共同特徵,比如服務根據業務組織,規模通常較小,並擁有清晰的接口;可獨立部署;依據自身硬件(部署環境)軟件(開發語言)需要獨立開發;服務之間組織比較鬆散等等。

       這種微服務架構將傳統的ABC的聚合體架構拆分成A,B,C單體的設計,看起來更加遵循“做好一件事”的 Unix 哲學。 對服務的一小部分進行更改只需重新構建並部署相關或者極少數微服務,避免了“大服務”的“牽一髮而動全身”的巨大代價;對於資源消耗型的服務業務,可以實現單個微服務單獨擴展,避免“喫大鍋飯”,實現精準“扶貧”,資源利用的最大化,精準化,進而提高成本優化效益和運維效率。同時微服務更加的滿足驅動型業務持續交付的需求,實現快速升級迭代。從管理層面來看,系統的分工更加明確,責任也更加清晰。

       如此看來,微服務的思想和現實中工業產業鏈的分工合作思想是一樣的。產業鏈中的每一環都是可以自主研發,升級,持續交付的,而且組織分散全球化。這樣一說好像也沒有什麼新發明新創造,但是將其思想從一個領域引入到另外一個領域,但是這已是巨大的改變和進步。

       好處講了一堆,以爲碧玉無瑕,其實不然。微服務直接帶來的副作用就是服務拓撲變化,從簡單的調用關係變成一團亂麻(如圖所示)。

部署管理的成本在升高(這要是讓開發運維人工去維護服務-服務之間的調用關係,沒有人願意幹)。故障的定位變得困難。由於服務粒度變小,每個服務有自己的日誌,那麼定位一個問題需要看多個服務的日誌。整個系統的穩定性也會下降。一個整體水桶變成多個服務拼板,穩定性取決於關鍵路徑上最差那一個(木桶效應)。此外,從概率上講,多服務系統要比單一系統發生故障概率要高。以及如何監控,服務治理,熔斷,測試,安全等等直接問題都暴露出來了(爲什麼會暴露?可以和傳統的服務方式對比即可)。

       大致瞭解了什麼是微服務,以及微服務的利與弊。雖然好處是推動技術升級的主要動力,但是前提是利大於弊,以及弊端是可以完美解決或者一定程度可以解決的。如何解決這些弊端是下文要闡述的內容。現在的情況是,急需解決兩個難題:1. 如何運行這些服務;2.如果讓服務-服務之間建立映射(通信)。

       如何運行服務?開玩笑吧,這哪門子難題。扔到機器上運行不就ok了。思想沒毛病,但是在微服務由五花八門的各種語言實現和其自身的環境依賴的前提下,讓人工去一個個丟是不ok的。讓你丟個一次兩次可以ok,幾十幾百個服務經常讓你丟,估計你就不幹了。關鍵也不滿足持續開發、集成和部署的要求。因此,急需一種統一的運行各種微服務的標準技術,這就是下面要談的話題:容器。第2個難題是要在第一個問題解決的基礎上來解決的問題,即服務治理。

4. 容器

       首先簡單瞭解一下容器的進化史。

       傳統的服務部署方式是直接將多個服務部署在物理機器上(如圖1所示)。也就是所謂的喫“大鍋飯”。每個應用程序的資源分配都是“自私”的,根據自己需要任意使用不關心其他應用程序的“死活”。雖然有OS警察管着,但是每個應用程序只要不超過OS的資源限制,一般不會被“槍斃”掉。但是資源是有限的,必然有些耗資源或者耗CPU的服務把其他服務給擠垮。換個角度講,這也算充分利用硬件資源了。但是爲了避免關鍵服務不被“流氓服務”坑,這樣的“大鍋飯”不是最佳方式,所以會選擇將關鍵服務需要“開小竈”——獨立部署專有服務器上,然而如此資源又得不到充分的利用而產生服務器資源的浪費。問題根源就是每個服務沒有資源邊界和隔離。

       爲解決上述問題,虛擬化技術被引入。虛擬化部署作爲一種解決方案,它爲每個服務提供了“實體隔間”,一定程度上隔離了資源和運行環境。讓服務看起來自己有私有的一間房而充滿安全感(安全性)。實現一定程度的伸縮性,降低硬件成本,比如將一臺物理機虛擬成一集羣。從圖2中可以明確看出來,每一個虛擬機裏都有一套完整的OS。這就意味着它們要佔用底層主機很大的存儲(內存和硬盤)和CPU,而且需要啓動一個虛擬的OS,這將十分耗時。從實踐來看,虛擬機技術的確解決了早期的問題,但是臃腫,耗資源,啓動慢的弊端,讓技術人員繼續尋找新的解決方案。

       既然“實體隔間”太耗資源,那能不能“掛個簾子不砌牆”,做成“虛擬隔間”——比如方艙,集裝箱。實際證明是可行的,不行技術人員也能讓它行。基於Linux的NS,Control Group(隔離CPU/內存),Union File Systems(寫時複製),容器引擎等技術,容器化部署鳴笛起航了(如圖3所示)。(注:不僅限於Linux)

       容器是一個標準的軟件單元,它將代碼及其所有依賴項打包,從而使應用程序能夠快速可靠地從一個計算環境運行到另一個計算環境。 一個容器映像是一個輕量級的、獨立的、可執行的軟件包,包括運行應用程序所需的一切: 代碼、運行時、系統工具、系統庫和設置。從而提供了更高效的資源隔離和資源利用。

       相比虛擬機其優勢在於便攜、靈活和易於部署。便攜是因爲它很輕量級,只打包必要的BIN/LIB(如圖3),不像虛擬化還要揹着完整的OS。它構建不像VM,它可以基於基礎鏡像,根據需要定製自己的需求,而十分快速靈活。構建完成後可以方便的移植到各中環境下進行部署,而不用擔心環境一致性問題,保證一次構建隨意部署。比如 Docker 容器技術的口號就是:“Debug your app, not your environment——Securely build and share any application, anywhere”。

       容器虛擬化技術有Docker、coreos、rocket、Pouch等等。其中 Docker 比較熱門,由於其太熱們導致很多人腦海裏形成了“容器=Docker”的概念,其實不是。Docker只是容器技術的一種技術實現。在2015年,由Google,Docker、CoreOS、IBM、微軟、紅帽等廠商聯合發起的OCI(Open Container Initiative)組織,並於2016年4月推出了第一個開放容器標準。

       有了容器技術,回到原來的問題。不管微服務依賴什麼環境,用什麼語言實現的還是什麼種類服務,統一打包成容器鏡像到任意環境下部署就可以了,對外統一了。容器技術也是促進微服務的語言棧如此豐富的一個主要原因,讓開發從此跳脫了誰是最好的語言之爭。問題1解決了,那麼在此基礎之上,我們可以解決第2個難題了。

5. 服務治理

       正如上文所述,用容器技術解決了如何運行微服務的問題,現在情況變成了:我們有一堆可運行的容器和一堆機器,如何將容器和機器之間建立映射關係以及如何管理它們。爲了提高資源利用率,在大量的微服務部署容器前提下,手工決策容器部署在哪裏,處理容器的動態變化以及配置顯然不靠譜。因此需要一些自動化措施來調度,管理,監管和故障轉移。

       服務治理——應運而生了。它的典型代表是K8S(kubernetes),Mesos,Swarm。後者側重於服務編排,但是k8s並不僅限於服務編排,它提供功能要多於服務編排的需要。下面簡單瞭解一下K8S。

       依據K8S官網的定義。K8S提供如下服務:

  1. 服務發現和負載均衡——使用 DNS 名稱或自己的 IP 地址暴露容器服務。如果到一個容器的流量很高,那麼 Kubernetes 能夠負載平衡和分配網絡流量,從而使部署穩定。
  2. 自動掛載指定的存儲系統——比如本地存儲、公共雲提供商等等。
  3. 自動推出和回滾——可以以受控的速率將實際狀態更改爲所需狀態。
  4. 自動裝箱;——每個容器需要指定CPU 和內存資源。
  5. 自修復——重啓失敗的容器,替換容器,殺死不響應用戶定義的健康檢查的容器。
  6. 祕鑰和配置管理——存儲和管理敏感信息,如密碼、 OAuth 令牌和 SSH 密鑰;可以部署和更新機密和應用程序配置,而無需重新構建容器映像。

       K8S不提供的服務包括:

  1. 不是傳統的PaaS,但是提供了一些 PaaS 產品通用的通用特性,比如部署、縮放、負載平衡、日誌記錄和監視,並且這些特性是可選的和可插拔的。
  2. 不限制所支持的應用程序類型——包括無狀態、有狀態和數據處理工作負載。只要能在容器中運行,就可以在k8s中使用。
  3. 不提供應用程序級服務——比如中間件(例如,消息總線)、數據處理框架(例如,Spark)、數據庫(例如,MySQL)、緩存,也不提供集羣存儲系統(例如,Ceph)作爲內置服務。
  4. 不指定日誌、監視或警報解決方案。
  5. 不提供也不要求配置語言 / 系統。
  6. 不提供也不採用任何機器配置、維護、管理或自我修復系統。
  7. 不僅僅是一個編排系統,Kubernetes 包括一組獨立的、可自由組合的控制過程。

更多內容參考k8s官網。

6. 微服務,容器,服務治理和服務網格的關係

       介紹完微服務,容器,服務治理之後,需要做個總結。在談到前面三部分內容的時候,讀者心裏會有一個疑問,這些內容和服務網格有半毛錢的關係?是不是跑題了?準確的講,沒有一點跑題。不是半毛錢關係而是一毛錢(十分)的關係。是因爲有了這三樣技術才讓服務網格成爲可能。這就好比DNA,RNA,蛋白質之於細胞。

       微服務和容器的結合,抽象統一了運行環境,讓大量新的應用程序以各種語言被實現爲微服務。大量的微服務這爲服務網格提供了最適合的應用環境。Docker 和 Kubernetes 的結合,讓無狀態、有狀態和數據處理等等各種工作服務成爲統一的操作對象,由 Kubernetes 爲服務提供一致性操作。通過 Kubernetes 使得運行一個服務的部署時成本和運行100個服務的部署成本是沒有多大區別。這滿足了服務網格的操作需求。把代理打包到 Docker 裏,由 Kubernetes 把它們和業務微服務部署在一起,並且部署的事情 Kubernetes 替你處理,如此提供了部署和維護 Sidecar 代理的機制。大大降低了服務網格的運維成本。

       如此構成如下圖所示的拓撲結構。其中灰色單元表示k8s的pod,包括兩個容器,綠色表示實際的微服務(業務服務);藍色表示 Sidecar 代理。

       上文提到“服務網格並沒有提供什麼新的功能,只是將基礎工作從服務剝離並下沉成基礎設施而已”;從這張圖中,綠色微服務的網格之間的通信的有藍色代理負責了。微服務的基礎工作不再有開發工程師全權負責,而是轉移到服務網格上去了。其中藍色代理稱爲服務網格的數據平面,管理這些代理的過程稱爲控制平面。
       因此,微服務,容器,服務治理都是服務網格的必要組成部分。

7. 服務網格要做什麼

       站在一個開發者的角度,如果實現一個只包含業務功能的服務,這隻能是一個demo。因爲還有更多的核心工作沒有做,比如負載均衡,故障恢復,頻控,審計,超時、重試、鑑權,監控,日誌,追蹤等等。傳統開發模式下,這些核心工作一部分要伴隨業務開發,一部分獨立成公共組件重複來使用,無論如何都需要開發人員來關心。

       服務網格打破了這個侷限,一定程度上解放了開發人員。它將業務之外的“基礎工作”從開發者身上剝離了,併成爲一種基礎功能下沉了。在服務網格定義中強調:“Server Mesh 是一基礎設施層,用於處理服務間通訊;保證請求在這些拓撲之間安全,快速,可靠的穿梭”。

       這個“基礎設施層”至少要具有:服務發現、負載平衡、故障恢復、日誌、監視、追蹤、a / b 測試、金絲雀發佈、藍綠部署、頻控、訪問控制、網關、端到端身份驗證等等。

       通過k8s來看,它已經滿足了其中一部分功能,但是顯然沒有做到全部。那麼剩餘的功能就需要一個新的軟件來覆蓋,這個優秀的代表就是Istio/Linkerd。

       以Istio作爲例,它具有如下功能:
  1. Http、 gRPC、 WebSocket 和 TCP 流量的自動負載平衡。
  2. 豐富的路由規則、重試、故障轉移和故障注入對流量行爲進行細粒度控制。
  3. 一個可插拔的策略層和配置 API,支持訪問控制、速率限制和配額。
  4. 集羣內所有流量的自動指標、日誌和跟蹤,包括集羣的進入和出口。
  5. 基於強身份驗證和授權的集羣中的安全服務對服務通信。

總結起來就是流量管理,安全管理和服務觀測。

總結

       任何事物發展都有前因後果,不是一蹴而就的;同理,很多思想是在已有思想基礎之上建立並發展起來的。事物從簡單到複雜,是一個逐漸進化,變得更高級,當然也更復雜的過程。瞭解其整個發展的變遷過程,循序漸進,搞懂來龍去脈,才能真正的明白並領悟到事物身上的所具有的"設計"的背後原因,內涵,而非出自拍腦袋的上帝之手。

       本文從服務網格的定義起步,逐漸討論了服務拓撲,微服務,容器,服務治理和服務網格的功能。描述性的介紹了一下服務網格是個什麼東西。其具體的實現技術和具體實現細節,比如docker,k8s,istio,還需進一步的學習。

後話

       服務網格作爲一種網絡模型,伴隨着雲計算,給 DevOps 團隊提供了一種解決方案。如今正如火如荼的發展的。但是和人工智能,量子通信,基因遺傳,比特幣等等比起來,十分不起眼,因爲其影響的領域相比它們要窄的多。再加上它的起步發展不是太早,也只是在圈子內專業人員知道。這篇文章也算一個入門介紹,拋磚引玉吧。

參考文獻

  1. 《The Service Mesh: What Every Software Engineer Needs to Know about the World’s Most Over-Hyped Technology》
  2. 《What’s a service mesh? And why do I need one?》
  3. 《Istio Handbook》
  4. 《Pattern: Service Mesh》
  5. 《Microservices-wiki》
  6. 《What is Kubernetes》
  7. 《什麼是微服務架構?》
  8. 《What is a Container?》
  9. 《kubernetes in Action》
  10. 《What is Istio?》

聲明:圖片無版權,均來源於網絡!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章