1. istio 組件構成
以下是istio 1.1 官方架構圖:
雖然Istio 支持多個平臺, 但將其與 Kubernetes 結合使用,其優勢會更大, Istio 對Kubernetes 平臺支持也是最完善的, 本文將基於Istio + Kubernetes 進行展開.
如果安裝了grafana, prometheus, kiali, jaeger等組件的情況下, 一個完整的控制面組件包括以下pod:
% kubectl -n istio-system get pod
NAME READY STATUS
grafana-5f54556df5-s4xr4 1/1 Running
istio-citadel-775c6cfd6b-8h5gt 1/1 Running
istio-galley-675d75c954-kjcsg 1/1 Running
istio-ingressgateway-6f7b477cdd-d8zpv 1/1 Running
istio-pilot-7dfdb48fd8-92xgt 2/2 Running
istio-policy-544967d75b-p6qkk 2/2 Running
istio-sidecar-injector-5f7894f54f-w7f9v 1/1 Running
istio-telemetry-777876dc5d-msclx 2/2 Running
istio-tracing-5fbc94c494-558fp 1/1 Running
kiali-7c6f4c9874-vzb4t 1/1 Running
prometheus-66b7689b97-w9glt 1/1 Running
Service Mesh 的Sidecar 模式要求對數據面的用戶Pod進行代理的注入, 注入的代理容器會去處理服務治理領域的各種「髒活累活」, 使得用戶容器可以專心處理業務邏輯.
從上圖可以看出, Istio 控制面本身就是一個複雜的微服務系統, 該系統包含多個組件Pod, 每個組件 各司其職, 既有單容器Pod, 也有多容器Pod, 既有單進程容器, 也有多進程容器, 每個組件會調用不同的命令, 各組件之間會通過RPC進行寫作, 共同完成對數據面用戶服務的管控.
2. Istio 源碼, 鏡像和命令
Isito 項目代碼主要由以下2個git 倉庫組成:
倉庫地址 | 語言 | 模塊 |
---|---|---|
https://github.com/istio/istio | Go | 包含istio控制面的大部分組件: pilot, mixer, citadel, galley, sidecar-injector等, |
https://github.com/istio/proxy | C++ | 包含 istio 使用的邊車代理, 這個邊車代理包含envoy和mixer client兩塊功能 |
2.1 istio/istio
https://github.com/istio/istio 包含的主要的鏡像和命令:
容器名 | 鏡像名 | 啓動命令 | 源碼入口 |
---|---|---|---|
Istio_init | istio/proxy_init | istio-iptables.sh | istio/tools/deb/istio-iptables.sh |
istio-proxy | istio/proxyv2 | pilot-agent | istio/pilot/cmd/pilot-agent |
sidecar-injector-webhook | istio/sidecar_injector | sidecar-injector | istio/pilot/cmd/sidecar-injector |
discovery | istio/pilot | pilot-discovery | istio/pilot/cmd/pilot-discovery |
galley | istio/galley | galley | istio/galley/cmd/galley |
mixer | istio/mixer | mixs | istio/mixer/cmd/mixs |
citadel | istio/citadel | istio_ca | istio/security/cmd/istio_ca |
另外還有2個命令不在上圖中使用:
命令 | 源碼入口 | 作用 |
---|---|---|
mixc | istio/mixer/cmd/mixc | 用於和Mixer server 交互的客戶端 |
node_agent | istio/security/cmd/node_agent | 用於node上安裝安全代理, 這在Mesh Expansion特性中會用到, 即k8s和vm打通. |
2.2 istio/proxy
https://github.com/istio/proxy 該項目本身不會產出鏡像, 它可以編譯出一個name = "Envoy"
的二進制程序, 該二進制程序會被ADD到istio的邊車容器鏡像istio/proxyv2
中.
istio proxy 項目使用的編譯方式是Google出品的bazel, bazel可以直接在編譯中引入第三方庫,加載第三方源碼.
這個項目包含了對Envoy源碼的引用,還在此基礎上進行了擴展,這些擴展是通過Envoy filter(過濾器)的形式來提供,這樣做的目的是讓邊車代理將策略執行決策委託給Mixer,因此可以理解istio proxy 這個項目有2大功能模塊:
- Envoy: 使用到Envoy的全部功能
- mixer client: 測量和遙測相關的客戶端實現, 基於Envoy做擴展,通過RPC和Mixer server 進行交互, 實現策略管控和遙測
後續我將對以上各個模塊、命令以及它們之間的協作進行探究.
3. Istio Pod 概述
3.1 數據面用戶Pod
數據面用戶Pod注入的內容包括:
-
initContainer
istio-init
: 通過配置iptables來劫持Pod中的流量, 轉發給envoy -
sidecar container
istio-proxy
: 包含2個進程, 父進程pliot-agent 初始化並管控envoy, 子進程envoy除了包含原生envoy的功能外, 還加入了mixer client的邏輯.
主要端口:
--statusPort
status server 端口, 默認爲0, 表示不啓動, istio啓動時通常傳遞爲15020--proxyAdminPort
代理管理端口, 默認 15000
注意以上參數雖然是啓動時傳遞給父進程pliot-agent
, 但實際上監聽以上端口的進程是子進程envoy.
3.2 istio-sidecar-injector
包含一個單容器, sidecar-injector-webhook
: 啓動一個http server, 接受kube api server 的Admission Webhook 請求, 對用戶pod進行sidecar注入.
進程爲sidecar-injector
, 主要監聽端口:
--port
Webhook服務端口, 默認443, 通過k8s serviceistio-sidecar-injector
對外提供服務。
3.3 istio-galley
包含一個單容器 galley
: 提供 istio 中的配置管理服務, 驗證Istio的CRD 資源的合法性.
進程爲galley server ......
, 主要監聽端口:
--server-address
galley gRPC 地址, 默認是tcp://0.0.0.0:9901--validation-port
https端口, 提供驗證crd合法性服務的端口, 默認443.--monitoringPort
http 端口, self-monitoring 端口, 默認 15014
以上端口通過k8s serviceistio-galley
對外提供服務。
3.4 istio-pilot
pilot組件核心Pod, 對接平臺適配層, 抽象服務註冊信息、流量控制模型等, 封裝統一的 API,供 Envoy 調用獲取.
包含以下容器:
-
sidecar container
istio-proxy
-
container
discovery
: 進程爲pilot-discovery discovery ......
主要監聽端口:
- 15010: 通過grpc 提供的 xds 獲取接口
- 15011: 通過https 提供的 xds 獲取接口
- 8080: 通過http 提供的 xds 獲取接口, 兼容v1版本, 另外 http readiness 探針
/ready
也在該端口 --monitoringPort
http self-monitoring 端口, 默認 15014
以上端口通過k8s serviceistio-pilot
對外提供服務
3.5 istio-telemetry 和istio-policy
mixer 組件包含2個pod, istio-telemetry 和 istio-policy, istio-telemetry負責遙測功能, istio-policy 負責策略控制, 它們分別包含2個容器:
-
sidecar container
istio-proxy
-
mixer
: 進程爲mixs server ……
主要監聽端口:
- 9091: grpc-mixer
- 15004: grpc-mixer-mtls
--monitoring-port
: http self-monitoring 端口, 默認 15014, liveness 探針/version
3.7 istio-citadel
負責安全和證書管理的Pod, 包含一個單容器 citadel
啓動命令/usr/local/bin/istio_ca --self-signed-ca ......
主要監聽端口:
--grpc-port
citadel grpc 端口, 默認8060--monitoring-port
: http self-monitoring 端口, 默認 15014, liveness 探針/version
以上端口通過k8s serviceistio-citadel
對外提供服務。
後續將對各組件逐一進行分析。