ASM網關支持灰度升級,能夠提供流暢的升級體驗。本文以ASM原地升級為例,介紹如何使用ASM網關的灰度升級功能。
前提條件
已添加集群到ASM實例,且ASM版本為1.20及以上。關于升級ASM的具體操作,請參見升級ASM實例。
已創建入口網關。
背景信息
網關作為業務的流量總入口和總出口,對可用性有著極高的要求。為了更好地保證升級后業務的連續性,ASM網關支持灰度升級。您可以通過配置先啟動一個新版本的網關Pod來驗證流量,驗證通過后再完全升級網關。驗證過程中如果出現任何問題,您可以隨時刪除這個新版本的Pod,問題解決后再繼續升級。
ASM網關的灰度升級與ASM的金絲雀升級并不相同。無論您使用ASM的原地升級還是金絲雀升級,ASM網關的灰度升級均可以使用。
網關灰度升級介紹
ASM的控制面升級和數據面升級是分離的,您可以在控制面升級完成后再升級數據面。網關灰度升級的原理如下:
創建一個與當前控制面版本對應的網關單副本Deployment,這個Deployment被稱為Canary Deployment。它和網關原本的Deployment同時屬于一個Service,不同點是這個Deployment后面會加上-canary
的后綴。
如果網關命名空間中原本存在帶了-canary
后綴的同名Deployment,此時不會覆蓋該Deployment。使用該功能前,請確保不存在帶-canary
后綴的同名Deployment。例如,如果網關名稱為ingressgateway,請確保istio-system命名空間下沒有名稱為istio-ingressgateway-canary的Deployment。
ASM原地升級
控制面升級完成后,此時網關還是舊版本。您可以先創建Canary Deployment。Canary Deployment就緒后,部分流量就會被分配到這個灰度副本。此時觀察灰度副本上的流量是否正常。如果不正常,保留現場日志,刪除灰度副本。解決問題后重新部署灰度副本進行驗證。驗證無誤之后,將網關升級至新版本。
ASM金絲雀升級
網關的灰度升級同樣支持在ASM金絲雀升級中使用。在ASM金絲雀升級過程中,將新版本切換為默認控制面之后,此時網關處于待升級狀態。您可以部署網關的灰度副本進行驗證,驗證無誤后升級網關。
網關升級到新版本之后,您可以通過配置刪除部署的灰度副本。
步驟一:升級控制面
為了盡量在升級過程中降低流量損失的風險,請在升級前開啟網關的優雅下線功能。具體操作,請參見使用優雅下線功能避免流量損失。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在升級管理頁面的原地升級頁簽,單擊運行檢查,在重要提示對話框,單擊確定。
說明若頁面顯示當前已為最新版本,無需升級,表明網格是最新版本,無法進行升級操作。
升級預檢查通過后,單擊開始升級,在重要提示對話框,單擊確定。
步驟二:部署ASM網關的灰度副本
ASM網關的灰度副本通過Annotation開啟。
在ASM網關的YAML中添加
asm.alibabacloud.com/enable-canary-deployment: "true"
的Annotation,部署一個灰度副本。方式一:通過ASM控制臺
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在入口網關頁面,單擊目標網關右側的查看YAML,在編輯對話框,將
asm.alibabacloud.com/enable-canary-deployment: "true"
注解添加到metadata
字段下的annotations
中,然后單擊確定。
方式二:通過kubectl命令
執行以下命令,打開ASM網關的YAML文件。
kubectl edit IstioGateway <YOUR-INGRESSGATEWAY-NAME> -n istio-system
編輯YAML文件,將
asm.alibabacloud.com/enable-canary-deployment: "true"
注解添加到metadata
字段下的annotations
中,然后進行保存。
apiVersion: istio.alibabacloud.com/v1beta1 kind: IstioGateway metadata: labels: asm-gateway-type: ingress annotations: asm.alibabacloud.com/enable-canary-deployment: "true" # 添加此Annotation。 name: ingressgateway namespace: istio-system spec: clusterIds: - xxxxxxxxxxxxxx disableContainerPortExposed: true dnsPolicy: ClusterFirst externalTrafficPolicy: Local gatewayType: ingress ports: - name: http-0 port: 80 protocol: HTTP targetPort: 80 replicaCount: 1 resources: limits: cpu: '2' memory: 4G requests: cpu: 200m memory: 256Mi rollingMaxSurge: 25% rollingMaxUnavailable: 25% serviceAnnotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain: 'on' service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout: '10' service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type: PayByCLCU service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet serviceType: LoadBalancer
使用數據面KubeConfig,執行以下命令,查看部署的灰度副本。
本示例網關名稱為
ingressgateway
,請您根據實際情況進行替換。kubectl -n istio-system get deployment | grep ingressgateway
預期輸出:
istio-ingressgateway 1/1 1 1 10m istio-ingressgateway-canary 1/1 1 1 55s
帶有
-canary
后綴的Deployment即為灰度副本。灰度副本就緒后,會有部分流量進入對應的Pod,此時請觀察到達該網關的流量是否正常。如果出現異常,請保留網關日志,刪除配置的Annotation。該灰度副本會被刪除,所有流量將全部流向舊版本網關副本。問題解決后,重新部署灰度副本進行驗證。
步驟三:驗證無誤后,升級網關
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在數據平面區域的升級列,選中目標網關,單擊升級網關,在重要提示對話框,單擊確定,等待網關升級完成。
步驟四:刪除灰度副本
網關升級完成后,刪除步驟二中增加的Annotation,灰度副本會被自動刪除。
灰度副本永遠跟隨控制面的版本,如果不刪除,灰度副本會在下次升級控制面時同步升級。