金絲雀升級

升級 Istio 可以透過先執行新控制平面的金絲雀部署來完成,讓您可以在將所有流量遷移到新版本之前,使用一小部分工作負載來監控升級的效果。這比執行原地升級安全得多,並且是建議的升級方法。

安裝 Istio 時,可以使用 revision 安裝設定同時部署多個獨立的控制平面。可以透過在舊版本的控制平面旁邊安裝新 Istio 版本的控制平面,並使用不同的 revision 設定來啟動升級的金絲雀版本。每個修訂版本都是一個完整的 Istio 控制平面實作,具有自己的 DeploymentService 等。

升級之前

在升級 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。

  1. 建立一個命名空間 test-ns

    $ kubectl create ns test-ns
    
  2. 使用 istio-injection 標籤標記命名空間。

    $ kubectl label namespace test-ns istio-injection=enabled
    
  3. 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-11-24-0。叢集運算子建立一個指向較舊、穩定的 1-23-1 版本的修訂版本標籤 prod-stable,以及一個指向較新 1-24-0 修訂版本的修訂版本標籤 prod-canary。此狀態可以透過以下命令達成:
  1. 安裝兩個控制平面的修訂版本

    $ istioctl install --revision=1-23-1 --set profile=minimal --skip-confirmation
    $ istioctl install --revision=1-24-0 --set profile=minimal --skip-confirmation
    
  2. 建立 stablecanary 修訂版本標籤,並將它們與各自的修訂版本相關聯

    $ istioctl tag set prod-stable --revision 1-23-1
    $ istioctl tag set prod-canary --revision 1-24-0
    
  3. 標記應用程式命名空間以映射到各自的修訂版本標籤

    $ 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
    
  4. 在每個命名空間中啟動一個範例 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
    
  5. 使用 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
    

修訂版本、標籤和命名空間之間的最終映射如下所示

Two namespaces pointed to prod-stable and one pointed to prod-canary
兩個命名空間指向 prod-stable,一個指向 prod-canary

叢集運算子除了可以透過 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

現在,修訂版本、標籤和命名空間之間更新後的映射如下所示

Namespace labels unchanged but now all namespaces pointed to {{< istio_full_version_revision >}}
命名空間標籤未變,但現在所有命名空間都指向 {{< istio_full_version_revision >}}

重新啟動標記為 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

但是,在這種情況下,您必須先手動重新安裝先前修訂版本的閘道,因為解除安裝命令不會自動還原先前就地升級的閘道。

清除

  1. 清除建立的已修訂版本標籤

    $ istioctl tag remove prod-stable
    $ istioctl tag remove prod-canary
    
  2. 清除用於 canary 升級的命名空間,其中包含修訂版本標籤的範例

    $ kubectl delete ns istio-system test-ns
    
  3. 清除用於 canary 升級的命名空間,其中包含修訂版本標籤的範例

    $ kubectl delete ns istio-system app-ns-1 app-ns-2 app-ns-3
    
此資訊是否有用?
您有任何改進建議嗎?

感謝您的回饋!