本文介绍自建Istio IngressGateway如何迁移至ASM网关。
方案示意图

步骤一:在ASM实例中创建入口网关
关于创建入口网关的具体操作,请参见创建入口网关服务。
创建入口网关时,请注意以下几点:
展开查看ASM网关复用已有SLB的相关说明。
在ASM实例下采用IstioGateway YAML方式创建ASM网关时,若需要复用已有的SLB,请注意以下几点:
- 编辑ASM网关对应的IstioGateway YAML,在serviceAnnotations下设置SLB相关配置。
- 复用要迁移的Istio ingressGateway已有的SLB实例,对应Annotation为
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id
。 - 设置不覆盖SLB已有监听,对应Annotation为
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: 'false'
。 - 复用SLB已有的虚拟服务器组时,如果
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port
有多个端口及虚拟服务器组的组合,可以使用英文半角逗号(,)分隔,例如"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"
。 - 确认SLB的负载均衡调度算法已调整为WRR(加权轮询)。根据实际需求,调整ASM网关实例在SLB下的权重。将权重设置为0,表示SLB不会转发流量,可用于前期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"
。