自建Istio IngressGateway如何迁移至ASM网关

本文介绍自建Istio IngressGateway如何迁移至ASM网关。

方案示意图

迁移方案

步骤一:在ASM实例中创建入口网关

关于创建入口网关的具体操作,请参见创建入口网关

创建入口网关时,请注意以下几点:

  • 命名ASM网关时,请不要与已有网关重名。您可以在命名时加上-asm后缀,与已有网关进行区分,例如命名为ingressgateway-asm。

  • 创建入口网关步骤3,选择部署集群为原有的Istio ingressGateway所在的Kubernetes集群。

  • 将域名解析更改为新的ASM Gateway地址。若不能切换域名对应的DNS解析,或需要通过权重方式渐进地迁移流量,迁移时新建的ASM网关需要复用原有网关的CLB实例(如上图所示,右侧的ASM网关采用复用原有网关的CLB实例方式)。

    说明

    通过Service Loadbalancer类型声明创建的CLB复用请参考本文FAQ。

展开查看ASM网关复用已有CLB的相关说明。

在ASM实例下采用IstioGateway YAML方式创建ASM网关时,若需要复用已有的CLB,请注意以下几点:

  • 编辑ASM网关对应的IstioGateway YAML,在serviceAnnotations下设置CLB相关配置。

  • 复用要迁移的Istio ingressGateway已有的CLB实例,对应Annotation为service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id

  • 设置不覆盖CLB已有监听,对应Annotation为service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: 'false'

  • 复用CLB已有的虚拟服务器组时,如果service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port有多个端口及虚拟服务器组的组合,可以使用英文半角逗号(,)分隔,例如"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"

  • 确认CLB的负载均衡调度算法已调整为WRR(加权轮询)。根据实际需求,调整ASM网关实例在CLB下的权重。将权重设置为0,表示CLB不会转发流量,可用于前期ASM网关下对应路由配置还未Ready的情况,或者遭遇异常的情况进行摘流。

serviceAnnotations YAML示例如下:

serviceAnnotations:
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxxx"  //lb-xxxxx请替换为您通过负载均衡管理控制台创建的CLB实例ID。
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: 'false'  //需要设置为false, 因为IstioGateway默认是覆盖监听的方式。
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:80"   //${YOUR_VGROUP_ID}请替换为您的虚拟服务器。
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "60"   //设置Service流量权重,设置为0,表示不再接受流量。

步骤二:迁移相关配置

  • 迁移Gateway时,selcetor.istio需修改为实际的ASM网关名称。YAML示例如下:

    spec:
      selector:
        istio: ingressgateway-asm
  • VirtualService、DestinationRule等其他配置直接迁移即可。

步骤三:迁移流量

通过修改serviceAnnotations,可以切换新旧两个网关的权重。对应ASM网关实例的权重可以先设置为较小值(例如10%),观察一段时间的线上请求是否符合预期,然后逐步增加ASM网关实例的权重,直到全部切换到ASM网关。

权重调整方式如下:

  • 修改原Istio ingressGateway的权重:在对应Service中添加Annotation,例如service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "90"

  • 修改ASM网关的实例的权重:在对应istiogateway下添加serviceAnnotaions,例如service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "10"

FAQ:如果自建网关的CLB是跟随Service自动创建的,如何更改为复用CLB?

  1. 前往CLB控制台,找到相关的CLB实例。删除对应CLB上的这两个特殊标签:kubernetes.do.not.deleteack.aliyun.com

  2. 给对应的网关Service添加如下Annotation:

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${对应CLB id}
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: ${虚拟服务器组ID}:${端口}
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"