參考
1. Istio Chart 目錄結構
- PATH:
istio-1.1.7/install/kubernetes/helm
1.1 Chart.yaml
- Chart 的基礎信息文件,其中包含版本號,名稱,關鍵字等元數據信息。
1.2 values-*.yaml
- 提供 istio 在各種場景下的關鍵配置范本,范本文件可以作為 helm 的輸入文件,對 istio 進行典型定制;
- 對輸入文件改寫后,使用
helm template
命令生成最終的部署文件。
1.3 requirements.yaml
- 用於管理對子 Chart 的依賴關系,其中定義了一系列開關變量‘
- 在 helm 的輸入內容中對相關變量進行定義,就可以對 istio 的部署文件進行修改,來控制對應組件的啟用狀態。
1.4 templates
1.4.1 _affinity.tpl
- 生成一組節點親和或互斥元素,供各個組件在渲染 yaml 時使用;
- 在該文件里使用一系列變量,用於控制 istio 組件的節點親和性,即 istio 在部署時對節點的選擇。
- 定義了兩個局部模版:
- nodeAffinityRequiredDuringScheduling: 會根據全局變量中的 arch 參數對部署節點進行限制;istio 組件的 pod 會根據 arch 參數中的服務器類型列表來決定是否部署到某一台服務器上,並根據各種服務器類型的權重來決定優先級。
- nodeAffinityPreferredDuringScheduling: 類似
nodeAffinityRequiredDuringScheduling
,但是軟限制
1.4.2 sidecar-injector-configmap.yaml
- 該文件最終會生成一個
ConfigMap
對象,在該對象中保存的配置數據被用於進行Sidecar
注入; - istio 完成的手工注入或自動注入,都會引用這個
ConfigMap
對象,即如果希望修改 istio 的Sidecar
的注入過程及具體行為,可以從該文件或對應的ConfigMap
入手。
1.4.3 configmap.yaml
- 生成名為
istio
的ConfigMap
對象,用於為 Pilot 提供啟動配置數據。
1.5 charts
目錄中的子目錄就是istio組件:
- certmanager: 一個基於 Jetstack Cert-Manager 項目的 ACME 證書客戶端,用於自動進行證書的申請,獲取與分發。
- galley:istio 利用 galley 進行配置管理工作。
- gateways: 對 gateways chart 進行配置,可以安裝多個 gateway controller。
- grafana:圖形化的 istio dashboard。
- ingress: 遺留設計,默認關閉,在流量控制協議升級到 network.istio.io/v1alpha3 之后關閉,已建議棄用。
- kiali: 帶有分布式跟蹤,配置校驗等多項功能的 dashboard。
- mixer: istio 的策略實施組件。
- pilot: istio 的流量管理組件。
- prometheus: 監控軟件,其中包含 istio 特定的指標抓取設置。
- security: citadel 組件,用於證書自動管理。
- servicegraph:分布式跟蹤組件,用於獲取和展示服務調用關系圖,即將廢除。
- sidecarInjectorWebhook:自動注入 Webhook 的相關配置。
- tracing:分布式跟蹤組件,使用 Jaeger 實現,替代原 servicegraph 組件。
2. 全局變量
istio chart 分為父子兩層,因此變量具有全局與本地兩級。
- 全局變量使用保留字
global
進行定義; - 子 chart 可以通過 values.global的方式引用全局變量;
- 在主 chart 中也可以用 chart.var 的方式為子 chart 指定變量值。
2.1 hub & tag
- 在多數情況下,這兩個變量代表所有鏡像的地址,具體名稱一般以
{{ .Values.global.hub }}/[component]/:{{ .Values.global.tag }}
的形式拼接而成; - 在
proxy_init
,Mixer
,Grafana
與Pilot
的 Deployment 模板中 ,一旦在其 image 變量中包含路徑符 "/" ,則會棄用global.hub
,直接采用 image 的定義。
2.2 ingress.enabled
- 用來控制是否啟用 istio 的 ingress controller;
- 設置為 True ,就會啟用對 Kubernetes Ingress 資源的支持,這是一個兼容功能,istio 並不推薦 ingress 的使用方式,建議使用 ingress gateway 取代;
- k8sIngressSelector & k8sIngressHttps 兩個變量受 ingress.enabled 影響(設置為 True 時,兩個變量相關內容才生效)。
2.3 proxy相關參數
在 values.yaml 中定義了一組 proxy 變量,用於對 Sidecar 進行控制。
2.3.1 proxy.resources
- 用於為 Sidecar 分配資源。
2.3.2 proxy.concurrency
- Proxy Worker 的線程數量;
- 如果被設置為
0
(default),則根據 CPU 線程或核的數量進行分配。
2.3.3 proxy.accessLogFile
- Sidecar 的訪問日志位置;
- 如果被設置為空字符串,表示關閉訪問日志功能;
- 默認值:/dev/stdout 。
2.3.4 proxy.privileged
- istio-init & istio-proxy 的特權模式開關,默認值
false
。
2.3.5 proxy.enableCoreDump
- 如果打開,則新注入的 Sidecar 會啟動 CoreDump 功能,在 Pod 中加入初始化容器
enable-core-dump
; - 默認值
false
。
2.3.6 proxy.includeIPRanges
- 劫持 IP 范圍的白名單;
- 默認值
*
,表示劫持所有流量; - 在
sidecar-injector-configmap.yaml
中應用了這個變量,用於生成istio-sidecar-injector
這個ConfigMap
,此ConfigMap
設置了 istio-init 的運行參數,proxy.includeIPRanges
通過對 istio-init 的"-i" 參數進行修改來完成這一個任務。
2.3.7 proxy.excludeIPRanges
- 劫持 IP 范圍的黑名單;
- 默認值為空字符串,表示劫持該范圍以外的IP;
proxy.excludeIPRanges
影響 istio-init 的"-x" 參數。
2.3.8 proxy.includeInboundPorts
- 入站流量的端口劫持白名單;
- 所有從范圍內的端口進入 Pod 的流量都會被劫持;
proxy.includeInboundPorts
影響 istio-init 的"-b" 參數。
2.3.9 proxy.excludeInboundPorts
- 入站流量的端口劫持黑名單;
- 端口范圍之外的入站流量會被劫持;
proxy.excludeInboundPorts
影響 istio-init 的"-d" 參數。
2.3.10 proxy.autoInject
- 用於控制是否自動完成 Sidecar 的注入工作。
2.3.11 proxy.envoyStatsd
- 默認值如下:
- enabled: true
- host: istio-statsd-prom-bridge
- port: 9125
- 參數會設置 Envoy 的 "--statsdUdpAddress" 參數,在某些參數下(如沒有安裝 Mixer)可以關閉。
2.4 proxy_init.image
- 用於指定初始化容器鏡像。網格中的服務 Pod 在啟動之前,首先會運行一個初始化鏡像來完成流量劫持工作。
2.5 imagePullPolicy
- 鏡像拉取策略;
- 默認值
IfNotPresent
。
2.6 controlPlaneSecurityEnabled
- 指定是否在 istio 控制面組件上啟用 mTLS 通信;
- 啟用之后,Sidecar 與控制面組件之間,以及控制平面組件之間的通信,都會被改成 mTLS 方式;
- 受影響組件包括:Ingress , Mixer ,Pilot 及 Sidecar。
2.7 disablePloicyChecks
- 設置為
True
,則會禁用 Mixer 的預檢功能; - 預檢功能是一個同步過程,有可能因預檢緩慢造成業務應用的阻塞。
2.8 enableTracing
- 是否啟用分布式跟蹤功能;
- 默認值
true
。
2.9 mtls.enabled
- 服務之間是否默認啟用 mTLS 連接;
- 如果被設置為
true
,那么網格內部所有服務之間的通信都會使用 mTLS 進行安全加固; - 此變量是全局的,對於每個服務還可以單獨使用目標規則或通過服務注解的方式,自行決定是否采用 mTLS 加固。
2.10 imagePullSecrets
- 用於為 ServiceAccount 分配在鏡像拉取過程中所需要的認證憑據;
- 默認值為空。
2.11 arch
- 在設置 istio 組件的節點親和性過程中,會使用此變量的列表內容來確定可以用於部署的節點范圍,並按照不同的服務器架構設置優先順序;
- 默認列表內容如下:
amd64: 2 s390x: 2 ppc64le: 2
2.12 oneNamespace
- 默認值
false
,Pilot 會監控所有命名空間內的服務變化; - 如果設置為
true
,則會在 Pilot 的服務發現參數中加入 "-a",此時 Pilot 只會對 istio 組件所在命名空間進行監控。
2.13 configValidation
- 用於配置是否開啟服務端的配置驗證;
- 默認值
true
; - 開啟之后,會生成1個 "ValidatingWebhookConfiguration" 對象,並被包含到 Galley 的配置中,從而啟用校驗功能。
2.14 meshExpansion
- 需要將網格擴展到物理機或虛擬機上時,使用此變量;
- 默認值
false
; - 開啟之后,會在 Ingress Gateway 上公開 Pilot 與 Citadel 的服務。
2.15 meshExpansionILB
- 是否在內部網關中公開 Pilot 與 Citadel 的端口;
- 默認值
false
,僅在網格擴展時會使用此變量。
2.16 defaultResources
- 為所有 istio 組件都提供1個最小資源限制;
- 默認只設置1個請求
10m
CPU 資源的值; - 可在各 Chart 的局部變量中分別設置資源需求。
2.17 hyperkube
- 在 istio 的設置過程會使用一個鏡像執行一些
Job
,如早期版本安裝過程中的 CRD 初始化,或現在的清理過期證書等任務; - 鏡像默認使用:
quay.io/coreos:v1.7.6_coreos.0
。
2.18 priorityClassName
- 在 Kubernetes v1.11.0 以上版本有
priorityClass
的概念,具有優先級的 Pod 不會被驅逐或搶占資源; - 默認值為空 ,可選值:
system-cluster-critical
與system-node-critical
。
2.19 crds
- 該變量用於決定是否包含 CRD 定義;
- 如果使用
heml template
命令,或 2.10 以上版本的heml install
命令,應將其設置為true
; - 否則在安裝之前需要執行
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
,並將該變量設置為false
。
3. 自定義安裝
3.1 Install with Helm via helm template
根據實際需求定制 values.yaml
文件,包括各子 Chart 的 values.yaml
。如:
- 鏡像地址
- 系統資源
- 服務類型
- 可視化組件的服務開放
3.1.1 准備
# 創建 "namespace"
kubectl create namespace istio-system
# 安裝 Istio Custom Resource Definitions (CRDs)
helm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system | kubectl apply -f -
# "CRDs" 部署后,需要等待一些時間(3~5min),待其完全向 Kubernetes API-servera 注冊提交
# "CRDs" 數量默認是 "53",如果啟用 "cert-manager" ,則是 "58"
# istio "CRDs" 以 "istio.io" 或 "certmanager.k8s.io" 結尾
kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l
3.1.2 生成部署清單
# --name: 設置生成的部署內容的基礎名稱;
# --namespace: 設置命名空間;
# -f: 從指定文件獲取輸入內容。
helm template install/kubernetes/helm/istio --name istio --namespace istio-system -f values-demo.yaml > istio-demo.yaml
3.1.3 部署
# default profile
# helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f -
# 采用生成的部署清單
kubectl apply -f istio-demo.yaml
3.2 Install with Helm and Tiller via helm install
helm install
方式需要Tiller
服務器端,不會生成清單文件;- 如果需要管理
release
,建議使用此方式。 - 參考:helm install