文档

ASM网关灰度升级

更新时间:

ASM网关支持灰度升级,能够提供流畅的升级体验。本文以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金丝雀升级过程中,将新版本切换为默认控制面之后,此时网关处于待升级状态。您可以部署网关的灰度副本进行验证,验证无误后升级网关。

    网关升级到新版本之后,您可以通过配置删除部署的灰度副本。

步骤一:升级控制面

为了尽量在升级过程中降低流量损失的风险,请在升级前开启网关的优雅下线功能。具体操作,请参见使用优雅下线功能避免流量损失

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 升级管理

  3. 升级管理页面的原地升级页签,单击运行检查,在重要提示对话框,单击确定

    说明

    若页面显示当前已为最新版本,无需升级,表明网格是最新版本,无法进行升级操作。

  4. 升级预检查通过后,单击开始升级,在重要提示对话框,单击确定

步骤二:部署ASM网关的灰度副本

ASM网关的灰度副本通过Annotation开启。

  1. 在ASM网关的YAML中添加asm.alibabacloud.com/enable-canary-deployment: "true"的Annotation,部署一个灰度副本。

    方式一:通过ASM控制台

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 入口网关

    3. 入口网关页面,单击目标网关右侧的查看YAML,在编辑对话框,将asm.alibabacloud.com/enable-canary-deployment: "true"注解添加到metadata字段下的annotations中,然后单击确定

    方式二:通过kubectl命令

    1. 执行以下命令,打开ASM网关的YAML文件。

      kubectl edit IstioGateway <YOUR-INGRESSGATEWAY-NAME> -n istio-system
    2. 编辑YAML文件,将asm.alibabacloud.com/enable-canary-deployment: "true"注解添加到metadata字段下的annotations中,然后进行保存。

    展开查看添加Annotation的YAML示例

    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
  2. 使用数据面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。该灰度副本会被删除,所有流量将全部流向旧版本网关副本。问题解决后,重新部署灰度副本进行验证。

步骤三:验证无误后,升级网关

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 升级管理

  3. 数据平面区域的升级列,选中目标网关,单击升级网关,在重要提示对话框,单击确定,等待网关升级完成。

步骤四:删除灰度副本

网关升级完成后,删除步骤二中增加的Annotation,灰度副本会被自动删除。

重要

灰度副本永远跟随控制面的版本,如果不删除,灰度副本会在下次升级控制面时同步升级。