背景介紹
為避免過期版本實例存在的安全和穩定性風險,同時保證您業務的連貫性,應用服務網格CSM支持對實例進行金絲雀升級,您可以在升級過程中僅變更部分數據面進行效果驗證。驗證符合預期后再進行全量升級,如果不符合預期,CSM支持對此次升級進行回滾。
相關概念
| 概念 | 說明 |
|---|---|
| 金絲雀升級 | 通過先運行一個金絲雀部署的新控制平面來完成 Istio 的升級,從而允許您在將所有流量遷移到新版本之前以一小部分工作負載監視升級的效果。金絲雀升級過程中支持回退。 |
| 控制平面 | 控制平面(Control Plane)是一組系統服務,這些服務配置網格或者網格的子網來管理工作負載實例之間的通信。 單個網格中控制平面的所有實例共享相同的配置資源。 |
| 數據平面 | 數據平面(Data Plane)當前常見的Sidecar模式, 通常是與主應用程序一起運行以提供附加功能的容器。 在 Istio 中,它同時運行一個Envoy代理 Pod,可以進行流量治理,安全策略管理,可觀測上報等,無需對業務進行侵入性修改。 |
升級時機
istio開源社區在不斷迭代,天翼云應用服務網格會不定期跟進社區的功能更新和漏洞修復。服務網格實例版本過于落后時,可能會存在安全和穩定性風險,建議您及時進行升級操作。
大版本的更新需要您主動進行升級,及時升級可以:
- 降低安全和穩定性風險:CSM版本的迭代,會及時跟進修復社區已知的安全及穩定性漏洞,給你的業務帶來安全和穩定性的提升。
- 享受更好的維護支持:對于落后太多的實例版本(往往是3個大版本以上),CSM不再提供維護和技術支持,使用新版本能夠讓您享受更好的技術支持和答疑服務。
- 使用新版本的前沿功能:隨著社區Istio版本的演進,新版本包含新的功能和改進,CSM也將適配新版本,可以使用更豐富的功能,跟進最新的性能優化也有助于您減少資源消耗。
升級注意事項和說明
注意事項
- 網格升級需要您手動重啟數據面Pod以完成新版本Sidecar的重新注入,建議您在業務低峰期進行升級操作。
- 升級期間請勿進行灰度發布、流量規則配置、主從集群新增刪除等操作。
- 基于安全原因,CSM保留以下權利:
- 強制升級過期版本實例(在實例版本過期后的某個時間,強制升級實例到支持中的最早版本),建議您參照下文提前主動升級實例。
- 對于緊急安全漏洞,可以在不發送通知的情況下,系統不定期發布熱更新版本,并自動更新。自動熱更新時,數據面網關和Sidecar代理版本保持不變。
- 金絲雀升級僅支持跨越最多兩個大版本,超出這個范圍請先升級到中間版本后再繼續升級。例如1.19無法直接升級到1.22,需要先升級到1.20或者1.21,再繼續升級到1.22。
金絲雀升級注入sidecar版本機制
服務網格實例進行金絲雀升級過程中,會同時有兩個版本的控制面共存。
CSM基于命名空間中的標簽注入的Sidecar版本。控制標簽為 istio.io/rev,目前僅支持指定default和canary,當設置為default時,注入當前版本,當設置為canary時,注入金絲雀版本。
當兩個版本同時存在時,Namespace標簽下業務注入的Sidecar版本的映射關系說明如下:
注意同一命名空間下,不能同時存在
istio-injection和istio.io/rev兩個標簽,此時注入行為可能產生不可預測的后果。
準備工作
由于在金絲雀升級中,驗證階段需要顯式地通過命名空間標簽來指定注入的Sidecar代理版本,因此金絲雀升級具有對注入策略的前置要求。請按照以下步驟確認注入策略配置是否滿足金絲雀升級條件。
-
登錄CSM控制臺,選定您的網格實例進入網格管理頁面。
-
在左側欄,sidecar管理中,選中注入策略管理。
-
確認pod所在命名空間的標簽需要滿足條件是否選定了“包含 istio-injection: enabled”。
以bookinfo demo為例,正式開始升級前,大致的架構如下:
開始金絲雀升級
- 登錄CSM控制臺,選定您的網格實例進入網格管理頁面。
- 在左側欄,網格實例中,選中網格實例升級。
- 選擇金絲雀版本,點擊開始金絲雀升級。
注意金絲雀升級最多支持跨兩個版本,當前CSM維護的版本基本可以滿足升級的需求。如果您的CSM版本落后過多,無法使用金絲雀升級功能,請退訂掉后重新選擇網格版本開通。
金絲雀版本的部署是一個異步的過程,大致需要幾分鐘,請等待相關組件部署完成。此時頁面不可操作,請耐心等候部署結果。
新版本部署完成后,界面顯示如下。
完成后,架構如下:
進行金絲雀升級驗證
上述步驟實施成功后,主集群會同時存在兩個版本的控制面。此時您可以通過全局命名空間的istio.io/rev標簽,決定讓數據面注入哪個版本的sidecar。以ratings為例,讓其注入1.20.0的sidecar,驗證升級后的功能。
-
登錄CSM控制臺,選定您的網格實例進入網格管理頁面。
-
在左側欄,網格實例中,選中全局命名空間。
-
選擇ratings所在的命名空間,移除istio-injection標簽,新增istio.io/rev標簽,選中canary值(表示注入最新的版本)。
更新成功后,可以看到default的標簽已經變為只有istio.io/rev: canary
- 滾動更新ratings:
-
登錄CCSE控制臺,選中主集群
-
在左側欄中選擇工作負載 -> 無狀態
-
在ratings的操作列中,點擊重新部署
-
選擇滾動更新后點擊確定
-
重啟后確認新負載的注入鏡像,版本號是否為1.20.0
此時,架構大致如下:
回滾工作負載版本
若升級驗證失敗,或者因為其他原因需要進行回滾,請參照以下步驟。
- 登錄CSM控制臺,選定您的網格實例進入網格管理頁面。
- 在左側欄,網格實例中,選中全局命名空間。
- 選擇ratings所在的命名空間,將istio.io/rev標簽,改為default值(表示注入舊版本)。
- 后續步驟與上述流程一樣,此處不在贅述。
回滾金絲雀升級
當所有臨時升級的工作負載都回滾后,您可以選擇把整次金絲雀升級回滾掉。
操作步驟如下
-
登錄CSM控制臺,選定您的網格實例進入網格管理頁面。
-
在左側欄,網格實例中,選中網格實例升級。
-
選擇金絲雀版本,點擊開始回滾升級。
注意回滾前請確保所有命名空間都已注入穩定Sidecar代理版本,否則無法撤銷。
回滾后,新控制面會被清理,只保留穩定版本的控制面。
此時大致架構如下,后續您可以擇期重新進行金絲雀升級,重復上述步驟進行控制面部署,工作負載驗證等步驟即可。
確認升級
若上述步驟驗證符合預期,您可以進入正式切換升級的流程。步驟如下:
-
登錄CSM控制臺,選定您的網格實例進入網格管理頁面。
-
在左側欄,網格實例中,選中網格實例升級。
-
選擇金絲雀版本,點擊開始確認升級。
注意
一旦進行版本切換,意味著升級已經進入舊版本下線階段。您只能將現有工作負載全部切換成新的版本的Sidecar網格代理,無法再撤銷升級。請確保在新版本部署階段完成全部驗證工作。
在版本切換后,帶有
istio.io/rev: default和istio-injection: enabled標簽的命名空間將注入新的版本的Sidecar網格代理,而istio.io/rev: canary標簽將失去作用。因此,在版本切換時,CSM會自動將所有istio.io/rev: canary標簽切換為istio.io/rev: default。
確認升級的動作耗時較久,請耐心等候頁面執行完成。
執行成功后頁面進入舊版本下線階段。
此時部分工作負載已經切換到新版本,存量工作負載依然注入舊版本,但是命名空間的istio.io/rev標簽已經切換為default,并且重啟負載后,即可注入新版本sidecar。注意一旦確認升級,本次金絲雀升級就無法回退。
重啟數據面
在卸載控制面前,您可以點擊數據面標簽,對存量的工作負載進行重啟。具體步驟如下:
-
登錄CSM控制臺,選定您的網格實例進入網格管理頁面。
-
在左側欄,網格實例中,選中網格實例升級。
-
選擇金絲雀發布,點擊數據面。
-
進入頁面后,您可以依據集群和命名空間篩選仍為升級的工作負載,逐一進行滾動更新。
可以看到,ratings已經更新到1.20版本不會再出現在列表中。
另外,您可以在網格狀態中,選擇全部命名空間查看版本,以確認是否所有工作負載都升級到新版本了。當所有工作負載都更新后,總體框架如下:
網關升級
服務網格Ingress和Egress網關數據面和sidecar一樣也是基于Envoy構建,需要連接對應版本的控制面;在完成了控制面版本升級后,網關也需要升級數據面版本,以下以Ingress網關為例介紹網關升級流程。
- 進入服務網格控制臺 -> 網關 -> 入口網關,選擇對應的集群和命名空間可以看到已經創建的網關實例。
- 點擊操作欄的灰度升級按鈕,當前網關還是老的版本,我們選擇 部署灰度副本,部署完成后網關流量會按副本數比例分配到新老版本的網關上,您可以根據需要靈活調整新老版本網關的比例。
- 如果發現新版本網關有問題,可以將灰度版本下線,后續再基于日志等監控能力定位相關問題。
- 經過驗證確認灰度版本可以正常承載流量后,您可以重啟舊版本的網關,所有網關實例都升級到了新版本。
- 確認重啟后的網關實例正常后就可以刪除灰度版本了。
下線舊版本
所有數據面都重啟過后,網格內不在存在注入舊版本sidecar,此時您可以下線舊版本,把舊版本控制面卸載,具體操作如下:
- 登錄CSM控制臺,選定您的網格實例進入網格管理頁面。
- 在左側欄,網格實例中,選中網格實例升級。
- 選擇金絲雀發布,點擊卸載控制面。
- 彈窗中點擊確認即可。
卸載成功后整體框架如下: