升级ingress-nginx 1.0.3后cert-manager证书自动续期失败如何解决?
问题根因
- ingress-nginx 从1.0版本开始默认关闭了对旧版
kubernetes.io/ingress.class注解的兼容,仅识别spec.ingressClassName字段绑定的IngressClass资源 - cert-manager v1.4.0默认生成的ACME HTTP01挑战Ingress仅配置旧注解,未填充
spec.ingressClassName字段,因此无法被升级后的ingress-nginx识别
方案1:配置cert-manager生成挑战Ingress时使用spec.ingressClassName字段
- 版本适配说明:该问题已经在cert-manager v1.5.0及以上版本原生支持,无需额外配置模板,直接在Solver中指定对应参数即可。
- 具体配置方法:
- 若你使用cert-manager v1.5.0+,直接修改你的Issuer/ClusterIssuer配置,在HTTP01 solver中添加
ingressClassName参数:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer # 或Issuer spec: acme: # 其余配置保持不变 solvers: - http01: ingress: # 替换为你实际使用的IngressClass的名称 ingressClassName: nginx- 若你暂时不想升级cert-manager,仍使用v1.4.0版本,可以通过
ingressTemplate字段强制注入spec.ingressClassName配置:
配置更新后,cert-manager新生成的挑战Ingress会自动填充apiVersion: cert-manager.io/v1 kind: ClusterIssuer # 或Issuer spec: acme: # 其余配置保持不变 solvers: - http01: ingress: class: nginx ingressTemplate: spec: # 替换为你实际使用的IngressClass的名称 ingressClassName: nginxspec.ingressClassName字段,无需手动修改。 - 若你使用cert-manager v1.5.0+,直接修改你的Issuer/ClusterIssuer配置,在HTTP01 solver中添加
方案2:配置ingress-nginx兼容旧版kubernetes.io/ingress.class注解
ingress-nginx 1.0+只是默认关闭了旧注解兼容能力,并非完全不支持,可通过修改控制器启动参数开启兼容:
- 如果使用helm安装ingress-nginx,直接更新values.yaml配置:
controller: # 开启对未指定ingressClassName、仅带旧注解的Ingress的监听 watchIngressWithoutClass: true # 你的控制器对应的ingressClass名称 ingressClass: nginx ingressClassResource: name: nginx enabled: true default: false # 若需要设置为默认IngressClass可改为true controllerValue: "k8s.io/ingress-nginx" - 如果是直接部署的yaml,给ingress-nginx控制器的容器启动参数添加以下配置:
args: - /nginx-ingress-controller - --watch-ingress-without-class=true - --ingress-class=nginx # 替换为你的IngressClass名称 # 其余原有参数保持不变
配置更新后,控制器就可以正常识别仅带kubernetes.io/ingress.class注解的Ingress资源,包括cert-manager生成的挑战Ingress。
内容的提问来源于stack exchange,提问作者e.dan
相关产品推荐
相关产品推荐

