本文介绍Nginx Ingress如何迁移至ASM网关。

前提条件

  • 已创建ASM企业版或旗舰版实例,且实例版本为最新版本。具体操作,请参见创建ASM实例
  • 已添加ACK集群到ASM实例。具体操作,请参见添加集群到ASM实例

方案示意图

ASM

迁移步骤

步骤一:创建ASM网关

在ASM实例下采用IstioGateway YAML方式创建ASM网关时,需要复用已有的Nginx Ingress对应的SLB,创建对应ASM网关的IstioGateway YAML时,需要注意以下几点:
  • 编辑ASM网关对应的IstioGateway YAML,在serviceAnnotations下设置SLB相关配置。
  • 复用Ingress已有的SLB实例,对应service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id Annotation
  • 设置不覆盖SLB已有监听,对应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网关下对应路由配置还未完或者遭遇异常时需要摘除流量的场景。
相关ServiceAnnotations举例如下:
 serviceAnnotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxxx"  //lb-xxxxx替换为您通过负载均衡管理控制台创建的SLB实例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后,您还需要进行验证测试,确认配置是否正确以及是否生效。因此需要进行验证测试。参考方案示意图,您可以手动新建一个SLB方式,然后发送测试流量请求至该SLB进行测试流量验证,通过测试结果判断配置是否正确。

步骤四:调整Ingress对应的SLB下各个后端实例的权重,将流量逐渐迁移到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实例的分发权重可以直接通过SLB控制台下进行权重配置操作。