先決條件
部署步驟
使用 Helm 部署 Istio主要有以下兩個(gè)步驟:
- 下載 Istio 發(fā)布包
- 部署 Istio
1. 下載 Istio 發(fā)布包
主要步驟:
- 下載和自動(dòng)解壓縮 Istio 發(fā)布包
- 配置 Istio 環(huán)境變量
-
下載和自動(dòng)解壓縮 Istio 發(fā)布包
curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.2.3 sh -
版本選擇可以參考: Istio release 頁面
-
配置 Istio 環(huán)境變量
cd istio-1.2.3 export PATH=$PWD/bin:$PATH
2. 部署 Istio
主要步驟:
- 改造 Tiller 客戶端(為 Tiller 配置 Service account)
- 安裝 istio-init(用于啟動(dòng) Istio CRD 的安裝過程)
- 部署 Istio (采用 demo 配置文件)
- 改造 Tiller 客戶端(為 Tiller 配置 Service account)
-
卸載原有的 Tiller 客戶端
helm reset
-
創(chuàng)建一個(gè) Tiller 的 Service account
cd istio-1.2.3 kubectl apply -f install/kubernetes/helm/helm-service-account.yaml
-
安裝 Tiller 并為其配置 Service account :
helm init --upgrade \ -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 \ --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts \ --service-account tiller
注:這里修改了另外兩點(diǎn):
1.設(shè)置 Tiller 的安裝源為阿里云源
2.設(shè)置 Helm 的穩(wěn)定存儲(chǔ)庫為阿里云的倉庫
- 安裝 istio-init(用于啟動(dòng) Istio CRD 的安裝過程)
注:這里啟用了 cert-managerhelm install install/kubernetes/helm/istio-init --name istio-init --namespace istio-system --set certmanager.enabled=true
- 驗(yàn)證 CRD
注:啟用了 cert-manager 時(shí)鸭栖,CRD 的個(gè)數(shù)為 28 個(gè)篡帕,否則為 26 個(gè)kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l
-
部署 Istio (采用 demo 配置文件)
helm install install/kubernetes/helm/istio --name istio --namespace istio-system \ --values install/kubernetes/helm/istio/values-istio-demo.yaml
注:雖然官方推薦的是使用 default 配置文件,但從官方的詳細(xì)說明來看 demo 配置文件提供的功能更加完善罢绽,詳細(xì)參考:https://istio.io/docs/setup/kubernetes/additional-setup/config-profiles/
-
卸載 Istio
helm delete --purge istio helm delete --purge istio-init
到這里,Istio 就已經(jīng)安裝完成了,但是由于不是托管云的原因出吹,故還需對 Ingress-Gateway 進(jìn)行適當(dāng)改造
改造 Ingress-Gateway
在 Kubernetes 中,可以使用 Ingress 資源將集群內(nèi)部的Service暴露到集群外部辙喂。
在 Istio 中捶牢,則推薦使用另一個(gè)更好的配置模型:Istio Gateway鸠珠。
原因:Istio Gateway 可以允許我們將 Istio 的功能(如:監(jiān)控和路由規(guī)則)應(yīng)用到進(jìn)入集群的流量。
Istio 部署時(shí)秋麸,同時(shí)也為我們安裝了 Ingress-Gateway渐排,且 Service 的類型為 LoadBalancer。由于不是公有云上的托管云灸蟆,LoadBalancer 不能為我們分配合適的 EXTERNAL-IP驯耻,故需要進(jìn)行一定的改造。改造的主要步驟如下:
- 修改 istio-ingressgateway 的 Service 參數(shù)
- 修改 istio-ingressgateway 的 Deployment 參數(shù)
- 刪除 istio-ingressgateway 的水平擴(kuò)展 HPA
- 修改 istio-ingressgateway 的 Service 參數(shù)
類型:
type: ClusterIP
-
刪除各個(gè)
nodePort
kubectl edit svc istio-ingressgateway -n istio-system
修改后炒考,如下:
apiVersion: v1 kind: Service metadata: ...... spec: clusterIP: 10.108.91.43 ports: - name: status-port port: 15020 protocol: TCP targetPort: 15020 - name: http2 port: 80 protocol: TCP targetPort: 80 - name: https port: 443 protocol: TCP targetPort: 443 - name: tcp port: 31400 protocol: TCP targetPort: 31400 - name: https-kiali port: 15029 protocol: TCP targetPort: 15029 - name: https-prometheus port: 15030 protocol: TCP targetPort: 15030 - name: https-grafana port: 15031 protocol: TCP targetPort: 15031 - name: https-tracing port: 15032 protocol: TCP targetPort: 15032 - name: tls port: 15443 protocol: TCP targetPort: 15443 selector: app: istio-ingressgateway istio: ingressgateway release: istio sessionAffinity: None type: ClusterIP
- 修改 istio-ingressgateway 的 Deployment 參數(shù)
- 網(wǎng)絡(luò)設(shè)置:
hostNetwork: true
可缚、dnsPolicy: ClusterFirstWithHostNet
- Node 親和性調(diào)度:
nodeAffinity
- Pod 反親和性調(diào)度:
podAntiAffinity
修改后,如下kubectl edit deploy istio-ingressgateway -n istio-system
apiVersion: extensions/v1beta1 kind: Deployment metadata: ...... spec: replicas: 2 ...... template: spec: ...... hostNetwork: true dnsPolicy: ClusterFirstWithHostNet affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/edge operator: Exists podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - topologyKey: kubernetes.io/hostname labelSelector: matchExpressions: - key: app operator: In values: - istio-ingressgateway - key: istio operator: In values: - ingressgateway
- 刪除 istio-ingressgateway 的水平擴(kuò)展 HPA
由于 helm 部署的 istio-ingressgateway斋枢,同時(shí)為其創(chuàng)建了HPA帘靡。因?yàn)槲覀冞@里使用 hostNetwork,即將 istio-ingressgateway 固定調(diào)度到集群中的所有邊緣節(jié)點(diǎn)上瓤帚,所以需要手動(dòng)刪除這個(gè) HPAkubectl delete HorizontalPodAutoscaler istio-ingressgateway -n istio-system
參考:
https://istio.io/zh/docs/setup/kubernetes/install/helm/
https://blog.frognew.com/2019/01/learning-istio-1.0-8-istio-install-with-helm.html