金絲雀升級
升級 Istio 可以透過先執行新控制平面的金絲雀部署來完成,讓您可以在將所有流量遷移到新版本之前,使用一小部分工作負載來監控升級的效果。這比執行原地升級安全得多,並且是建議的升級方法。
安裝 Istio 時,可以使用 revision
安裝設定同時部署多個獨立的控制平面。可以透過在舊版本的控制平面旁邊安裝新 Istio 版本的控制平面,並使用不同的 revision
設定來啟動升級的金絲雀版本。每個修訂版本都是一個完整的 Istio 控制平面實作,具有自己的 Deployment
、Service
等。
升級之前
在升級 Istio 之前,建議執行 istioctl x precheck
命令,以確保升級與您的環境相容。
$ istioctl x precheck
✔ No issues found when checking the cluster. Istio is safe to install or upgrade!
To get started, check out https://istio.dev.org.tw/latest/docs/setup/getting-started/
控制平面
若要安裝名為 canary
的新修訂版本,您需要將 revision
欄位設定如下:
$ istioctl install --set revision=canary
執行命令後,您將會有兩個控制平面部署和服務並排執行。
$ kubectl get pods -n istio-system -l app=istiod
NAME READY STATUS RESTARTS AGE
istiod-1-23-1-bdf5948d5-htddg 1/1 Running 0 47s
istiod-canary-84c8d4dcfb-skcfv 1/1 Running 0 25s
$ kubectl get svc -n istio-system -l app=istiod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istiod-1-23-1 ClusterIP 10.96.93.151 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 109s
istiod-canary ClusterIP 10.104.186.250 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 87s
您還會看到有兩個 sidecar 注入器配置,其中包含新的修訂版本。
$ kubectl get mutatingwebhookconfigurations
NAME WEBHOOKS AGE
istio-sidecar-injector-1-23-1 2 2m16s
istio-sidecar-injector-canary 2 114s
資料平面
請參閱 Gateway Canary 升級,以了解如何執行特定修訂版本的 Istio gateway 實例。在本範例中,由於我們使用 default
Istio 設定檔,Istio gateway 不會執行特定修訂版本的實例,而是會就地升級以使用新的控制平面修訂版本。您可以執行以下命令來驗證 istio-ingress
gateway 是否正在使用 canary
修訂版本:
$ istioctl proxy-status | grep "$(kubectl -n istio-system get pod -l app=istio-ingressgateway -o jsonpath='{.items..metadata.name}')" | awk -F '[[:space:]][[:space:]]+' '{print $8}'
istiod-canary-6956db645c-vwhsk
然而,僅僅安裝新的修訂版本並不會對現有的 sidecar 代理產生影響。若要升級這些代理,您必須將它們設定為指向新的 istiod-canary
控制平面。這是在 sidecar 注入期間根據命名空間標籤 istio.io/rev
來控制的。
建立一個啟用 istio-injection
的命名空間 test-ns
。在 test-ns
命名空間中,部署一個範例 curl pod。
建立一個命名空間
test-ns
。$ kubectl create ns test-ns
使用
istio-injection
標籤標記命名空間。$ kubectl label namespace test-ns istio-injection=enabled
在
test-ns
命名空間中啟動一個範例 curl pod。$ kubectl apply -n test-ns -f samples/curl/curl.yaml
若要升級命名空間 test-ns
,請移除 istio-injection
標籤,並新增 istio.io/rev
標籤以指向 canary
修訂版本。必須移除 istio-injection
標籤,因為為了向後相容性,它優先於 istio.io/rev
標籤。
$ kubectl label namespace test-ns istio-injection- istio.io/rev=canary
在命名空間更新之後,您需要重新啟動 Pod 以觸發重新注入。重新啟動命名空間 test-ns
中所有 Pod 的一種方法是使用:
$ kubectl rollout restart deployment -n test-ns
當 Pod 被重新注入時,它們將被設定為指向 istiod-canary
控制平面。您可以使用 istioctl proxy-status
來驗證這一點。
$ istioctl proxy-status | grep "\.test-ns "
輸出將顯示命名空間下所有使用 canary 修訂版本的 Pod。
穩定的修訂標籤
在將命名空間移動到新的修訂版本時,手動重新標記命名空間可能會很繁瑣且容易出錯。修訂版本標籤 可以解決這個問題。修訂版本標籤 是指向修訂版本的穩定識別符號,可用於避免重新標記命名空間。網格運算子可以簡單地更改標籤以指向新的修訂版本,而不是重新標記命名空間。所有標記有該標籤的命名空間將同時更新。用法
考慮一個安裝了兩個修訂版本的叢集,1-23-1
和 1-24-0
。叢集運算子建立一個指向較舊、穩定的 1-23-1
版本的修訂版本標籤 prod-stable
,以及一個指向較新 1-24-0
修訂版本的修訂版本標籤 prod-canary
。此狀態可以透過以下命令達成:安裝兩個控制平面的修訂版本
$ istioctl install --revision=1-23-1 --set profile=minimal --skip-confirmation $ istioctl install --revision=1-24-0 --set profile=minimal --skip-confirmation
建立
stable
和canary
修訂版本標籤,並將它們與各自的修訂版本相關聯$ istioctl tag set prod-stable --revision 1-23-1 $ istioctl tag set prod-canary --revision 1-24-0
標記應用程式命名空間以映射到各自的修訂版本標籤
$ kubectl create ns app-ns-1 $ kubectl label ns app-ns-1 istio.io/rev=prod-stable $ kubectl create ns app-ns-2 $ kubectl label ns app-ns-2 istio.io/rev=prod-stable $ kubectl create ns app-ns-3 $ kubectl label ns app-ns-3 istio.io/rev=prod-canary
在每個命名空間中啟動一個範例 curl pod
$ kubectl apply -n app-ns-1 -f samples/curl/curl.yaml $ kubectl apply -n app-ns-2 -f samples/curl/curl.yaml $ kubectl apply -n app-ns-3 -f samples/curl/curl.yaml
使用
istioctl proxy-status
命令驗證應用程式到控制平面的映射$ istioctl ps NAME CLUSTER CDS LDS EDS RDS ECDS ISTIOD VERSION curl-78ff5975c6-62pzf.app-ns-3 Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-24-0-7f6fc6cfd6-s8zfg 1.24.0 curl-78ff5975c6-8kxpl.app-ns-1 Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-23-1-bdf5948d5-n72r2 1.23.1 curl-78ff5975c6-8q7m6.app-ns-2 Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-23-1-bdf5948d5-n72r2 1-23.1
修訂版本、標籤和命名空間之間的最終映射如下所示
叢集運算子除了可以透過 istioctl tag list
命令檢視標記的命名空間之外,還可以檢視此映射
$ istioctl tag list
TAG REVISION NAMESPACES
default 1-23-1 ...
prod-canary 1-24-0 ...
prod-stable 1-23-1 ...
在叢集運算子對標記為 prod-canary
的控制平面的穩定性感到滿意後,可以透過修改 prod-stable
修訂版本標籤以指向較新的 1-24-0
修訂版本,用一個動作更新標記為 istio.io/rev=prod-stable
的命名空間。
$ istioctl tag set prod-stable --revision 1-24-0 --overwrite
現在,修訂版本、標籤和命名空間之間更新後的映射如下所示
重新啟動標記為 prod-stable
的命名空間中的注入工作負載,現在將導致這些工作負載使用 1-24-0
控制平面。請注意,將工作負載遷移到新修訂版本不需要重新標記命名空間。
$ kubectl rollout restart deployment -n app-ns-1
$ kubectl rollout restart deployment -n app-ns-2
使用 istioctl proxy-status
命令驗證應用程式到控制平面的映射
$ istioctl ps
NAME CLUSTER CDS LDS EDS RDS ECDS ISTIOD VERSION
curl-5984f48bc7-kmj6x.app-ns-1 Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-24-0-7f6fc6cfd6-jsktb 1.24.0
curl-78ff5975c6-jldk4.app-ns-3 Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-24-0-7f6fc6cfd6-jsktb 1.24.0
curl-7cdd8dccb9-5bq5n.app-ns-2 Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-24-0-7f6fc6cfd6-jsktb 1.24.0
預設標籤
標籤 default
指向的修訂版本被視為預設修訂版本,並具有額外的語義含義。預設修訂版本執行以下功能:
- 為
istio-injection=enabled
命名空間選擇器、sidecar.istio.io/inject=true
物件選擇器和istio.io/rev=default
選擇器注入 sidecar - 驗證 Istio 資源
- 從非預設修訂版本竊取領導鎖,並執行單例網格職責(例如,更新資源狀態)
若要使修訂版本 1-24-0
成為預設版本,請執行:
$ istioctl tag set default --revision 1-24-0
當與現有的非修訂版本的 Istio 安裝一起使用 default
標籤時,建議移除舊的 MutatingWebhookConfiguration
(通常稱為 istio-sidecar-injector
),以避免較舊和較新的控制平面都嘗試注入。解除安裝舊的控制平面
在升級控制平面和資料平面之後,您可以解除安裝舊的控制平面。例如,以下命令會解除安裝修訂版本為 1-23-1
的控制平面:
$ istioctl uninstall --revision 1-23-1 -y
如果舊的控制平面沒有修訂版本標籤,請使用其原始安裝選項解除安裝,例如:
$ istioctl uninstall -f manifests/profiles/default.yaml -y
確認舊的控制平面已移除,且叢集中只存在新的控制平面
$ kubectl get pods -n istio-system -l app=istiod
NAME READY STATUS RESTARTS AGE
istiod-canary-55887f699c-t8bh8 1/1 Running 0 27m
請注意,上述說明僅移除了指定控制平面修訂版本的資源,但不包含與其他控制平面共享的叢集範圍資源。若要完全解除安裝 Istio,請參閱解除安裝指南。
解除安裝金絲雀控制平面
如果您決定回滾到舊的控制平面,而不是完成 canary 升級,您可以使用以下命令解除安裝 canary 修訂版本:
$ istioctl uninstall --revision=canary -y
但是,在這種情況下,您必須先手動重新安裝先前修訂版本的閘道,因為解除安裝命令不會自動還原先前就地升級的閘道。
清除
清除建立的已修訂版本標籤
$ istioctl tag remove prod-stable $ istioctl tag remove prod-canary
清除用於 canary 升級的命名空間,其中包含修訂版本標籤的範例
$ kubectl delete ns istio-system test-ns
清除用於 canary 升級的命名空間,其中包含修訂版本標籤的範例
$ kubectl delete ns istio-system app-ns-1 app-ns-2 app-ns-3