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规则)。
|
功能类别 |
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
- 创建待迁移的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 - 执行下面命令创建Ingress。
kubectl apply -f elbingress.yaml
- ELB Ingress创建完成后,您需要对其进行充分验证,确保新建的ELB Ingress与原有的Nginx Ingress访问功能完全一致。
步骤二:将流量逐渐转移至ELB Ingress
流量切换前,假设您已将业务域名通过A记录解析的方式指向了Nginx Ingress的公网地址。您可以使用DNS的流量权重分配,逐步将访问原Nginx Ingress的流量切换至新的ELB Ingress。
您可以通过以下步骤完成流量的切换。
- 进入公网域名列表页面。
- 在“公网域名”页面的域名列表中,单击域名example.com的名称。
- 进入“解析记录”页面。此时已存在一个A记录,对应Nginx Ingress使用的ELB公网IP,设置Nginx Ingress的A记录的权重为100。
- 单击“添加记录集”,添加A记录,地址为ELB Ingress使用的ELB公网IP,并将权重设置为0。
图1 添加DNS记录集
- 在观察业务没有影响的情况下,减少Nginx Ingress解析记录的权重(如90),同时增加ELB Ingress解析记录的权重(如10)。
- 验证流量切换的效果,确认部分流量已被转发至新的ELB Ingress,并无异常产生。
- 重复5~6,逐步将Nginx Ingress解析记录的权重减少至0,同时逐步增加ELB Ingress解析记录的权重至100。
步骤三:删除冗余资源
当Nginx Ingress长连接全部处理完成,且Nginx Ingress没有新增流量时,您可以根据业务场景静默观察一段时间后释放冗余资源。
- 在DNS中删除Nginx Ingress的解析记录。
- 在集群中删除Nginx Ingress资源。
- 卸载Nginx Ingress控制器插件。
- 删除Nginx Ingress绑定的ELB。
相关文档
- 关于ELB Ingress和Nginx Ingress的对比请参见ELB Ingress和Nginx Ingress对比。
- 更多ELB Ingress支持的Annotation,请参见使用注解(Annotations)配置ELB Ingress高级功能。