5.1 Istio Chart概述
Helm是目前Istio官方推薦的安裝方式。還可以對輸入值進行一些調整,完成對Istio的部分配置工作。Istio Chart是一個總分結構,其分級結構和設計結構是一致的。
5.1.1 Chart.yaml
包含版本號、名稱、關鍵字等元數據信息。
5.1.2 values-*.yaml
提供Istio在各種場景下關鍵字配置范本,可以作為Helm的輸入文件,來對Istio進行典型定制。對Istio的定制可以從對這些輸入文件的改寫開始,改寫完后使用
helm template 命令生成最終的部署文件,這樣就能用kubectl完成部署了。多個values-*.yaml文件,其中values.yaml羅列了大多數常用變量,也是我們做定制的基礎。
5.1.3 requirements.yaml
用於管理對子chart的依賴關系,定義了一系列開關變量。比如控制grafana是否安裝,以及安裝版本。
5.1.4 templates/_affinity.tpl
該文件會生成一組節點親和或互斥元素,供各個組件在渲染YAML時使用。在該文件里使用了一系列變量,用於控制Istio組件的節點親和性(也就是限制Istio在部署時對節點的選擇)。
5.1.5 templates/sidecar-inject-configmap.yaml
保存的配置數據被用於進行SicerCar注入。istioctl完成的手工注入,或者Istio的自動注入,都會引用這個Configmap。如果希望修改Istio的Sidecar的注入過程及其行為,就可以從該文件或者對應的CongfigMap入手了。
5.1.6 templates/configmap.yaml
該文件也會生成一個Configmap, 名稱為istio, 這個對象用於為Pilot提供啟動配置參數。
5.1.7 templates/crds.yaml
該文件包含了Istio所需的CRD定義。
5.1.8 charts
這個目錄中的子目錄就是istio的組件,如下所述:
certmanager: 證書客戶端,用於自動進行證書的申請、獲取以及分發。
galley: Istio利用Galley進行配置管理工作。
gateways: 對Gateways Chart進行配置。
grafana: 圖形化的Istio Dashboard
ingress: 建議棄用。
kiali: 帶有分布式跟蹤、配置校驗等多項功能的Dashboard.
mixer: Istio的策略實施組件。
pilot: Istio的流量管理組件。
prometheus: 監控軟件
security: 證書的自動管理
servicegraph: 分布式跟蹤組件。
siecarInjectorWebhook: 自動注入Webhook的相關配置。
tracing: 分布式跟蹤組件。
5.2 全局變量介紹
使用chart的時候,通常不會修改chart的主體,僅通過對變量的控制來實現對部署過程的定制。Istio Helm Chart提供了大量的變量來幫助用戶對Istio的安裝進行定制。
Istio Chart分為父子兩級,因此變量也有全局和本地兩級。全局變量使用保留字global進行定義,子chart可以通過values.global的方式引用全局變量,而在主Chart中也可以用chart.va的方式為子chart指定變量值。
5.2.1 hub和tag
多數情況,這兩個變量代表所有鏡像的地址。
這兩個變量對於內網部署非常有必要,將Istio的鏡像拉取回來,並推送到私庫后,只要在values.yaml中進行修改,就可以將Istio所需鏡像的引用指向內網私庫,省去了逐個修改Deployment文檔的麻煩。
5.2.2 ingress.enabled
開關,是否啟用Istio的Ingress Controller, istio不推薦ingress, 而是推薦Ingress Gateway。
有兩個變量會受到這個開關的影響:
k8sIngressSelector : 利用Pod標簽選擇一個Gateway作為Ingress Controller。
k8sIngressHttps: 如果為True, 就在istio-autogenerated-k8s-ingress這個Gateway定義中加入443端口及其TLS配置。
5.2.3 Proxy先關參數
在values.yaml中定義了一組proxy變量,用於對Sidecar進行控制。
1. proxy.resources
為Sidecar分配資源。CPU和內存等。
2. proxy.concurrency
Proxy worker的線程數量。如果被設置為0(默認值),則根據CPU線程或核的數量進行分配。
3. proxy.accessLogFile
sidecar的訪問日志位置。如果設置為空字符串,則關閉訪問日志功能。默認是/dev/stdout
4. proxy.privileged
istio-init、istio-proxy的特權模式開關。默認false
5. proxy.enableCoreDump
如果打開,則新注入的Sidecar會啟動CoreDump功能,在Pod中加入初始化容器enable-core-dump。 默認是false。
6. proxy.includelPRanges
劫持IP范圍的白名單。默認是“*”,也就是劫持所有地址的流量。
7. proxy.excludelPRanges
劫持IP范圍的黑名單。默認是空字符串.
8. proxyincludelnboundPorts:
入站流量的端口劫持白名單。
9.proxy.excludeInboundPorts
入站流量的端口劫持黑名單。
10. proxy.autoInject
控制是否自動完成Sidecar的注入工作。
11. proxy.envoyStared
該變量的默認值是:
enabled: true
host: istio-statsd-prom-bridge
port: 9125
5.2.4 proxy_init.image
網絡中的服務pod在啟動之前,首先會運行一個初始化鏡像來完成流量劫持工作,這個變量可以用於指定初始化容器鏡像。
5.2.5 imagePullPolicy
鏡像拉取策略。默認是“ifNotPresent”.
5.2.6 controlPlaneSecurityEnabled
5.2.7 disablePolicyChecks
Mixer的預檢功能是否啟用。預檢功能是一個同步過程,有可能因為預檢緩慢造成業務應用的阻塞。
5.2.8 enableTracing
是否啟用分布式跟蹤。
5.2.9 mtls.enabled
服務之間是否默認啟用沒TLS連接。
5.2.10 imagePullSecrets
拉取鏡像過程中所需要的認證憑證。
5.2.11 arch
用於部署的節點范圍。
5.2.12 oneNamespace
默認為false,Pilot會監控所有命名空間內的服務的變化。
5.2.13 configValidation
是否開啟服務端的配置驗證。
5.2.14 meshExpansion
要將服務網格擴展到物理機或者虛擬機上,就會使用這一變量。
5.2.15 meshExpansionILB
5.2.16 defaultResources
為所有Istio組件都提供一個最小資源限制。
5.2.17 hyperkube
在Istio的設置過程會使用一個鏡像執行一些job,例如在早期版本安裝過程中的CRD初始化,或者現在的清理過期證書等任務。
5.2.18 priorityClassName
具有優先級的Pod不會被驅逐或搶占資源。
5.2.19 crds
是否包含crd定義。
5.3 Istio安裝清單的生成和部署
5.3.1 編輯values.yaml
我們需要先根據實際需求對Istio進行定制,定制方法就是編輯values.yaml, 常見的修改包含以下內容:
1 鏡像地址:
有一個小技巧,對於4.2中用到的istio-demo.yaml清單文件,如果想獲取其中使用的鏡像名稱,就可以使用grep命令方便的過濾出來:
grep -r image: istio-demo.yaml | grep -0 -e "image:.*" | sort | unqu
如果想改成私有倉庫的地址,修改values.yaml中各個鏡像的地址。
2 系統資源
values.yaml中的系統資源設置是非常保守的,並且不完整
3 服務類型
Istio的istio-ingressgateway服務的默認類型是Loadbalancer, 如果要部署的目標K8s集群中沒有負載均衡支持,就需要對服務類型進行修改。
4 可視化組件的服務開放
在Istio中包含的Prometheus、Grafana以及Kiali等可視化組件,在默認情況下都是ClusterIP類型的,可以修改。
5.3.2 生成部署清單
對values.yaml編輯之后,使用helm template命令生成最終的部署清單。
輸入文件為my-values.yaml,那么可以用如下命令生成我們需要的YAML文件。
my-istio.yaml是生成的部署文件。
helm template install/kubernetes/helm/istio --name istio --namespace istio-system -f my-values.yaml > my-istio.yaml
5.3.3 部署Istio
生成部署清單后,就可以開始部署了。
1 首先創建命名空間:
kubectl create ns istio-system namespace/istio-system created
2 用前面生成的部署清單部署istio
kubectl apply -f my-istio.yaml