SM,Istio,聞所未聞?實施與控制分離的架構設計方法!
上一章《SM,它解決什么問題?》聊了ServiceMesh的緣起。要聊ServiceMesh,就不得不提Istio,它是ServiceMesh的最流行實踐,今天聊聊Istio。

什么是Istio?
Istio是ServiceMesh的落地化產品,它:
- 幫助微服務之間建立連接,幫助研發團隊更好的管理與監控微服務,并使得系統架構更加安全;
畫外音:Istio helps you to connect, secure, control, and observe microservices.
- 幫助微服務分層解耦,解耦后的proxy層能夠更加專注于提供基礎架構能力,例如:服務發現(discovery), 負載均衡(load balancing), 故障恢復(failure recovery), 服務度量(metrics), 服務監控(monitoring), A/B測試(A/B testing), 灰度發布(canary rollouts), 限流限速(rate limiting), 訪問控制(access control), 身份認證(end-to-end authentication)...
- 使得業務工程團隊與基礎架構團隊都更加高效的工作,各自專注于自己的工作,更好的彼此賦能;
畫外音:說的還是解耦。
為什么要用Istio?
Istio官網是這么說的:
(1) 可以通過,在現有服務器新增部署邊車代理(sidecar proxy),應用程序不用改代碼,或者只需要改很少的代碼,就能實現上述N項基礎功能;
畫外音:你信了么?
(2) 可以通過,控制后臺,簡單改改配置,點點按鈕,就能管理和查看上述N項基礎功能;
(3) 以下特性,Istio在這個環節里進行了附加說明:
- 支持多協議,HTTP, gRPC, WebSocket, TCP
- 通過路由、重試、故障轉移對流量進行細粒度流控
- 通過可插拔策略層以及可配置API,能夠支持流量訪問控制、限速、配額管理
- 自動度量、日志收集、調用跟蹤
- 服務到服務的身份認證
Istio的核心特性是什么?
Istio強調了它提供的五項關鍵特性:
(1) 流控(traffic management)
斷路器(circuit breakers)、超時、重試、高可用、多路由規則、AB測試、灰度發布、按照百分比分配流量等。
(2) 安全(security)
加密、身份認證、服務到服務的權限控制、K8S里容器到容器的權限控制等。
(3) 可觀察(observability)
追蹤、監控、數據收集,通過控制后臺全面了解上行下行流量,服務鏈路情況,服務運行情況,系統性能情況,國內微服務架構體系,這一塊做得不夠好。
(4) 平臺無關系(platform support)
K8s,物理機,自己的虛機都沒問題。
(5) 集成與定制(integration and customization)
可定制化擴展功能。
Istio的特性,對于國外很多通過RESTful提供內網服務的公司,很有吸引力,但相對于國內微服務架構,未必達到了很好的拉攏效果:
- 國內基本都是TCP的RPC框架,多協議支持未必是必須的;
- RPC框架里,路由、重試、故障轉移、負載均衡、高可用都是最基礎的;
- 流控、限速、配額管理,是服務治理的內容,在微服務架構初期是錦上添花;
- 自動度量,系統入口出口數據收集,調用跟蹤,可觀察和可操控的后臺確實是最吸引人的;
- 服務到服務的身份認證,微服務基本是內網訪問,在架構初期也只是錦上添花;
另外,為什么Istio代理會叫sidecar proxy?

看了上圖就容易懂了,biz和proxy相生相伴,就像摩托車(motor)與旁邊的車廂(sidecar)。后文,sidecar和proxy就指微服務進程解耦成兩個進程之后,提供基礎能力的那個代理進程。
Istio這么牛逼,它的核心架構如何呢?
官網用了這樣一句話:

邏輯上,Istio分為:
- 數據平面(data plane);
- 控制平面(control plane);
這兩個詞,是Istio架構核心。
數據平面和控制平面,不是ServiceMesh和Istio第一次提出,它是計算機網絡,報文路由轉發里很成熟的概念:

- 數據平面(data plane):一般用來做快速轉發;
- 控制平面(control plane):為快速轉發提供必要的信息;

畫外音:上兩圖為路由器架構。
它的設計原則是:
- 在一個路由設備里,轉發是最重要的工作,它具備最高的優先級,數據平面(data plane)的設計核心就是高效轉發,如何在最短的時間里處理最多的包,往往使用高效內存管理、隊列管理、超時管理等技術實現在硬件里;
- 控制平面(control plane)則不然,它要實現路由協議,設備管理,IGMP,ARP協議的,它更偏向于控制與應用,往往由軟件實現;
畫外音:
- IGMP(Internet GroupManagement Protocol),一個組播協議;
- ARP(Address ResolutionProtocol),這個大家比較熟悉,根據IP地址獲取MAC地址;
Istio的架構核心與路由器非常類似:

(1) 服務(最上面的小紅框),通過本地通訊與proxy交互;
(2) 數據平面,由一系列proxy組成(中間一層的兩個小紅框),核心職責是:
- 高效轉發
- 接收和實施來自mixer的策略
(3) 控制平面(底下的大紅框),核心是控制與應用,核心職責是:
- 管理和配置邊車代理
- 通過mixer實施策略與收集來自邊車代理的數據
如架構圖所示,該兩層架構中,有五個核心組件。
數據平面,有幾個核心組件?
(1) Envoy (proxy)
Envoy的核心職責是高效轉發,更具體的,它具備這樣一些能力:
- 服務發現
- 負載均衡
- 安全傳輸
- 多協議支持,例如HTTP/2,gRPC
- 斷路器(Circuit breakers)
- 健康檢查
- 百分比分流路由
- 故障注入(Fault injection)
- 系統度量
大部分能力是RPC框架都具備,或者比較好理解的,這里面重點介紹下斷路器和故障注入。
(2) 斷路器設計
它是軟件架構設計中,一個服務自我保護,或者說降級的設計思路。
舉個例子:當系統檢測出某個接口有大量超時時,斷路器策略可以終止對這個接口的調用(斷路器打開),經過一段時間后,再次嘗試調用,如果接口不再超時,則慢慢恢復調用(斷路器關閉)。
(3) 故障注入設計
它是軟件架構設計中,一種故意引入故障,以擴大測試覆蓋范圍,保障系統健壯性的方法,主要用于測試。
國內大部分互聯網公司,架構設計中不太會考慮故障注入,在操作系統內核開發與調試,路由器開發與調試中經常使用,可以用來模擬內存分配失敗、磁盤IO錯誤等一些非常難出現的異常,以確保測試覆蓋度。
控制平面,有幾個核心組件?
(1) Mixer
Mixer的一些核心能力是:
- 跨平臺,作為其他組件的adapter,實現Istio跨平臺的能力;
- 和Envoy通訊,實施各種策略;
- 和Envoy通訊,收集各種數據;
Mixer的設計核心在于“插件化”,這種模型使得Istio能夠適配各種復雜的主機環境,以及后端基礎設施。
(2) Pilot
Pilot作為非常重要的控制平面組件,其核心能力是:
- 為Envoy提供服務發現能力;
- 為Envoy提供各種智能路由管理能力,例如A/B測試,灰度發布;
- 為Envoy提供各種彈性管理能力,例如超時,重試,斷路策略;
Pilot的設計核心在于“標準化”,它會將各種流控的控制命令轉化為Envoy能夠識別的配置,并在運行時,將這些指令擴散到所有的Envoy。Pilot將這些能力抽象成通用配置的好處是,所有符合這種標準的Envoy都能夠接入到Pilot來。
潛臺詞是,任何第三方可以實現自己的proxy,只要符合相關的API標準,都可以和Pilot集成。
(3) Citadel
Citadel組件,它提供終端用戶身份認證,以及服務到服務的訪問控制。總之,這是一個和安全相關的組件。
(4) Galley
Galley組件,它是一個配置獲取、校驗、處理、分發的組件,它的設計核心在于“解耦”,它將“從底層平臺(例如:K8S)獲取用戶配置”與Istio解耦開來。
總結

Istio采用二層架構,五大模塊,進行微服務ServiceMesh解耦:
(1) 數據平面,主要負責高效轉發:envoy:即proxy
(2) 控制平面,主要負責控制與應用:
- mixer:支持跨平臺,標準化API的adapter
- pilot:控制與配置envoy的大部分策略
- citadel:安全相關
- galley:與底層平臺(例如:K8S)配置解耦
實施與控制分離,經典的架構設計方法,你學會了嗎?
知其然,知其所以然。
思路比結論更重要。



























