近兩年微服務架構成為企業應用架構的流行趨勢,除了互聯網企業,傳統企業也紛紛選擇擁抱微服務。加之容器Kubernetes、DevOps、微服務云原生技術“黃金三角”的互相賦能,微服務架構成為當前企業IT架構設計的首選。
Isito是Service Mesh的產品化落地,是目前最受歡迎的服務網格,功能豐富、成熟度高。本文主要根據官網文檔整理而成,介紹Istio針對單集群的三種主流部署安裝方式:使用Istioctl安裝、使用Helm自定義安裝、獨立Operator安裝。多集群安裝部署暫不涉及,在今后的文章中我們再做詳細闡述。
使用 Istioctl 安裝
使用默認配置文件安裝 Istio
最簡單的方法是安裝 default Istio 配置文件使用以下命令:
$ istioctl manifest apply
此命令用于在配置好的 Kubernetes 集群上安裝 default 配置文件。default 配置文件是建立生產環境的起點,這與旨在評估廣泛的 Istio 功能特性的較大的 demo 配置文件不同。
如果要在 default 配置文件之上啟用 Grafana dashboard,用下面的命令設置 addonComponents.grafana.enabled 配置參數:
$ istioctl manifest apply --set addonComponents.grafana.enabled=true
可以像使用 helm 一樣在 istioctl 中配置 --set 標志。唯一的區別是必須為配置路徑增加 values. 前綴,因為這是 Helm 透傳 API 的路徑,如下所述。
$ istioctl manifest apply --set addonComponents.grafana.enabled=true
可以像使用 helm 一樣在 istioctl 中配置 —set 標志。這其中唯一的區別是必須為配置路徑增加 values. 前綴,因為這是 Helm 透傳 API 的路徑,如下所述。
從外部Chart安裝
通常,istioctl 使用內置 Chart 生成安裝清單。這Chart 會和與 istioctl 一起發布,用于審核和自定義,它們 放置在 install/kubernetes/operator/charts 目錄下。除了使用內置 Chart 外,istioctl 還可以使用外部 Chart 生成安裝清單。要選擇外部 Chart ,請配置 installPackagePath 參數(接收本地文件系統路徑):
$ istioctl manifest apply --set installPackagePath=< base directory where installed >/istio-releases/istio-1.5.1/install/kubernetes/operator/chart
如果使用 istioctl 1.5.1 二進制文件,該命令執行結果與通過 istioctl manifest apply 安裝相同,因為它指向的 Chart 與內置 Chart 相同。除了試驗或測試新特性之外,我們建議使用內置 Chart 而不是外部提供,以確保 istioctl 二進制文件與 Chart 的兼容性。
安裝其他配置文件
可以通過在命令行上設置配置文件名稱安裝其他 Istio 配置文件到群集中。例如,可以使用以下命令,安裝 demo 配置文件:
$ istioctl manifest apply --set profile=demo
顯示可用配置文件的列表
您可以使用以下 istioctl 命令來列出 Istio 配置文件名稱:
$ istioctl profile list
Istio configuration profiles:
remote
separate
default
demo
empty
minimal
顯示配置文件的配置
您可以查看配置文件的配置設置。通過以下命令查看 default 配置文件的設置:
$ istioctl profile dump demo
addonComponents:
grafana: enabled: true kiali: enabled: true
prometheus: enabled: true
tracing: enabled: true
components: egressGateways:
- enabled: true k8s:
resources:
requests:
cpu: 10m
memory: 40Mi
name: istio-egressgateway
...
查看整個配置的子集,可以使用 --config-path 標志,這一標志僅選擇部分給定路徑下的配置:
$ istioctl profile dump --config-path components.pilot demo
enabled: true
k8s:
env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: GODEBUG
value: gctrace=1
- name: PILOT_TRACE_SAMPLING
value: "100"
- name: CONFIG_NAMESPACE
value: istio-config
...
顯示配置文件中的差異
profile diff 子命令可用于顯示配置文件之間的差異,在將更改應用于集群之前,這對于檢查自定義的效果很有用。您可以使用以下命令顯示default和 demo 配置文件之間的差異:
$ istioctl profile diff default demo gateways: egressGateways: - - enabled: false + - enabled: true ... k8s: requests:- cpu: 100m- memory: 128Mi+ cpu: 10m+ memory: 40Mi strategy:...
安裝前生成清單
您可以在安裝 Istio 之前使用 manifest generate 子命令生成清單,而不是 manifest apply。例如,使用以下命令為 default 配置文件生成清單:
$ istioctl manifest generate > $HOME/generated-manifest.yaml
根據需要檢查清單,然后使用以下命令應用清單:
$ kubectl apply -f $HOME/generated-manifest.yaml
由于集群中的資源不可用,此命令可能顯示暫時錯誤。
驗證安裝成功
使用 verify-install 命令檢查 Istio 安裝是否成功,它將集群上的安裝與您指定的清單進行比較。
如果未在部署之前生成清單,請運行以下命令以現在生成它:
$ istioctl manifest generate <your original installation options> > $HOME/generated-manifest.yamlerated-manifest.yaml
然后運行以下 verify-install 命令以查看安裝是否成功:
$ istioctl verify-install -f $HOME/generated-manifest.yaml
二、使用 Helm 自定義安裝
這種安裝方式使用 Helm charts 自定義 Istio 控制平面和 Istio 數據平面的 sidecar。你只需使用 helm template 生成配置并使用 kubectl apply 命令安裝它, 或者你可以選擇使用 helm install 讓 Tiller 來完全管理安裝。
通過這些說明, 您可以選擇 Istio 內置的任何一個 配置文件 并根據的特定的需求進行進一步的自定義配置。
添加 Helm chart 倉庫
下面的命令使用了包含 Istio 發行版鏡像的 Helm charts。如果要使用 Istio 發行版 Helm chart ,建議使用下面的命令添加 Istio 發行版倉庫:
$ helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.5.1/charts/
安裝步驟
將目錄切換到 Istio 發行版的根目錄,然后在以下兩個選項中選擇一種安裝方式:
1. 如果不使用 Tiller 部署 Istio,請查看方案 1。
2. 如果選擇 Helm 的 Tiller pod 來管理 Istio 發行版, 請查看方案 2。
默認情況下,Istio 使用 LoadBalancer 服務類型。而有些平臺是不支持 LoadBalancer 服務的。對于不支持 LoadBalancer 服務類型的平臺, 執行下面的步驟時,可以在 Helm 命令中加入 --set gateways.istio-ingressgateway.type=NodePort 選項,使用 NodePort 來替代 LoadBalancer 服務類型。
方案 1: 使用 helm template 命令安裝
在集群沒有安裝 Tiller 的情況下,可以選擇此方案。
1. 為 Istio 組件創建命名空間 istio-system:
$ kubectl create namespace istio-system
2. 使用 kubectl apply 安裝所有 Istio 的 自定義資源 (CRDs) :
$ helm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system | kubectl apply -f -
3. 等待所有的 Istio CRD 創建完成:
$ kubectl -n istio-system wait --for=condition=complete job --all
4. 選擇配置文件,部署與選擇的配置文件相對應的 Istio 核心組件。我們建議在生產環境使用默認的配置文件:
可以添加一個或多個 --set <key>=<value> 來進一步自定義 helm 命令的安裝選項 。
default:
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f -
demo:
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \ --values install/kubernetes/helm/istio/values-istio-demo.yaml | kubectl apply -f -
minimal:
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \ --values install/kubernetes/helm/istio/values-istio-minimal.yaml | kubectl apply -f -
sds:
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \ --values install/kubernetes/helm/istio/values-istio-sds-auth.yaml | kubectl apply -f -
Istio CNI enabled:
安裝 Istio CNI 組件:
$ helm template install/kubernetes/helm/istio-cni --name=istio-cni --namespace=kube-system | kubectl apply -f -
將 --set istio_cni.enabled=true 設置追加到 helm 命令上,來啟用 Istio CNI件。以 Istio 默認配置文件為例:$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \ --set istio_cni.enabled=true | kubectl apply -f -
方案 2: 在 Helm 和 Tiller 環境中使用 helm install 命令安裝
這個方案使用 Helm 和 Tiller 來對 Istio 的生命周期進行管理。
1. 請確保集群的 Tiller 設置了 cluster-admin 角色的 Service Account。如果沒有定義,可以執行下面命令創建:
$ kubectl apply -f manifests/UPDATING-CHARTS.md
2. 使用 Service Account 在集群上安裝 Tiller:
$ helm init --service-account tiller
3. 安裝 istio-init chart,來啟動 Istio CRD 的安裝過程:
$ helm install install/kubernetes/helm/istio-init --name istio-init --namespace istio-system
4.等待所有Istio CRD 創建完成:
$ kubectl -n istio-system wait --for=condition=complete job --all
5. 選擇一個配置文件,然后部署與選擇的配置文件相對應的 istio 的核心組件。我們建議在生成環境部署中使用默認配置文件:
添加一個或多個 --set <key>=<value> 來進一步定義 Helm 命令的 安裝選項。
default:
$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system
demo:
$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system \ --values install/kubernetes/helm/istio/values-istio-demo.yaml
minimal:
$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system \ --values install/kubernetes/helm/istio/values-istio-minimal.yaml
sds:
$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system \ --values install/kubernetes/helm/istio/values-istio-sds-auth.yaml
Istio CNI enabled:
安裝 Istio CNI chart:
$ helm install install/kubernetes/helm/istio-cni --name istio-cni --namespace kube-system
將 --set istio_cni.enabled=true 設置追加到 helm 命令上,來啟用 Istio CNI 插件。以 Istio 默認配置文件為例:
$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set istio_cni.enabled=true
驗證安裝
1. 查詢配置文件的組件表,驗證是否已部署了與選擇的配置文件相對應的 Kubernetes 服務:
$ kubectl get svc -n istio-system
2. 確保相應的 Kubernetes Pod 已部署并且 STATUS 是 Running:
$ kubectl get pods -n istio-system
卸載
對于使用 helm template 命令安裝的 Istio,使用如下命令卸載:
default:
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -$ kubectl delete namespace istio-system
demo:
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \ --values install/kubernetes/helm/istio/values-istio-demo.yaml | kubectl delete -f -$ kubectl delete namespace istio-system
minimal:
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \ --values install/kubernetes/helm/istio/values-istio-minimal.yaml | kubectl delete -f -$ kubectl delete namespace istio-system
sds:
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \ --values install/kubernetes/helm/istio/values-istio-sds-auth.yaml | kubectl delete -f -$ kubectl delete namespace istio-system
Istio CNI enabled:
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \
--set istio_cni.enabled=true | kubectl delete -f
$ helm template install/kubernetes/helm/istio-cni --name=istio-cni --namespace=kube-system | kubectl delete -f -
對于使用的 Helm 和 Tiller 安裝的 Istio, 使用如下命令卸載:
$ helm delete --purge istio
$ helm delete --purge istio-init
$ helm delete --purge istio-cni
$ kubectl delete namespace istio-system
刪除 CRD 和 Istio 配置
在Istio 的設計中,自定義資源以 CRD 形式存在于 Kubernetes 環境之中。CRD 中包含了運維過程中產生的運行時配置。正因如此,我們建議運維人員應該顯式的對其進行刪除,從而避免意外操作。
istio-init Chart 包含了 istio-init/files 目錄中的所有原始 CRD。下載該 Chart 之后,可以簡單使用 kubectl 刪除 CRD。要永久刪除 Istio 的 CRD 以及所有 Istio 配置, 請運行如下命令:
$ kubectl delete -f install/kubernetes/helm/istio-init/files
三、安裝獨立 Operator
該指南將指引使用獨立的 Istio operator 來安裝 Istio。唯一的依賴就是一個 Kubernetes 集群和 kubectl 命令行工具。
如果要安裝生產環境的 Istio,我們還是建議您參考使用 istioctl 安裝。
前提條件
執行必要的平臺特定設置。
檢查 Pods 和 Services 需求。
部署 Istio operator。
$ kubectl apply -f https://preliminary.istio.io/operator.yaml
這條命令會在 istio-operator 命名空間中創建以下資源,并運行 Istio operator :
operator 自定義資源
operator 控制器 deployment
operator 指標信息 service
operator 必要的 RBAC 規則
安裝
運行以下命令用 operator 安裝 Istio demo 配置文件:
$ kubectl create ns istio-system
$ kubectl apply -f - <<EOF
apiVersion: install.istio.io/v1alpha1
kind: IstioControlPlane
metadata:
namespace: istio-operator
name: example-istiocontrolplane
spec:
profile: demo
EOF
控制器會檢測 IstioControlPlane 資源,然后按照指定的(demo)配置安裝 Istio 組件。
使用以下命令來確認 Istio 控制面板服務是否部署:
$ kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana ClusterIP 172.21.211.123 <none> 3000/TCP 2m
istio-citadel ClusterIP 172.21.177.222 <none> 8060/TCP,15014/TCP 2m
istio-egressgateway ClusterIP 172.21.113.24 <none> 80/TCP,443/TCP,15443/TCP 2m
istio-galley ClusterIP 172.21.132.247 <none> 443/TCP,15014/TCP,9901/TCP 2m
istio-ingressgateway LoadBalancer 172.21.144.254 52.116.22.242 15020:31831/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30318/TCP,15030:32645/TCP,15031:31933/TCP,15032:31188/TCP,15443:30838/TCP 2m
istio-pilot ClusterIP 172.21.105.205 <none> 15010/TCP,15011/TCP,8080/TCP,15014/TCP 2m
istio-policy ClusterIP 172.21.14.236 <none> 9091/TCP,15004/TCP,15014/TCP 2m
istio-sidecar-injector ClusterIP 172.21.155.47 <none> 443/TCP,15014/TCP 2m
istio-telemetry ClusterIP 172.21.196.79 <none> 9091/TCP,15004/TCP,15014/TCP,42422/TCP 2m
jaeger-agent ClusterIP None <none> 5775/UDP,6831/UDP,6832/UDP 2m
jaeger-collector ClusterIP 172.21.135.51 <none> 14267/TCP,14268/TCP 2m
jaeger-query ClusterIP 172.21.26.187 <none> 16686/TCP 2m
kiali ClusterIP 172.21.155.201 <none> 20001/TCP 2m
prometheus ClusterIP 172.21.63.159 <none> 9090/TCP 2m
tracing ClusterIP 172.21.2.245 <none> 80/TCP 2m
zipkin ClusterIP 172.21.182.245 <none> 9411/TCP
$ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-f8467cc6-rbjlg 1/1 Running 0 1m
istio-citadel-78df5b548f-g5cpw 1/1 Running 0 1m
istio-egressgateway-78569df5c4-zwtb5 1/1 Running 0 1m
istio-galley-74d5f764fc-q7nrk 1/1 Running 0 1m
istio-ingressgateway-7ddcfd665c-dmtqz 1/1 Running 0 1m
istio-pilot-f479bbf5c-qwr28 1/1 Running 0 1m
istio-policy-6fccc5c868-xhblv 1/1 Running 2 1m
istio-sidecar-injector-78499d85b8-x44m6 1/1 Running 0 1m
istio-telemetry-78b96c6cb6-ldm9q 1/1 Running 2 1m
istio-tracing-69b5f778b7-s2zvw 1/1 Running 0 1m
kiali-99f7467dc-6rvwp 1/1 Running 0 1m
prometheus-67cdb66cbb-9w2hm 1/1 Running 0 1m
更新
現在,控制器已經運行,可以通過編輯或替換 IstioControlPlane 資源改變 Istio 的配置。控制器將會檢測該變化,并更新 Istio 的安裝。運行以下命令將安裝切換為 default 配置:
$ kubectl apply -f -<<EOFapiVersion: install.istio.io/v1alpha1kind:IstioControlPlanemetadata:namespace: istio-operator name: example-istiocontrolplanespec: profile:defaultEOF
可以啟用或禁用指定的特性或組件。例如,禁用遙測特性:
$ kubectl apply -f -<<EOF
apiVersion: install.istio.io/v1alpha1
kind:IstioControlPlane
metadata:
namespace: istio-operator
name: example-istiocontrolplane
spec:
profile:default
telemetry: enabled:false
EOF
卸載
刪除 Istio operator 和 Istio 部署:
$ kubectl -n istio-operator get IstioControlPlane example-istiocontrolplane -o=json | jq '.metadata.finalizers = null' | kubectl delete -f -
$ kubectl delete ns istio-operator --grace-period=0 --force
$ kubectl delete ns istio-system --grace-period=0 --force
“從小白到專家Istio技術實踐”專題系統講述Istio基本概念、基礎架構及在企業級云平臺中的實踐。對微服務治理感興趣的企業決策者、技術調研者、架構師、開發人員、運維人員,歡迎持續關注!