Helm升级AGIC至1.5.x报IngressClass资源已存在的解决方法
AKS集群关联2个不同的应用程序网关(AGW),通过Helm执行AGIC 1.5.1版本升级验证操作时出现报错,执行的升级命令如下:
helm upgrade agic-ass application-gateway-kubernetes-ingress/ingress-azure --version 1.5.1
返回的错误信息:
Error: UPGRADE FAILED: rendered manifests contain a resource that already exists. Unable to continue with update: IngressClass "azure-application-gateway" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "agic-ass"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "default"
报错核心是集群内已存在名为azure-application-gateway的集群级IngressClass资源,该资源没有当前待升级的agic-ass Helm release对应的所有权标签与注解,Helm为避免非管控资源被误覆盖,直接终止了升级流程。
由于集群同时关联2个AGW、部署了多套AGIC实例,默认配置下所有AGIC都会尝试创建同名的azure-application-gateway IngressClass,本身就会出现资源冲突,这也是触发该问题的常见场景。
根据实际部署场景二选一操作即可:
方案1:双AGIC场景(推荐,适配2个AGW的架构)
多AGIC部署不能共用同一个IngressClass,否则会出现多实例抢Ingress资源配置的异常,需要为每个AGIC配置独立的专属IngressClass:
- 执行升级命令时,通过
--set参数为当前升级的agic-ass实例指定独立的IngressClass名称,例如将其命名为azure-application-gateway-ass,完整升级命令如下:
helm upgrade agic-ass application-gateway-kubernetes-ingress/ingress-azure --version 1.5.1 \ --set ingressClassResource.name=azure-application-gateway-ass \ --set ingressClassResource.enabled=true
- 后续创建Ingress资源时,通过
spec.ingressClassName字段指定对应AGIC的专属IngressClass名称,即可将流量规则分发到对应的AGW实例。 - 对另一套AGIC实例也做相同配置,给它分配另一个独立的IngressClass名称,从根源避免集群级资源冲突。
方案2:单AGIC场景(确认现有IngressClass归属当前release)
如果集群实际只运行一套AGIC,已存在的azure-application-gateway IngressClass就是当前agic-ass release应该管控的资源,只是之前部署时缺失了Helm所有权标记,手动补全对应标签和注解即可:
- 为IngressClass添加Helm管控标签:
kubectl label ingressclass azure-application-gateway app.kubernetes.io/managed-by=Helm
- 添加Helm release名称注解:
kubectl annotate ingressclass azure-application-gateway meta.helm.sh/release-name=agic-ass
- 添加Helm release所在命名空间注解:
kubectl annotate ingressclass azure-application-gateway meta.helm.sh/release-namespace=default
执行完以上操作后,重新运行原始的Helm升级命令即可完成升级。
注意:双AGIC场景禁止使用方案2,否则会导致另一套AGIC失去IngressClass管控权,出现运行异常。
内容的提问来源于stack exchange,提问作者ning san

