自建Nginx Ingress迁移ALB Ingress最佳实践

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文介绍如何从Nginx Ingress迁移至ALB Ingress。

背景信息

ALB Ingress是基于阿里云应用型负载均衡ALB(Application Load Balancer)实现的Ingress服务。相比于Nginx Ingress,ALB Ingress提供更为强大的Ingress流量管理功能,具有以下优势:

  • 全托管免运维:ALB属于全托管免运维的云服务。

  • 自动弹性:ALB基于CyberStar自研平台,支持高性能自动弹性,处理能力随业务峰值自动伸缩。

  • 超强性能:单个ALB实例最大支持100万QPS、千万级并发连接,默认使用SSL硬件加速。

  • 云产品生态集成:ALB支持与多种云产品结合,如WAF、FC、PrivateLink、TR、EDAS、SAE、ASM等。

  • 配置变更热更新:配置变更完全热更新,不需要Reload进程,对长连接无损。

场景示例

本文以下图场景为例。某企业在阿里云华东1(杭州)地域创建了一个公网CLB实例,并通过Nginx Ingress Controller配置Ingress转发规则,配置流量重定向、域名和路径的转发策略,且对外通过DNS域名提供服务。客户端访问域名www.example.net时,DNS解析会根据A记录配置将流量指向CLB实例,CLB实例根据Ingress规则对应的转发策略将流量转发至对应Service的Pod上。

image

由于业务发展需要,该企业需要将后端Nginx Ingress迁移到ALB Ingress上。为了保持业务稳定,希望不改变对外提供服务的DNS域名及后端服务器的IP地址。企业可以通过在ACK集群ACK Serverless集群上安装ALB Ingress Controller,并在ALB Ingress Controller上配置相关Ingress规则,使ALB提供的转发策略与Nginx Ingress一致,然后利用DNS域名解析的权重设置完成流量的迁移。

image

注意事项

  • 您已通过kubectl工具连接ACK集群。

  • CLB的计费方式为包年包月和按量付费,ALB的计费方式为按量付费,CLBALB的计费项、定价等存在差异,CLB实例的业务迁移ALB实例后,会产生计费变更。具体计费规则,请参见:

迁移步骤

image

步骤一:创建ALB Ingress

  1. 登录容器计算服务控制台安装ALB Ingress Controller组件。具体操作,请参见管理ALB Ingress Controller组件

    ALB Ingress Controller组件需部署在待迁移Nginx Ingress所在的ACS集群。

  2. 通过kubectl工具登录Nginx Ingress所在的ACS集群,创建ALBConfig。

    1. 使用以下内容,创建albconfig.yaml

      apiVersion: alibabacloud.com/v1
      kind: AlbConfig
      metadata:
        name: alb-demo
      spec:
        config:
          name: alb-test
          addressType: Internet
          zoneMappings:
          - vSwitchId: vsw-wz9e2usil7e5an1xi****
          - vSwitchId: vsw-wz92lvykqj1siwvif****
        listeners:
          - port: 80
            protocol: HTTP

      zoneMappings:设置ALB Ingress交换机ID,您需要至少指定两个不同可用区交换机ID,且交换机必须与集群属于同一VPC。

      说明

      若待迁移Nginx Ingress处理的是IPv6的客户端流量,您可以在ALBConfig中通过addressIpVersion字段指定DualStack。更多信息,请参见通过ALBConfig配置ALB实例

    2. 执行以下命令,创建ALBConfig。

      kubectl apply -f albconfig.yaml
    3. 执行以下命令,查看ALB实例是否创建成功。

      kubectl get albconfig

      预期输出:

      NAME       ALBID                    DNSNAME                                               PORT&PROTOCOL   CERTID   AGE
      alb-demo   alb-a8mmh2tqbmrm11****   alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com                            27s
  3. 创建IngressClass。

    1. 使用以下内容,创建ingressclass.yaml

      apiVersion: networking.k8s.io/v1
      kind: IngressClass
      metadata:
        name: alb
      spec:
        controller: ingress.k8s.alibabacloud/alb
        parameters:
          apiGroup: alibabacloud.com
          kind: AlbConfig
          name: alb-demo

      parameters.name:ALBConfig名称,用于绑定ALBConfig。

    2. 执行以下命令,创建IngressClass。

      kubectl apply -f ingressclass.yaml
  4. 创建ALB Ingress。

    重要

    如果原Nginx Ingress存在其他高级转发规则,可以利用ALB Ingress服务高级用法,将来自不同域名或URL路径的请求转发给不同的后端服务器组、将HTTP访问重定向至HTTPS及实现灰度发布等功能。更多信息,请参见ALB Ingress服务高级用法

    1. 使用以下内容,创建albingress.yaml

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: demo-ingress-alb
        namespace: default
      spec:
        ingressClassName: alb
        rules:
          - host: www.example.net
            http:
              paths:
                - backend:
                    service:
                      name: nginx
                      port:
                        number: 80
                  path: /
                  pathType: Prefix
      • name:Ingress名称。在相同的namespace下,ALB Ingress名称与原Nginx Ingress的名称不能相同。

      • ingressClassName:IngressClass的名称。

    2. 执行以下命令,创建ALB Ingress。

      kubectl apply -f albingress.yaml
    3. 执行以下命令,获取ALB Ingress资源。

      kubectl get ing

      预期输出:

      NAME                CLASS   HOSTS              ADDRESS                                               PORTS   AGE
      demo-ingress-alb   alb     www.example.net   alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com   80      10m     46s

      从返回结果中获取ALB Ingress的端点,例如本文为alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 。

    4. 执行以下命令,通过ALB Ingress访问后端服务来测试流量。

      curl -H "Host:  www.example.net" http://alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com

      如果返回信息正常,则说明ALB Ingress可以正常访问后端服务。

步骤二:切流至ALB Ingress

警告
  • 流量切换前,请比对您的Nginx Ingress生成的转发策略和ALB Ingress生成的ALB转发策略,确保二者提供的能力完全一致,且所有配置经过完备的测试验收,以免在切换过程中对您的业务产生非预期的影响。

  • 建议在业务低谷期进行流量的切换。

流量切换前,待迁移的CLB实例已配置域名解析,您已将业务域名通过A记录解析的方式指向CLB实例的服务地址。

image

安装ALB Ingress Controller组件并通过ALB Ingress配置相同的转发策略,完成ALB Ingress流量测试后,本文以阿里云云解析DNS为例,介绍流量由CLB切换至ALB的操作步骤。您可以通过以下步骤完成流量的切换。关于阿里云云解析DNS的介绍,请参见公网权威解析

image

第一步:CLB实例配置临时域名

ALB实例推荐使用CNAME解析,为满足域名权重配置的启用条件,您需要为临时域名添加一条CNAME解析记录,同时将该临时域名指向待迁移CLB实例的服务地址。

说明

权重配置的启用条件是域名下存在相同的主机记录、相同解析线路的多条A记录、CNAME记录、AAAA记录。

  1. 登录域名解析控制台

  2. 域名解析页面,找到指向待迁移CLB实例的DNS域名www.example.net,单击该域名。

  3. 解析设置页面,单击添加记录,在添加记录面板,完成以下参数的配置,然后单击确认

    配置

    说明

    记录类型

    在下拉列表中选择CNAME

    主机记录

    您的域名的前缀。本文输入www

    解析请求来源

    选择默认。

    记录值

    输入临时域名,本文输入web0.example.net

    TTL

    全称Time To Live,表示DNS记录在DNS服务器上的缓存时间。本文设置为5秒

    本文使用的是企业旗舰版云解析DNS,为方便验证将TTL设置为5秒。您可以根据实际情况进行设置,更多信息,请参见版本对比

  4. 解析设置页面,找到指向待迁移CLB实例服务地址的A记录,在操作列单击修改

  5. 在弹出的修改记录面板,修改主机记录,然后单击确认。本文修改主机记录web0,其余参数保持不变。

第二步:ALB实例添加CNAME解析

  1. 执行以下命令,找到ALB实例对应的DNS名称。

    kubectl get albconfig

    预期输出:

    NAME       ALBID                    DNSNAME                                               PORT&PROTOCOL   CERTID   AGE
    alb-demo   alb-a8mmh2tqbmrm11****   alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com                             27s
    说明

    您也可以登录应用型负载均衡ALB控制台查看ALB实例的DNS名称。ALB控制台仅为查看实例配置,配置变更操作需要以下发的YAML文件为准。

  2. 完成以下步骤添加CNAME解析记录。

    1. 登录域名解析控制台

    2. 域名解析页面单击添加域名

    3. 添加域名对话框中输入您的域名,然后单击确认

      警告
      • 这里添加的域名为CLB实例绑定的域名。

      • 您的域名需已完成TXT记录验证。

    4. 在目标域名的操作列单击解析设置

    5. 解析设置页面单击添加记录

    6. 添加记录面板配置以下信息完成CNAME解析配置,然后单击确认

      配置

      说明

      记录类型

      在下拉列表中选择CNAME

      主机记录

      您的域名的前缀。本文输入www

      解析请求来源

      选择默认。

      记录值

      输入域名对应的CNAME地址,即您复制的ALB实例的DNS域名。

      TTL

      全称Time To Live,表示DNS记录在DNS服务器上的缓存时间。本文设置为5秒

      本文使用的是企业旗舰版云解析DNS,为方便验证将TTL设置为5秒。您可以根据实际情况进行设置,更多信息,请参见版本对比

      说明
      • 新增CNAME记录实时生效,修改CNAME记录取决于本地DNS缓存的解析记录的TTL到期时间,一般默认为10分钟。

      • 添加时如遇添加冲突,请换一个解析域名。更多信息,请参见解析记录互斥规则

第三步:设置权重,开始流量灰度

  1. 域名解析页面,单击目标域名,在解析设置页面, 单击左侧导航栏的权重配置

  2. 权重配置页面,在操作列单击开启权重,然后单击设置权重

    权重配置的启用条件是域名下存在相同的主机记录、相同解析线路的多条A记录、CNAME记录、AAAA记录。

  3. 设置权重面板,分别为CLBALB实例的解析记录设置权重。将CLB实例对应的解析记录的权重设置为100,同时将ALB实例对应的解析记录的权重设置为0

    域名权重设置

  4. 在观察业务没有影响的情况下,逐步减小CLB实例解析记录的权重值,同时逐步增加ALB实例解析记录的权重值。

  5. 登录对应service的后端Pod所在ECS上,多次执行dig命令,验证流量切换效果。

    dig www.example.net

    运行结果如下图所示。您可以通过多次运行结果观察到,请求会根据权重分配至ALBCLB处理。流量测试1流量测试2

  6. 根据流量切换的验证结果,逐步将CLB实例解析记录的权重值减小至0,同时逐步增加ALB实例解析记录的权重值至100。

如果您的DNS服务解析商不支持CNAME解析的权重配置,请单击此处查看流量切换方案。

image

步骤三:删除冗余资源

当Nginx Ingress长连接全部处理完成,且Nginx Ingress没有新增流量时,您可以根据业务场景静默观察一段时间后释放冗余资源。

  1. 删除Nginx Ingress。

    1. 登录容器计算服务控制台,在集群列表页面,找到目标集群,单击该集群。

    2. 在集群管理页左侧导航栏中,选择网络 > 路由

    3. 路由页面上方,选择命名空间,在Nginx Ingress右侧操作列,选择image > 删除

    4. 在弹出的对话框,单击确定

  2. 卸载Nginx Ingress Controller。