# Nginx Ingress迁移到ELB Ingress
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
本文包含需要您特别关注的重要提示信息，忽略这些信息可能会对您的业务产生影响，请务必仔细阅读。
#### 背景
Kubernetes贡献者社区近日发布重磅博客[《Ingress NGINX 退役：你需要了解的内容》](https://kubernetes.io/zh-cn/blog/2025/11/11/ingress-nginx-retirement/)，由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，在企业级应用场景中具备多维度显著优势。其核心优势在于托管式架构，无需用户部署维护控制器，华为云CCE全程负责高可用部署、故障自愈与版本迭代，大幅降低运维复杂度与人力成本。
依托华为云ELB分布式架构，该方案具备更强的性能支撑与弹性伸缩能力，可轻松应对高并发流量场景，无需手动优化配置即可实现负载自动扩容，保障业务峰值稳定运行。同时，其深度集成华为云WAF、证书托管、监控日志等生态服务，安全防护与合规能力一键启用，无需额外开发集成，简化企业级功能落地流程。
此外，可视化配置界面与完善的故障诊断工具，降低了K8s Ingress使用门槛，规则同步与问题排查效率更高。对于华为云CCE环境下的企业核心业务，ELB Ingress以"降本增效、安全可靠"为核心价值，成为兼顾性能、稳定性与易用性的优选方案。
关于ELB Ingress和Nginx Ingress的对比请参见[ELB Ingress和Nginx Ingress对比](https://support.huaweicloud.com/usermanual-cce/cce_10_0850.html)。
#### 迁移流程
通过将同一域名同时解析至Nginx Ingress与ELB Ingress，并逐步调整二者的解析权重，可实现对客户端无感知的服务迁移。下图呈现了基于DNS解析完成该无感迁移的整体流程。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
通过DNS解析迁移并非是无感迁移的唯一方式，本文中的示例仅供您参考。
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002493314242.png "点击放大")
由于技术栈不同，迁移过程中需要涉及Nginx Ingress的annotation转换为ELB Ingress规范，详情请参见[表1]。您还可以通过[ELB Ingress注解（Annotations）配置合集](https://support.huaweicloud.com/usermanual-cce/cce_10_0695.html)章节查看更多的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上。
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001999928840.png "点击放大")
由于业务发展需要，该企业需要将Nginx Ingress迁移到ELB Ingress上。为了保持业务稳定，希望不改变对外提供服务的DNS域名及后端服务器的IP地址。您可以通过在CCE集群上配置ELB Ingress规则，使ELB提供的转发策略与之前一致，然后利用DNS域名解析的权重设置完成流量的迁移。
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002525673781.png "点击放大")
在将流量完全转移至ELB Ingress后，您可以删除DNS解析中的Nginx Ingress解析记录，移除Nginx Ingress相关资源，全流程对客户端无感。
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002036168221.png "点击放大")
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
- 建议在业务低谷期进行流量切换。
- 在切换前，请对比Nginx Ingress和ELB Ingress的转发规则，并进行充分测试，确保两者功能完全一致，以避免切换过程中对业务造成影响。
- 切换过程中，使用ELB会产生计费信息，具体计费详情请参见[计费概述](https://support.huaweicloud.com/price-elb/elb_billing_0001.html)。
 
#### 步骤一：配置待迁移的ELB Ingress
1. 创建待迁移的ELB Ingress。本文示例中未配置复杂的转发规则，仅创建一个基础的ELB Ingress，指向原有的后端服务。在实际的业务中，您需要分析原有的Nginx Ingress转发规则配置，并在ELB Ingress中添加相应的替代配置，详情请参见[表1]。
   
   本例中使用已有ELB创建Ingress，创建elbingress.yaml文件示例如下。您还可以选择自动创建Ingress关联的ELB，更多指导请参见[通过Kubectl命令行创建ELB Ingress](https://support.huaweicloud.com/usermanual-cce/cce_10_0252.html)。
   ```
   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. 进入[公网域名列表页面](https://console.huaweicloud.com/dns/?#/dns/publiczones)。
2. 在"公网域名"页面的域名列表中，单击域名example.com的名称。
3. 进入"解析记录"页面。此时已存在一个A记录，对应Nginx Ingress使用的ELB公网IP，设置Nginx Ingress的A记录的权重为100。
4. 单击"添加记录集"，添加A记录，地址为ELB Ingress使用的ELB公网IP，并将权重设置为0。 
   图1添加DNS记录集   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002531271619.png "点击放大")
   
   
   
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。
 
#### 相关文档
- 关于ELB Ingress和Nginx Ingress的对比请参见[ELB Ingress和Nginx Ingress对比](https://support.huaweicloud.com/usermanual-cce/cce_10_0850.html)。
- 更多ELB Ingress支持的Annotation，请参见[ELB Ingress注解（Annotations）配置合集](https://support.huaweicloud.com/usermanual-cce/cce_10_0695.html)。
 
