Istio
Last updated
Last updated
Istio 是 Google、IBM 和 Lyft 聯合開源的服務網格(Service Mesh)框架,旨在解決大量微服務的發現、連接、管理、監控以及安全等問題。Istio 對應用是透明的,不需要改動任何服務代碼就可以實現透明的服務治理。
Istio 的主要特性包括:
HTTP、gRPC、WebSocket 和 TCP 網絡流量的自動負載均衡
細粒度的網絡流量行爲控制, 包括豐富的路由規則、重試、故障轉移和故障注入等
可選策略層和配置 API 支持訪問控制、速率限制以及配額管理
自動度量、日誌記錄和跟蹤所有進出的流量
強大的身份認證和授權機制實現服務間的安全通信
Istio 從邏輯上可以分爲數據平面和控制平面:
數據平面主要由一系列的智能代理(默認爲 Envoy)組成,管理微服務之間的網絡通信
控制平面負責管理和配置代理來路由流量,並配置 Mixer 以進行策略部署和遙測數據收集
Istio 架構可以如下圖所示
它主要由以下組件構成
Envoy:Lyft 開源的高性能代理,用於調解服務網格中所有服務的入站和出站流量。它支持動態服務發現、負載均衡、TLS 終止、HTTP/2 和 gPRC 代理、熔斷、健康檢查、故障注入和性能測量等豐富的功能。Envoy 以 sidecar 的方式部署在相關的服務的 Pod 中,從而無需重新構建或重寫代碼。
Mixer:負責訪問控制、執行策略並從 Envoy 代理中收集遙測數據。Mixer 支持靈活的插件模型,方便擴展(支持 GCP、AWS、Prometheus、Heapster 等多種後端)。
Pilot:動態管理 Envoy 實例的生命週期,提供服務發現、智能路由和彈性流量管理(如超時、重試)等功能。它將流量管理策略轉化爲 Envoy 數據平面配置,並傳播到 sidecar 中。
Pilot 爲 Envoy sidecar 提供服務發現功能,爲智能路由(例如 A/B 測試、金絲雀部署等)和彈性(超時、重試、熔斷器等)提供流量管理功能。它將控制流量行爲的高級路由規則轉換爲特定於 Envoy 的配置,並在運行時將它們傳播到 sidecar。Pilot 將服務發現機制抽象爲符合 Envoy 數據平面 API 的標準格式,以便支持在多種環境下運行並保持流量管理的相同操作接口。
Citadel 通過內置身份和憑證管理提供服務間和最終用戶的身份認證。支持基於角色的訪問控制、基於服務標識的策略執行等。
在數據平面上,除了 Envoy,還可以選擇使用 nginxmesh、linkerd 等作爲網絡代理。比如,使用 nginxmesh 時,Istio 的控制平面(Pilot、Mixer、Auth)保持不變,但用 Nginx Sidecar 取代 Envoy:
Istio 的安裝部署步驟見 這裏。
爲 Pod 注入 Sidecar 容器後才能成爲服務網格的一部分。Istio 要求 Pod 必須滿足以下條件:
Pod 要關聯服務並且必須屬於單一的服務,不支持屬於多個服務的 Pod
端口必須要命名,格式爲 <協議>[-<後綴>]
,其中協議包括 http
、http2
、grpc
、mongo
以及 redis
。否則會被視爲 TCP 流量
推薦所有 Deployment 中增加 app
標籤,用來在分佈式跟蹤中添加上下文信息
以下步驟假設命令行終端在 安裝部署 時下載的
istio-${ISTIO_VERSION}
目錄中。
在部署應用時,可以通過 istioctl kube-inject
給 Pod 手動插入 Envoy sidecar 容器,即
原始應用如下圖所示
istioctl kube-inject
在原始應用的每個 Pod 中插入了一個 Envoy 容器
服務啓動後,可以通過 Gateway 地址 http://<gateway-address>/productpage
來訪問 BookInfo 應用:
默認情況下,三個版本的 reviews 服務以負載均衡的方式輪詢。
首先確認 admissionregistration
API 已經開啓:
然後確認 istio-sidecar-injector 正常運行
爲需要自動注入 sidecar 的 namespace 加上標籤 istio-injection=enabled
:
這樣,在 default namespace 中創建 Pod 後自動添加 istio sidecar 容器。