更新时间:2025-12-23 GMT+08:00
分享

Nginx Ingress迁移到ELB Ingress

本文包含需要您特别关注的重要提示信息,忽略这些信息可能会对您的业务产生影响,请务必仔细阅读。

背景

Kubernetes贡献者社区近日发布重磅博客《Ingress NGINX 退役:你需要了解的内容》,由SIG Network与安全响应委员会联合宣布:Ingress NGINX Controller正式进入退役流程。

公告核心要点如下:

  • 项目将尽力维护至2026年3月,之后不再提供任何官方支持
  • 停止发布新版本
  • 不再修复任何功能Bug或安全漏洞(包括未来可能披露的高危CVE)
  • GitHub仓库即将归档为只读状态,仅保留历史参考价值
  • 现有部署仍可继续运行,安装包也仍可下载,但不再获得安全更新这一消息在社区和企业用户中引发强烈反响。虽然官方强烈推荐迁移至Gateway API或其他20+活跃维护的Ingress控制器,但对大多数企业而言,真正关心的核心问题仍然是:
    • 新控制器能否兼容原有Nginx Ingress的Annotation?
    • 如何实现零中断灰度切流?
    • 一旦出现流量异常,如何在数秒内完成回滚?

为了帮助大家平稳度过这次强制升级,本文将以华为云CCE ELB Ingress为目标控制器,提供一套经过生产验证、可落地的完整迁移方案,涵盖Annotation替换对照表、灰度切换实操、监控告警、秒级回滚机制等全链路细节,确保业务零感知、无损上线。

ELB Ingress简介

ELB Ingress作为华为云CCE托管式Ingress方案,相较社区版nginx-ingress,在企业级应用场景中具备多维度显著优势。其核心优势在于托管式架构,无需用户部署维护控制器,华为云全程负责高可用部署、故障自愈与版本迭代,大幅降低运维复杂度与人力成本。

依托华为云ELB分布式架构,该方案具备更强的性能支撑与弹性伸缩能力,可轻松应对高并发流量场景,无需手动优化配置即可实现负载自动扩容,保障业务峰值稳定运行。同时,其深度集成华为云WAF、证书托管、监控日志等生态服务,安全防护与合规能力一键启用,无需额外开发集成,简化企业级功能落地流程。

此外,可视化配置界面与完善的故障诊断工具,降低了K8s Ingress使用门槛,规则同步与问题排查效率更高。对于华为云CCE环境下的企业核心业务,ELB Ingress以“降本增效、安全可靠”为核心价值,成为兼顾性能、稳定性与易用性的优选方案。

关于ELB Ingress和Nginx Ingress的对比请参见ELB Ingress和Nginx Ingress对比

迁移流程

通过将同一域名同时解析至Nginx Ingress与ELB Ingress,并逐步调整二者的解析权重,可实现对客户端无感知的服务迁移。下图呈现了基于DNS解析完成该无感迁移的整体流程。

通过DNS解析迁移并非是无感迁移的唯一方式,本文中的示例仅供您参考。

由于技术栈不同,迁移过程中需要涉及Nginx Ingress的annotation转换为ELB Ingress规范,详情请参见表1。您还可以通过使用注解(Annotations)配置ELB Ingress高级功能章节查看更多的ELB Ingress的配置规范。

ELB Ingress支持80-90%Nginx规则,但不支持Nginx特定功能如nginx.ingress.kubernetes.io/auth-*(需ELB控制台配置认证)或 nginx.ingress.kubernetes.io/configuration-snippet(自定义NGINX配置无等效ELB规则)。

表1 常见的注解转换对比

功能类别

Nginx Annotation示例

ELB等效Annotation示例

Ingress类指定

kubernetes.io/ingress.class: "nginx"

spec.ingressClassName: "cce" 或 kubernetes.io/ingress.class: "cce"(v1.21 及更早)

ELB ID关联

无(安装NGINX Ingress控制器插件时指定ELB)

kubernetes.io/elb.id: "<elb-uuid>"

ELB类型/规格

kubernetes.io/elb.class: "union"(共享)或 kubernetes.io/elb.class: "performance"(独享)

前端端口

kubernetes.io/elb.port: "80"

自动创建ELB

kubernetes.io/elb.autocreate: '{"type":"inner", "name": "A-location-d-test"}'

URL重写

nginx.ingress.kubernetes.io/rewrite-target: /$2

kubernetes.io/elb.rewrite-target: "/$2"

HTTP重定向至HTTPS

nginx.ingress.kubernetes.io/ssl-redirect: "true"

kubernetes.io/elb.ssl-redirect: "true"

kubernetes.io/elb.listen-ports: '[{"HTTP":80},{"HTTPS":443}]'

IP白名单

nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.0.0/16"

kubernetes.io/elb.acl-id: '<acl-uid>'

kubernetes.io/elb.acl-status: 'on'

kubernetes.io/elb.acl-type: 'black'

CORS支持

nginx.ingress.kubernetes.io/enable-cors: "true"

nginx.ingress.kubernetes.io/cors-allow-origin: "*"

kubernetes.io/elb.cors-allow-origin: 'http://example.com'

kubernetes.io/elb.cors-allow-headers: 'fake-header-1'

kubernetes.io/elb.cors-expose-headers: 'fake-header-2'

kubernetes.io/elb.cors-allow-methods: 'GET,POST'

kubernetes.io/elb.cors-allow-credentials: 'true'

kubernetes.io/elb.cors-max-age: '3600'

TLS证书

spec.tls.secretName(使用TLS密钥证书)

kubernetes.io/elb.tls-certificate-id: "<cert-id>" (使用ELB证书)或spec.tls.secretName(使用TLS密钥证书)

灰度发布

nginx.ingress.kubernetes.io/canary: "true"

nginx.ingress.kubernetes.io/canary-weight: "20"

kubernetes.io/elb.canary: "true"

kubernetes.io/elb.canary-weight: "100"

慢启动

无直接支持

kubernetes.io/elb.slow-start: "30"

标签 (Tags)

kubernetes.io/elb.tags: '{"key1":"value1","key2":"value2"}'

HTTP/2启用

nginx.ingress.kubernetes.io/ssl-protocols: "TLSv1.2 TLSv1.3"

kubernetes.io/elb.http2-enable: "true"

gRPC支持

nginx.ingress.kubernetes.io/backend-protocol: "GRPC"

kubernetes.io/elb.pool-protocol: "grpc"

场景示例

某企业在华为云使用CCE集群,并通过Nginx Ingress Controller配置Ingress转发规则,配置域名和路径的转发策略,且对外通过DNS域名提供服务。客户端访问域名example.com时,Nginx Ingress接收到请求会根据对应的转发策略将流量转发至对应Service的Pod上。

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

在将流量完全转移至ELB Ingress后,您可以删除DNS解析中的Nginx Ingress解析记录,移除Nginx Ingress相关资源,全流程对客户端无感。

  • 建议在业务低谷期进行流量切换。
  • 在切换前,请对比Nginx Ingress和ELB Ingress的转发规则,并进行充分测试,确保两者功能完全一致,以避免切换过程中对业务造成影响。
  • 切换过程中,使用ELB会产生计费信息,具体计费详情请参见计费概述

步骤一:配置待迁移的ELB Ingress

  1. 创建待迁移的ELB Ingress。本文示例中未配置复杂的转发规则,仅创建一个基础的ELB Ingress,指向原有的后端服务。在实际的业务中,您需要分析原有的Nginx Ingress转发规则配置,并在ELB Ingress中添加相应的替代配置,详情请参见表1

    本例中使用已有ELB创建Ingress,创建elbingress.yaml文件示例如下。您还可以选择自动创建Ingress关联的ELB,更多指导请参见通过Kubectl命令行创建ELB Ingress
    apiVersion: networking.k8s.io/v1
    kind: Ingress 
    metadata: 
      name: ingress-test
      annotations: 
        kubernetes.io/elb.id: <your_elb_id>  #替换为您已有的ELB ID
        kubernetes.io/elb.ip: <your_elb_ip>  #替换为您已有的ELB IP
        kubernetes.io/elb.class: performance  #ELB类型,performance表示独享型ELB
        kubernetes.io/elb.port: '80' 
    spec:
      rules: 
      - host: 'example.com'            #替换为您的域名 
        http: 
          paths: 
          - path: '/'
            backend: 
              service:
                name: <your_service_name>  #替换为您的目标服务名称,与原Nginx Ingress关联的服务一致
                port: 
                  number: 8080             #替换为您的目标服务端口
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
      ingressClassName: cce  

  2. 执行下面命令创建Ingress。

    kubectl apply -f elbingress.yaml

  3. ELB Ingress创建完成后,您需要对其进行充分验证,确保新建的ELB Ingress与原有的Nginx Ingress访问功能完全一致。

步骤二:将流量逐渐转移至ELB Ingress

流量切换前,假设您已将业务域名通过A记录解析的方式指向了Nginx Ingress的公网地址。您可以使用DNS的流量权重分配,逐步将访问原Nginx Ingress的流量切换至新的ELB Ingress。

您可以通过以下步骤完成流量的切换。

  1. 进入公网域名列表页面
  2. 在“公网域名”页面的域名列表中,单击域名example.com的名称。
  3. 进入“解析记录”页面。此时已存在一个A记录,对应Nginx Ingress使用的ELB公网IP,设置Nginx Ingress的A记录的权重为100。
  4. 单击“添加记录集”,添加A记录,地址为ELB Ingress使用的ELB公网IP,并将权重设置为0。

    图1 添加DNS记录集

  5. 在观察业务没有影响的情况下,减少Nginx Ingress解析记录的权重(如90),同时增加ELB Ingress解析记录的权重(如10)。
  6. 验证流量切换的效果,确认部分流量已被转发至新的ELB Ingress,并无异常产生。
  7. 重复5~6,逐步将Nginx Ingress解析记录的权重减少至0,同时逐步增加ELB Ingress解析记录的权重至100。

步骤三:删除冗余资源

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

  1. 在DNS中删除Nginx Ingress的解析记录。
  2. 在集群中删除Nginx Ingress资源。
  3. 卸载Nginx Ingress控制器插件。
  4. 删除Nginx Ingress绑定的ELB。

相关文档

相关文档