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

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

方案示意图

迁移方案

步骤一:将Istio网关所创建的CLB改为可复用

如果Istio网关对应的CLB是由Service自动创建的,则该CLB默认不可复用。为了实现在迁移过程中通过该SLB将流量按比例分配至Istio网关和ASM网关,则需要将其改为可复用。

  1. 前往CLB控制台,找到相关的CLB实例。点击实例ID进入实例配置界面。

  2. 关闭实例的配置修改保护

  3. 删除对应CLB上的这两个特殊标签:kubernetes.do.not.deleteack.aliyun.com

  4. Istio网关的Service添加如下Annotation:

# 当这个注解为false时,当前Service的端口变更将不会影响对应的CLB监听。
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}:${端口},${虚拟服务器组ID}:${端口}...
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"

示例:

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: lb-bp1onpskfeceg********
# 虚拟服务器组信息可以通过CLB控制台获得,进入实例后点击“虚拟服务器组”标签页
# 您需要将SLB所有的虚拟服务器组全部列在下面的annotation中,格式为${虚拟服务组ID}:${端口}
# 多个值以,分割。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: rsp-bp1r4xk******:15021,rsp-bp1kaqd******:80,rsp-bp1jyz0******:443
# 在迁移开始之前,Istio网关的权重为100,全部流量经过Istio网关
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"

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

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

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

  • 参考ASM网关CRD说明,使用Yaml创建ASM网关

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

    • 您需要确保ASM网关的port列表以及targetPortIstio网关相同

    • 参考步骤一:将Istio网关所创建的CLB改为可复用中的(4),通过CRD(参考CRD字段说明)创建ASM网关。为了复用Istio网关的CLB并实现CLB切流,ASM网关的serviceAnnotation配置如下:

      # 当这个注解为true时,ACK会使用ASM网关的Service的端口来更新CLBListener。
      # 为了确保服务不中断,请确保ASM网关暴露的端口和Istio网关一致。
      # 如果创建后出现流量异常,请将ASM网关上的这个注解改为false,并将Istio网关上的该注解改为true来恢复监听配置。
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: lb-bp1onpskfeceg********
      # 虚拟服务器组信息可以通过CLB控制台获得,进入实例后点击“虚拟服务器组”标签页
      # 您需要将SLB所有的虚拟服务器组全部列在下面的annotation中,格式为${虚拟服务组ID}:${端口}
      # 多个值以,分割。
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: rsp-bp1r4xk******:15021,rsp-bp1kaqd******:80,rsp-bp1jyz0******:443
      # 在迁移开始之前,Istio网关的权重为100,全部流量经过Istio网关。ASM网关权重为0。
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "0"
  • 验证CLB复用,打开CLB控制台,选择虚拟服务器组,点击虚拟服务器组名称查看虚拟服务器组后端,若Istio网关Pod地址和ASM网关Pod地址都出现在列表中,即表示本步骤成功完成。

步骤三:将网关相关配置迁移至ASM

为了使得ASM网关行为与Istio网关一致,您需要将Istio中与该网关相关的配置应用至ASM。

  • 由于ASM网关不能与Istio网关重名,迁移Gateway CR时,Gateway CRspec.selcetor.istio字段需修改为实际的ASM网关名称。YAML示例如下:

    spec:
      selector:
        istio: ingressgateway-asm
  • VirtualService CR、DestinationRule CR等无需修改,直接迁移。

步骤四:将流量灰度迁移至ASM网关

通过分别修改Istio网关和ASM入口网关的serviceAnnotations,可以切换新旧两个网关的权重。您可以通过缓慢放大ASM网关流量比例同时缓慢缩小Istio网关流量比例将流量逐步切换至ASM网关,最终直至将全部流量切换至ASM网关,即完成迁移。

您可以通过修改Istio网关Service annotation以及ASM网关Service annotation以控制CLB转发流量的比例:

  • 修改原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"