Istio 庖丁解牛一 元件概覽

2021-09-24 06:54:02 字數 4610 閱讀 9364

istio 作為 service mesh 領域的集大成者, 提供了流控, 安全, 遙測等模型, 其功能複雜, 模組眾多, 有較高的學習和使用門檻, 本文會對istio 1.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複製**
將istio系統元件細化到程序級別, 大概是這個樣子:

檢視高畫質原圖

service mesh 的sidecar 模式要求對資料面的使用者pod進行**的注入, 注入的**容器會去處理服務治理領域的各種「髒活累活」, 使得使用者容器可以專心處理業務邏輯.

從上圖可以看出, istio 控制面本身就是乙個複雜的微服務系統, 該系統包含多個元件pod, 每個元件 各司其職, 既有單容器pod, 也有多容器pod, 既有單程序容器, 也有多程序容器, 每個元件會呼叫不同的命令, 各元件之間會通過rpc進行寫作, 共同完成對資料面使用者服務的管控.

isito 專案**主要由以下2個git 倉庫組成:

倉庫位址

語言模組

go包含istio控制面的大部分元件: pilot, mixer, citadel, galley, sidecar-injector等,

c++包含 istio 使用的邊車**, 這個邊車**包含envoy和mixer client兩塊功能

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打通.

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 進行互動, 實現策略管控和遙測

後續我將對以上各個模組、命令以及它們之間的協作進行**.

資料面使用者pod注入的內容包括:

initcontaineristio-init: 通過配置iptables來劫持pod中的流量, **給envoy

sidecar containeristio-proxy: 包含2個程序, 父程序pliot-agent 初始化並管控envoy, 子程序envoy除了包含原生envoy的功能外, 還加入了mixer client的邏輯.

主要埠:

注意以上引數雖然是啟動時傳遞給父程序pliot-agent, 但實際上監聽以上埠的程序是子程序envoy.

包含乙個單容器,sidecar-injector-webhook: 啟動乙個http server, 接受kube api server 的admission webhook 請求, 對使用者pod進行sidecar注入.

程序為sidecar-injector, 主要監聽埠:

包含乙個單容器galley: 提供 istio 中的配置管理服務, 驗證istio的crd 資源的合法性.

程序為galley server ......, 主要監聽埠:

以上埠通過k8s serviceistio-galley對外提供服務。

pilot元件核心pod, 對接平台適配層, 抽象服務註冊資訊、流量控制模型等, 封裝統一的 api,供 envoy 呼叫獲取.

包含以下容器:

sidecar containeristio-proxy

containerdiscovery: 程序為pilot-discovery discovery ......

主要監聽埠:

以上埠通過k8s serviceistio-pilot對外提供服務

mixer 元件包含2個pod, istio-telemetry 和 istio-policy, istio-telemetry負責遙測功能, istio-policy 負責策略控制, 它們分別包含2個容器:

sidecar containeristio-proxy

mixer: 程序為mixs server ……

主要監聽埠:

負責安全和證書管理的pod, 包含乙個單容器citadel

啟動命令/usr/local/bin/istio_ca --self-signed-ca ......主要監聽埠:

以上埠通過k8s serviceistio-citadel對外提供服務。

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

Spring註解(一) 元件註解

1 configuration 告訴spring這是乙個配置類 2 bean 給容器中註冊乙個bean 型別為返回值的型別,id預設是用方法名作為id 預設是單例項 3 componentscan 包掃瞄,自動把 controller service repository component下的元件...

spring整理(一)元件整合

簡單來說,spring 框架是乙個分層架構,由 7 個定義良好的模組組成的輕量級開源框架。spring模組構建在核心容器之上,核心容器定義了建立 配置和管理 bean 的方式,它是乙個基於ioc di和aop的構架多層j2ee系統的框架。可以說spring是企業應用開發的 一站式 選擇,並貫穿表現層...

Vue元件基礎 一 元件的建立

這裡簡單介紹一下元件建立的三種方法 方式1 extend建立的元件 用乙個變數接收extend建立的元件 var com vue.extend 然後把建立好的元件放入到vue中 vue.component first component com 第二種 註冊全域性元件 注意元件必須在vue控制的元素...