ServiceMesh & Istio

服務(wù)網(wǎng)格(ServiceMesh)號(hào)稱是下一代微服務(wù)架構(gòu)。

一、ServiceMesh架構(gòu)

互聯(lián)網(wǎng)公司,經(jīng)常使用的是微服務(wù)分層架構(gòu)。

畫外音:
為什么要服務(wù)化,詳見服務(wù)化解決了什么問題?

隨著數(shù)據(jù)量不斷增大,吞吐量不斷增加,業(yè)務(wù)越來越復(fù)雜,服務(wù)的個(gè)數(shù)會(huì)越來越多,分層會(huì)越來越細(xì),除了數(shù)據(jù)服務(wù)層,還會(huì)衍生出業(yè)務(wù)服務(wù)層,前后端分離等各種層次結(jié)構(gòu)。

畫外音:

分層的細(xì)節(jié),詳見《互聯(lián)網(wǎng)分層架構(gòu)演進(jìn)》。
不斷發(fā)現(xiàn)主要矛盾,抽離主要矛盾,解決主要矛盾,架構(gòu)自然演進(jìn)了,微服務(wù)架構(gòu),潛在的主要矛盾會(huì)是什么呢?

引入微服務(wù)架構(gòu),一般會(huì)引入一個(gè)RPC框架,來完成整個(gè)RPC的調(diào)用過程。

image.png

如上圖粉色部分所示,RPC分為:

  • RPC-client,它嵌在調(diào)用方進(jìn)程里

  • RPC-server,是服務(wù)進(jìn)程的基礎(chǔ)

畫外音:

離不開的微服務(wù)架構(gòu),脫不開的RPC細(xì)節(jié)》。

不只是微服務(wù),MQ也是類似的架構(gòu):


image.png

如上圖粉色部分所示,MQ分為:

  • MQ-send-client

  • MQ-server

  • MQ-recv-client

畫外音:

MQ,互聯(lián)網(wǎng)架構(gòu)解耦神器》。

框架只是第一步,越來越多和RPC,和微服務(wù)相關(guān)的功能,會(huì)被加入進(jìn)來。

例如:負(fù)載均衡

image.png

如果要擴(kuò)展多種負(fù)載均衡方案,例如:

  • 輪詢

  • 隨機(jī)

  • 取模

  • 一致性哈希

RPC-client需要進(jìn)行升級(jí)。

例如:數(shù)據(jù)收集

image.png

如果要對(duì)RPC接口處理時(shí)間進(jìn)行收集,來實(shí)施統(tǒng)一監(jiān)控與告警,也需要對(duì)RPC-client進(jìn)行升級(jí)。

畫外音,處理時(shí)間分為:
客戶端視角處理時(shí)間
服務(wù)端視角處理時(shí)間
如果要收集后者,RPC-server也要修改與上報(bào)。

又例如:服務(wù)發(fā)現(xiàn)

image.png

服務(wù)新增一個(gè)實(shí)例,通知配置中心,配置中心通知已注冊(cè)的RPC-client,將流量打到新啟動(dòng)的服務(wù)實(shí)例上去,迅猛完成擴(kuò)容。

再例如:調(diào)用鏈跟蹤

image.png

如果要做全鏈路調(diào)用鏈跟蹤,RPC-client和RPC-server都需要進(jìn)行升級(jí)。 下面這些功能:負(fù)載均衡數(shù)據(jù)收集服務(wù)發(fā)現(xiàn)調(diào)用鏈跟蹤…其實(shí)都不是業(yè)務(wù)功能,所以互聯(lián)網(wǎng)公司一般會(huì)有一個(gè)類似于“架構(gòu)部”的技術(shù)部門去研發(fā)和升級(jí)相關(guān)功能,而業(yè)務(wù)線的技術(shù)部門直接使用相關(guān)框架、工具與平臺(tái),享受各種“黑科技”帶來的便利。

完美?。?! 理想很豐滿,現(xiàn)實(shí)卻很骨感,由于:

  • RPC-client,它嵌在調(diào)用方進(jìn)程里
  • RPC-server,是服務(wù)進(jìn)程的基礎(chǔ)

往往會(huì)面臨以下一些問題:

  • 業(yè)務(wù)技術(shù)團(tuán)隊(duì),仍需要花時(shí)間去學(xué)習(xí)、使用基礎(chǔ)框架與各類工具,而不是全心全意將精力花在業(yè)務(wù)和產(chǎn)品上
  • client要維護(hù)m個(gè)版本, server要維護(hù)n個(gè)版本,兼容性要測試m*n個(gè)版本
  • 如果要支持不同語言,往往要開發(fā)C-client,Python-client,go-client,Java-client多語言版本
  • 每次“黑科技”的升級(jí),都需要推動(dòng)上下游進(jìn)行升級(jí),這個(gè)周期往往是以季度、半年、又甚至更久,整體效率極低

畫外音:
兄弟,貴司推廣一個(gè)技術(shù)新產(chǎn)品,周期要多長?
這些耦合,這些通用的痛點(diǎn),有沒有辦法解決呢?

一個(gè)思路是,將服務(wù)拆分成兩個(gè)進(jìn)程,解耦。


  • 一個(gè)進(jìn)程實(shí)現(xiàn)業(yè)務(wù)邏輯(不管是調(diào)用方,還是服務(wù)提供方),biz,即上圖白色方塊
  • 一個(gè)進(jìn)程實(shí)現(xiàn)底層技術(shù)體系,proxy,即上圖藍(lán)色方塊

畫外音:
負(fù)載均衡、監(jiān)控告警、服務(wù)發(fā)現(xiàn)與治理、調(diào)用鏈…等諸多基礎(chǔ)設(shè)施,都放到這一層實(shí)現(xiàn)。

  • biz和proxy共同誕生,共同消亡,互為本地部署,即上圖虛線方框
  • biz和proxy之間,為本地通訊,即上圖黑色箭頭
  • 所有biz之間的通訊,都通過proxy之間完成,proxy之間才存在遠(yuǎn)端連接,即上圖紅色箭頭

這樣就實(shí)現(xiàn)了“業(yè)務(wù)的歸業(yè)務(wù),技術(shù)的歸技術(shù)”,實(shí)現(xiàn)了充分解耦,如果所有節(jié)點(diǎn)都實(shí)現(xiàn)了解耦,整個(gè)架構(gòu)會(huì)演變?yōu)椋?/p>

  • 綠色為biz

  • 藍(lán)色為proxy

整個(gè)服務(wù)集群變成了網(wǎng)格狀,這就是Service Mesh服務(wù)網(wǎng)格的由來。

二、Istio

要聊ServiceMesh,就不得不提Istio,它是ServiceMesh目前最流行的實(shí)踐,今天說說Istio是干啥的。

畫外音:不能落伍。

什么是Istio?
Istio是ServiceMesh的產(chǎn)品化落地,它的一些關(guān)鍵性描述是:

  • 幫助微服務(wù)之間建立連接,幫助研發(fā)團(tuán)隊(duì)更好的管理與監(jiān)控微服務(wù),并使得系統(tǒng)架構(gòu)更加安全

畫外音:
Istio helps you to connect, secure, control, and observe microservices

  • 幫助微服務(wù)分層解耦,解耦后的proxy層能夠更加專注于提供基礎(chǔ)架構(gòu)能力,例如:
    (1)服務(wù)發(fā)現(xiàn)(discovery);
    (2)負(fù)載均衡(load balancing);
    (3)故障恢復(fù)(failure recovery);
    (4)服務(wù)度量(metrics);
    (5)服務(wù)監(jiān)控(monitoring);
    (6)A/B測試(A/B testing);
    (7)灰度發(fā)布(canary rollouts);
    (8)限流限速(rate limiting);
    (9)訪問控制(access control);
    (10)身份認(rèn)證(end-to-end authentication);

畫外音:
佩服,硬是湊齊了十條,其實(shí)SM還能提供更多基礎(chǔ)服務(wù)功能。

  • 使得業(yè)務(wù)工程團(tuán)隊(duì)與基礎(chǔ)架構(gòu)團(tuán)隊(duì)都更加高效的工作,各自專注于自己的工作,更好的彼此賦能

畫外音:
說的還是解耦。

Istio官網(wǎng)是怎么吹噓自己的?

畫外音:
這個(gè)問題的另一個(gè)問法是“為什么大家要來用Istio”。

Istio非常牛逼,如果要實(shí)施ServiceMesh,必須用Istio,因?yàn)椋?/p>

  • 可以通過,在現(xiàn)有服務(wù)器新增部署邊車代理(sidecar proxy),應(yīng)用程序不用改代碼,或者只需要改很少的代碼,就能實(shí)現(xiàn)上述N項(xiàng)基礎(chǔ)功能

畫外音:
你信了么?

  • 可以通過,控制后臺(tái),簡單改改配置,點(diǎn)點(diǎn)按鈕,就能管理和查看上述N項(xiàng)基礎(chǔ)功能
  • 以下特性,Istio在這個(gè)環(huán)節(jié)里進(jìn)行了附加說明:
    (1)負(fù)載均衡支持多協(xié)議,HTTP, gRPC, WebSocket, TCP;
    (2)通過路由、重試、故障轉(zhuǎn)移對(duì)流量進(jìn)行細(xì)粒度流控;
    (3)通過可插拔策略層以及可配置API,能夠支持流量訪問控制、限速、配額管理;
    (4)自動(dòng)度量、日志收集、調(diào)用跟蹤;
    (5)服務(wù)到服務(wù)的身份認(rèn)證;

Istio的核心特性是什么?
Istio強(qiáng)調(diào)了它提供的五項(xiàng)關(guān)鍵特性:

  • 流控(traffic management)

畫外音:
斷路器(circuit breakers)、超時(shí)、重試、高可用、多路由規(guī)則、AB測試、灰度發(fā)布、按照百分比分配流量等。

  • 安全(security)
    畫外音:
    加密、身份認(rèn)證、服務(wù)到服務(wù)的權(quán)限控制、K8S里容器到容器的權(quán)限控制等。

  • 可觀察(observability)
    畫外音:
    追蹤、監(jiān)控、數(shù)據(jù)收集,通過控制后臺(tái)全面了解上行下行流量,服務(wù)鏈路情況,服務(wù)運(yùn)行情況,系統(tǒng)性能情況,國內(nèi)微服務(wù)架構(gòu)體系,這一塊做得比較缺乏。

  • 平臺(tái)無關(guān)系(platform support)
    畫外音:
    K8s,物理機(jī),自己的虛機(jī)都沒問題。

  • 集成與定制(integration and customization)
    畫外音:
    可定制化擴(kuò)展功能。

Istio的吹噓與特性,對(duì)于國外很多通過RESTful提供內(nèi)網(wǎng)服務(wù)的公司,很有吸引力,但相對(duì)于國內(nèi)微服務(wù)架構(gòu),未必達(dá)到了很好的拉攏效果:
(1)國內(nèi)基本都是TCP的RPC框架,多協(xié)議支持未必是必須的;
(2)RPC框架里,路由、重試、故障轉(zhuǎn)移、負(fù)載均衡、高可用都是最基礎(chǔ)的;
(3)流控、限速、配額管理,是服務(wù)治理的內(nèi)容,在微服務(wù)架構(gòu)初期是錦上添花;
(4)自動(dòng)度量,系統(tǒng)入口出口數(shù)據(jù)收集,調(diào)用跟蹤,可觀察和可操控的后臺(tái)確實(shí)是最吸引人的;
(5)服務(wù)到服務(wù)的身份認(rèn)證,微服務(wù)基本是內(nèi)網(wǎng)訪問,在架構(gòu)初期也只是錦上添花;

另外一個(gè)花邊,為什么代理會(huì)叫sidecar proxy?


看了上圖就容易懂了,biz和proxy相生相伴,就像摩托車(motor)與旁邊的車廂(sidecar)。未來,sidecar和proxy就指微服務(wù)進(jìn)程解耦成兩個(gè)進(jìn)程之后,提供基礎(chǔ)能力的那個(gè)代理進(jìn)程。

Istio這么牛逼,它的核心架構(gòu)如何呢?

三、Istio核心架構(gòu)

關(guān)于Istio的架構(gòu)設(shè)計(jì),官網(wǎng)用了這樣一句話:

邏輯上,Istio分為:

  • 數(shù)據(jù)平面(data plane)
  • 控制平面(control plane)

這兩個(gè)詞,是Istio架構(gòu)核心,但又是大家被誤導(dǎo)最多的地方。

數(shù)據(jù)平面和控制平面,不是ServiceMesh和Istio第一次提出,它是計(jì)算機(jī)網(wǎng)絡(luò),報(bào)文路由轉(zhuǎn)發(fā)里很成熟的概念:


  • 數(shù)據(jù)平面(data plane):一般用來做快速轉(zhuǎn)發(fā)
  • 控制平面(control plane):為快速轉(zhuǎn)發(fā)提供必要的信息


畫外音:上兩圖為路由器架構(gòu)。
它的設(shè)計(jì)原則是:

  • 在一個(gè)路由設(shè)備里,轉(zhuǎn)發(fā)是最重要的工作,它具備最高的優(yōu)先級(jí),數(shù)據(jù)平面(data plane)的設(shè)計(jì)核心就是高效轉(zhuǎn)發(fā),如何在最短的時(shí)間里處理最多的包,往往使用高效內(nèi)存管理、隊(duì)列管理、超時(shí)管理等技術(shù)實(shí)現(xiàn)在硬件里
  • 控制平面(control plane)則不然,它要實(shí)現(xiàn)路由協(xié)議,設(shè)備管理,IGMP,ARP協(xié)議的,它更偏向于控制與應(yīng)用,往往由軟件實(shí)現(xiàn)

畫外音:

  • IGMP(Internet GroupManagement Protocol),一個(gè)組播協(xié)議;

  • ARP(Address ResolutionProtocol),這個(gè)大家比較熟悉,根據(jù)IP地址獲取MAC地址;

Istio的架構(gòu)核心與路由器非常類似:


  • 服務(wù)(最上面的小紅框),通過本地通訊與proxy交互
  • 數(shù)據(jù)平面,由一系列proxy組成(中間一層的兩個(gè)小紅框),核心職責(zé)是:

(1)高效轉(zhuǎn)發(fā);
(2)接收和實(shí)施來自mixer的策略;

  • 控制平面(底下的大紅框),核心是控制與應(yīng)用,核心職責(zé)是:

(1)管理和配置邊車代理;
(2)通過mixer實(shí)施策略與收集來自邊車代理的數(shù)據(jù);

畫外音:
(1)sidecar proxy,原文使用的是envoy,后文envoy表示代理;
(2)mixer,不確定要怎么翻譯了,有些文章叫“混音器”,后文直接叫mixer;
(3)pilot,galley,citadel,不敢翻譯為飛行員,廚房,堡壘,后文直接用英文;
如架構(gòu)圖所示,該兩層架構(gòu)中,有五個(gè)核心組件。

3.1 數(shù)據(jù)平面核心組件Envoy (proxy)

Envoy的核心職責(zé)是高效轉(zhuǎn)發(fā),更具體的,它具備這樣一些能力:
(1)服務(wù)發(fā)現(xiàn)
(2)負(fù)載均衡
(3)安全傳輸
(4)多協(xié)議支持,例如HTTP/2,gRPC
(5)斷路器(Circuit breakers)
(6)健康檢查
(7)百分比分流路由
(8)故障注入(Fault injection)
(9)系統(tǒng)度量
大部分能力是RPC框架都具備,或者比較好理解的,這里面重點(diǎn)介紹下斷路器和故障注入。

3.1.1 斷路器設(shè)計(jì)

它是軟件架構(gòu)設(shè)計(jì)中,一個(gè)服務(wù)自我保護(hù),或者說降級(jí)的設(shè)計(jì)思路。

舉個(gè)例子:當(dāng)系統(tǒng)檢測出某個(gè)接口有大量超時(shí)時(shí),斷路器策略可以終止對(duì)這個(gè)接口的調(diào)用(斷路器打開),經(jīng)過一段時(shí)間后,再次嘗試調(diào)用,如果接口不再超時(shí),則慢慢恢復(fù)調(diào)用(斷路器關(guān)閉)。

3.1.2 故障注入設(shè)計(jì)

它是軟件架構(gòu)設(shè)計(jì)中,一種故意引入故障,以擴(kuò)大測試覆蓋范圍,保障系統(tǒng)健壯性的方法,主要用于測試。

國內(nèi)大部分互聯(lián)網(wǎng)公司,架構(gòu)設(shè)計(jì)中不太會(huì)考慮故障注入,在操作系統(tǒng)內(nèi)核開發(fā)與調(diào)試,路由器開發(fā)與調(diào)試中經(jīng)常使用,可以用來模擬內(nèi)存分配失敗、磁盤IO錯(cuò)誤等一些非常難出現(xiàn)的異常,以確保測試覆蓋度。

3.2 控制平面核心組件

3.2.1 Mixer

Mixer的一些核心能力是:
(1)跨平臺(tái),作為其他組件的adapter,實(shí)現(xiàn)Istio跨平臺(tái)的能力;
(2)和Envoy通訊,實(shí)時(shí)各種策略
(3)和Envoy通訊,收集各種數(shù)據(jù)
Mixer的設(shè)計(jì)核心在于“插件化”,這種模型使得Istio能夠適配各種復(fù)雜的主機(jī)環(huán)境,以及后端基礎(chǔ)設(shè)施。

3.2.2 Pilot

Pilot作為非常重要的控制平面組件,其核心能力是:
(1)為Envoy提供服務(wù)發(fā)現(xiàn)能力;
(2)為Envoy提供各種智能路由管理能力,例如A/B測試,灰度發(fā)布;
(3)為Envoy提供各種彈性管理能力,例如超時(shí),重試,斷路策略;
Pilot的設(shè)計(jì)核心在于“標(biāo)準(zhǔn)化”,它會(huì)將各種流控的控制命令轉(zhuǎn)化為Envoy能夠識(shí)別的配置,并在運(yùn)行時(shí),將這些指令擴(kuò)散到所有的Envoy。Pilot將這些能力抽象成通用配置的好處是,所有符合這種標(biāo)準(zhǔn)的Envoy都能夠接入到Pilot來。
潛臺(tái)詞是,任何第三方可以實(shí)現(xiàn)自己的proxy,只要符合相關(guān)的API標(biāo)準(zhǔn),都可以和Pilot集成。

3.2.3 Citadel

Citadel組件,它提供終端用戶身份認(rèn)證,以及服務(wù)到服務(wù)的訪問控制。總之,這是一個(gè)和安全相關(guān)的組件。

3.2.4 Galley

Gally組件,它是一個(gè)配置獲取、校驗(yàn)、處理、分發(fā)的組件,它的設(shè)計(jì)核心在于“解耦”,它將“從底層平臺(tái)(例如:K8S)獲取用戶配置”與Istio解耦開來。

3.3 總結(jié)


Istio采用二層架構(gòu),五大模塊,進(jìn)行微服務(wù)ServiceMesh解耦:

數(shù)據(jù)平面,主要負(fù)責(zé)高效轉(zhuǎn)發(fā)

(1)envoy模塊:即proxy;

  • 控制平面,主要負(fù)責(zé)控制與應(yīng)用

(2)mixer模塊:支持跨平臺(tái),標(biāo)準(zhǔn)化API的adapter;
(3)pilot模塊:控制與配置envoy的大部分策略;
(4)citadel模塊:安全相關(guān);
(5)galley模塊:與底層平臺(tái)(例如:K8S)配置解耦;

實(shí)施與控制分離,經(jīng)典的架構(gòu)設(shè)計(jì)方法,GOT?

思路比結(jié)論重要。

參考https://juejin.im/post/5d02771a6fb9a07ee30e14a1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容