Nginx Ingress如何迁移至ASM网关

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

前提条件

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

  • 已添加ACK集群到ASM实例。具体操作,请参见添加集群到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控制台下进行权重配置操作。