You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Helm升级AKS旧集群NGINX Ingress Controller失败问题咨询

问题根因

这个报错和当前运行的NGINX Ingress Deployment使用的apps/v1 API版本无关。核心问题是最初用Helm 2部署时,存储在集群Secret里的release历史元数据残留了extensions/v1beta1版本的Deployment记录。Kubernetes 1.16之后已经完全移除了extensions/v1beta1版本的Deployment资源,当前集群版本为1.20.9,本身已经不识别该旧API。Helm 3执行upgrade时会先拉取历史release的完整清单做资源diff,读到已废弃的API条目就会直接抛出识别错误,中断升级流程。

解决方案

方案1:修复历史release元数据(推荐,零业务中断)

  • 本地Helm 3环境安装mapkubeapis插件,这个工具会自动扫描指定release历史清单里所有被当前K8s版本移除的旧API资源,自动替换为兼容的新API版本,全程不会修改正在运行的业务负载。
  • 执行修复命令,指定目标release和命名空间:
helm mapkubeapis awesome-nginx --namespace ingress-nginx
  • 修复完成后,直接重新执行原来的升级命令即可:
helm upgrade awesome-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx -f nginx-reuse-values-file.yaml

升级前可以先安装helm diff插件,执行helm diff upgrade核对所有变更项,确认不会误删资源、丢失配置。

方案2:元数据损坏时的接管部署方案

如果历史release元数据损坏严重,插件无法完成修复,可以用保留资源+重新接管的方式操作,全程不会中断业务流量:

  • 先备份当前NGINX Ingress的所有运行资源配置,重点留存Service(尤其是LoadBalancer类型的公网IP配置)、Deployment、ConfigMap、CRD的参数。
  • 执行Helm卸载命令,加--keep-resources参数保留所有正在运行的资源,不删除实际业务负载:
helm uninstall awesome-nginx --namespace ingress-nginx --keep-resources
  • 执行helm list -n ingress-nginx确认旧release已经被移除,同时检查所有NGINX Ingress的Pod、Service仍在正常运行、流量转发无异常后,用原release名称、匹配现有资源配置的values文件执行全新安装,加--take-ownership参数让新的Helm release接管已存在的资源:
helm install awesome-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx -f nginx-reuse-values-file.yaml --take-ownership
  • 等待新控制器Pod滚动更新完成,验证所有Ingress路由转发正常即可。
升级注意事项
  • 从0.27.0跨大版本升级到v1.20.0时,必须提前核对values字段的变更:旧版本的镜像路径、annotation前缀、命名空间监听规则、配置项挂载逻辑在新版本中都有调整,直接硬套旧values会导致配置不生效。
  • 升级前要把集群内所有旧版本Ingress资源(extensions/v1beta1、networking.k8s.io/v1beta1)全部转换为networking.k8s.io/v1版本,否则新版本控制器无法识别这些Ingress规则,会出现路由失效。
  • 所有操作先在测试环境验证通过,再上生产执行。

内容的提问来源于stack exchange,提问作者user2425909

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:24:23