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控制的元素...