Kubernetes cert-manager创建证书时challenge资源挂起无事件无状态问题
问题成因
- 资源乐观锁冲突:日志中明确抛出
Operation cannot be fulfilled错误,是cert-manager多个控制器协程同时修改Certificate、CertificateRequest对象,触发Kubernetes资源版本校验失败,任务反复入队重试,导致流程无法推进到HTTP-01挑战的临时Ingress创建步骤 - RBAC权限缺失:cert-manager控制器没有在业务命名空间下创建Ingress、Service、Pod资源的权限,挑战初始化逻辑执行失败但未输出对应错误日志
- IngressClass配置不匹配:集群中实际运行的NGINX Ingress Controller的class名称和ClusterIssuer中配置的
nginx不一致,控制器无法匹配到可用的Ingress实现,直接跳过挑战资源处理
解决方案
1. 重置卡住的证书签发流程
删除当前异常的相关资源,清空冲突队列:
# 删除异常证书、挑战、订单资源 kubectl delete cert -n citizen-capital citizen-capital-preprod-tls kubectl delete challenge -n citizen-capital citizen-capital-preprod-tls-7dnxx-3938188414-701554649 kubectl delete order -n citizen-capital citizen-capital-preprod-tls-7dnxx-3938188414 # 重启cert-manager控制器清空内部任务队列 kubectl rollout restart deployment -n cert-manager cert-manager
2. 校验cert-manager RBAC权限
确认cert-manager控制器拥有创建挑战相关资源的权限:
kubectl describe clusterrole cert-manager-controller | grep -A10 "Rules:" | grep -E "ingresses|services|pods"
如果输出中没有对应资源的create权限,重新安装对应版本的cert-manager官方RBAC配置即可修复。
3. 校验IngressClass配置
查询集群中实际存在的IngressClass:
kubectl get ingressclass
如果实际的NGINX IngressClass名称不是nginx,有两种修复方式:
- 修改ClusterIssuer
letsencrypt-prod的solver.http01.ingress.class配置为实际的IngressClass名称 - 给现有NGINX Ingress Controller添加注解
ingressclass.kubernetes.io/is-default-class: "true",设置为默认IngressClass
4. 重新触发证书签发
重新应用Certificate资源,等待2分钟后验证资源状态:
# 查看挑战资源状态 kubectl get challenges -n citizen-capital # 查看是否生成临时HTTP-01验证Ingress kubectl get ingress -n citizen-capital
可选:开启debug日志排查
如果以上操作后问题仍然存在,修改cert-manager deployment的启动参数,添加-v=5开启debug级别日志,可输出更详细的执行错误信息用于定位。
内容的提问来源于stack exchange,提问作者Martin Paucot
相关产品推荐
相关产品推荐

