Istio 庖丁解牛一:組件概覽

做者: 鍾華,騰訊雲容器團隊高級工程師,熱衷於容器、微服務、service mesh、istio、devops 等領域技術。本文轉載自其博客,原文地址:imfox.me/2019/03/11/…node

Istio 做爲 Service Mesh 領域的集大成者, 提供了流控, 安全, 遙測等模型, 其功能複雜, 模塊衆多, 有較高的學習和使用門檻, 本文會對istio 1.1 的各組件進行分析, 但願能幫助讀者瞭解istio各組件的職責、以及相互的協做關係.git

1. istio 組件構成

如下是istio 1.1 官方架構圖:github

雖然Istio 支持多個平臺, 但將其與 Kubernetes 結合使用,其優點會更大, Istio 對Kubernetes 平臺支持也是最完善的, 本文將基於Istio + Kubernetes 進行展開.web

若是安裝了grafana, prometheus, kiali, jaeger等組件的狀況下, 一個完整的控制面組件包括如下pod:api

% 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複製代碼

將istio系統組件細化到進程級別, 大概是這個樣子:安全

查看高清原圖bash

Service Mesh 的Sidecar 模式要求對數據面的用戶Pod進行代理的注入, 注入的代理容器會去處理服務治理領域的各類「髒活累活」, 使得用戶容器能夠專心處理業務邏輯.架構

從上圖能夠看出, Istio 控制面自己就是一個複雜的微服務系統, 該系統包含多個組件Pod, 每一個組件 各司其職, 既有單容器Pod, 也有多容器Pod, 既有單進程容器, 也有多進程容器, 每一個組件會調用不一樣的命令, 各組件之間會經過RPC進行寫做, 共同完成對數據面用戶服務的管控.tcp

2. Istio 源碼, 鏡像和命令

Isito 項目代碼主要由如下2個git 倉庫組成:ide

倉庫地址 語言 模塊
github.com/istio/istio Go 包含istio控制面的大部分組件: pilot, mixer, citadel, galley, sidecar-injector等,
github.com/istio/proxy C++ 包含 istio 使用的邊車代理, 這個邊車代理包含envoy和mixer client兩塊功能

2.1 istio/istio

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

github.com/istio/proxy 該項目自己不會產出鏡像, 它能夠編譯出一個name = "Envoy"的二進制程序, 該二進制程序會被ADD到istio的邊車容器鏡像istio/proxyv2中.

istio proxy 項目使用的編譯方式是Google出品的bazel, bazel能夠直接在編譯中引入第三方庫,加載第三方源碼.

這個項目包含了對Envoy源碼的引用,還在此基礎上進行了擴展,這些擴展是經過Envoy filter(過濾器)的形式來提供,這樣作的目的是讓邊車代理將策略執行決策委託給Mixer,所以能夠理解istio proxy 這個項目有2大功能模塊:

  1. Envoy: 使用到Envoy的所有功能

  2. mixer client: 測量和遙測相關的客戶端實現, 基於Envoy作擴展,經過RPC和Mixer server 進行交互, 實現策略管控和遙測

後續我將對以上各個模塊、命令以及它們之間的協做進行探究.

3. Istio Pod 概述

3.1 數據面用戶Pod

數據面用戶Pod注入的內容包括:

  1. initContainer istio-init: 經過配置iptables來劫持Pod中的流量, 轉發給envoy

  2. 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 調用獲取.

包含如下容器:

  1. sidecar container istio-proxy

  2. 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個容器:

  1. sidecar containeristio-proxy

  2. 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對外提供服務。

後續將對各組件逐一進行分析。

相關文章
相關標籤/搜索