本文介绍Nginx Ingress如何迁移至ASM网关。
前提条件
已创建ASM企业版或旗舰版实例,且实例版本为最新版本。具体操作,请参见创建ASM实例。
已添加ACK集群到ASM实例。具体操作,请参见添加集群到ASM实例。
方案示意图
迁移步骤
步骤一:创建ASM网关
在ASM实例下采用IstioGateway YAML方式创建ASM网关时,需要复用已有的Nginx Ingress对应的CLB,创建对应ASM网关的IstioGateway YAML时,需要注意以下几点:
通过Service Loadbalancer类型声明创建的CLB复用,请参见FAQ。
编辑ASM网关对应的IstioGateway YAML,在serviceAnnotations下设置CLB相关配置。
复用Ingress已有的CLB实例,对应service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id Annotation。
设置不覆盖CLB已有监听,对应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网关下对应路由配置还未完或者遭遇异常时需要摘除流量的场景。
相关ServiceAnnotations举例如下:
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,则不再接受流量。
步骤二:手动Translate Ingress为VS、DR等Istio侧的配置
请参照如下Ingress配置,将Ingress翻译为Istio对应的VirtualService配置。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: helloworld
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- backend:
serviceName: helloworld
servicePort: 80
path: /helloworld(/|$)(.*)
host: example.com
预期结果:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: example-vs
spec:
gateways:
- istio-system/ingressgateway ## your gateway name
hosts:
- example.com
http:
- name: route-helloworld
match:
- uri:
prefix: /helloworld/
- uri:
prefix: /helloworld
rewrite:
uri: /
route:
- destination:
host: helloworld
port:
number: 80
VirtualService和Destinationrule可以和对应的服务Deployment放在同一个Namespace。如果不在同一个Namespace,对应的destination.host字段需要填写为FQDN格式。
步骤三:验证流量
Ingress配置转换为对应的VirtualService后,您还需要进行验证测试,确认配置是否正确以及是否生效。因此需要进行验证测试。参考方案示意图,您可以手动新建一个CLB方式,然后发送测试流量请求至该CLB进行测试流量验证,通过测试结果判断配置是否正确。
步骤四:调整Ingress对应的CLB下各个后端实例的权重,将流量逐渐迁移到ASM网关
推荐对应ASM网关实例的权重设置为一个较小的值(如1%),观察线上请求是否符合预期,一定时间后逐渐增加,直到全部切换到ASM网关。
权重调整方式如下:
ASM网关的实例对应权重可以通过IstioGateway下的ServiceAnnotaions进行调整,对应service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "60"。
Nginx实例对应的权重,可以通过编辑相关Service下的Annotation:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight进行操作。若Service未配置权重相关Annotation,Nginx Ingress实例的分发权重可以直接通过CLB控制台下进行权重配置操作。