本文介绍自建Istio IngressGateway如何迁移至ASM网关。
方案示意图
步骤一:将Istio网关所创建的CLB改为可复用
如果Istio网关对应的CLB是由Service自动创建的,则该CLB默认不可复用。为了实现在迁移过程中通过该SLB将流量按比例分配至Istio网关和ASM网关,则需要将其改为可复用。
前往CLB控制台,找到相关的CLB实例。点击实例ID进入实例配置界面。
关闭实例的配置修改保护
删除对应CLB上的这两个特殊标签:
kubernetes.do.not.delete
、ack.aliyun.com
。为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列表以及targetPort与Istio网关相同
参考步骤一:将Istio网关所创建的CLB改为可复用中的(4),通过CRD(参考CRD字段说明)创建ASM网关。为了复用Istio网关的CLB并实现CLB切流,ASM网关的serviceAnnotation配置如下:
# 当这个注解为true时,ACK会使用ASM网关的Service的端口来更新CLB的Listener。 # 为了确保服务不中断,请确保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 CR的spec.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"
。