使用修訂版本和標籤安全升級 Istio 控制平面

學習如何對您的網格控制平面執行金絲雀升級。

2021 年 5 月 26 日 | 作者:Christian Posta - Solo.io,Lin Sun - Solo.io,Sam Naser - Google

如同所有安全軟體,您的服務網格應保持在最新狀態。Istio 社群每季發布新版本,並定期發布修補程式以修正錯誤和安全漏洞。服務網格的營運者將需要多次升級控制平面和資料平面元件。升級時必須謹慎,因為錯誤可能會影響您的業務流量。Istio 具有許多機制可以安全地以受控方式執行升級,並且在 Istio 1.10 中,我們進一步改善了這種操作體驗。

背景

在 Istio 1.6 中,我們新增了使用修訂版本追隨金絲雀模式升級服務網格的基本支援。使用這種方法,您可以並排執行多個控制平面,而不會影響現有部署,並將工作負載從舊的控制平面緩慢遷移到新的控制平面。

為了支援這種基於修訂版本的升級,Istio 為命名空間引入了 istio.io/rev 標籤。這表示哪個控制平面修訂版本應為各自命名空間中的工作負載注入 sidecar 代理。例如,istio.io/rev=1-9-5 的標籤表示控制平面修訂版本 1-9-5 應使用 1-9-5 的代理為該命名空間中的工作負載注入資料平面。

如果您想要升級特定命名空間的資料平面代理,您會將 istio.io/rev 標籤更新為指向新的版本,例如 istio.io/rev=1-10-0。手動變更(甚至是嘗試協調)大量命名空間的標籤變更可能會容易出錯,並導致意外的停機。

導入修訂版本標籤

在 Istio 1.10 中,我們使用稱為修訂版本標籤的新功能改善了基於修訂版本的升級。修訂版本標籤減少了操作員為了使用修訂版本而必須進行的變更數量,並安全地升級 Istio 控制平面。您可以使用標籤作為命名空間的標籤,並將修訂版本指派給該標籤。這表示您不必在升級時變更命名空間上的標籤,並盡可能減少手動步驟和組態變更。

例如,您可以定義一個名為 prod-stable 的標籤,並將其指向控制平面的 1-9-5 修訂版本。您也可以定義另一個名為 prod-canary 的標籤,將其指向 1-10-0 修訂版本。您的叢集中可能有很多重要的命名空間,並且您可以使用 istio.io/rev=prod-stable 標籤來標記這些命名空間。在其他命名空間中,您可能願意測試新版本的 Istio,並且可以使用 istio.io/rev=prod-canary 標籤來標記該命名空間。該標籤將間接地將這些命名空間與 prod-stable1-9-5 修訂版本和 prod-canary1-10-0 修訂版本分別關聯起來。

Stable revision tags
穩定修訂版本標籤

一旦您確定新的控制平面適合其餘的 prod-stable 命名空間,您可以變更標籤以指向新的修訂版本。這使您能夠將標記為 prod-stable 的所有命名空間更新為新的 1-10-0 修訂版本,而無需對命名空間上的標籤進行任何變更。您需要在將標籤變更為指向不同的修訂版本後,重新啟動命名空間中的工作負載。

Updated revision tags
更新後的修訂版本標籤

一旦您對升級到新的控制平面修訂版本感到滿意,您可以移除舊的控制平面。

實際操作的穩定修訂版本標籤

要為修訂版本 1-9-5 建立新的 prod-stable 標籤,請執行以下命令

$ istioctl x revision tag set prod-stable --revision 1-9-5

然後,您可以使用 istio.io/rev=prod-stable 標籤來標記您的命名空間。請注意,如果您安裝了 Istio 的 default 修訂版本(即,沒有修訂版本),您必須先移除標準的注入標籤

$ kubectl label ns istioinaction istio-injection-
$ kubectl label ns istioinaction istio.io/rev=prod-stable

您可以使用以下命令列出網格中的標籤

$ istioctl x revision tag list

TAG         REVISION NAMESPACES
prod-stable 1-9-5    istioinaction

標籤是使用 MutatingWebhookConfiguration 實作的。您可以驗證是否已建立對應的 MutatingWebhookConfiguration

$ kubectl get MutatingWebhookConfiguration

NAME                             WEBHOOKS   AGE
istio-revision-tag-prod-stable   2          75s
istio-sidecar-injector           1          5m32s

假設您嘗試根據 1.10.0 金絲雀化控制平面的新修訂版本。首先,您將使用修訂版本安裝新版本

$ istioctl install -y --set profile=minimal --revision 1-10-0

您可以建立一個名為 prod-canary 的新標籤,並將其指向您的 1-10-0 修訂版本

$ istioctl x revision tag set prod-canary --revision 1-10-0

然後相應地標記您的命名空間

$ kubectl label ns istioinaction-canary istio.io/rev=prod-canary

如果您列出網格中的標籤,您會看到兩個指向兩個不同修訂版本的穩定標籤

$ istioctl x revision tag list

TAG         REVISION NAMESPACES
prod-stable 1-9-5    istioinaction
prod-canary 1-10-0   istioinaction-canary

任何您已使用 istio.io/rev=prod-canary 標記的命名空間,都將由與 prod-canary 穩定標籤名稱對應的控制平面注入(在本範例中,這指向 1-10-0 修訂版本)。當您準備好時,您可以使用以下命令將 prod-stable 標籤切換到新的控制平面

$ istioctl x revision tag set prod-stable --revision 1-10-0 --overwrite

每次您切換標籤以指向新的修訂版本時,您都需要重新啟動任何各自命名空間中的工作負載,以取得新修訂版本的代理。

prod-stableprod-canary 都不再指向舊的修訂版本時,可以安全地移除舊的修訂版本,如下所示

$ istioctl x uninstall --revision 1-9-5

總結

使用修訂版本可使金絲雀化 Istio 控制平面的變更更加安全。在具有大量命名空間的大型環境中,您可能更喜歡使用穩定標籤,正如我們在本部落格中介紹的那樣,以移除移動元件的數量,並簡化您可能圍繞更新 Istio 控制平面而建立的任何自動化。請查看 1.10 版本 和新的標籤功能,並向我們提供您的意見!

分享此文章