K8s中使用LetsEncrypt ClusterIssuer时证书状态始终为False
第一步先查询关联的Order资源状态
从CertificateRequest的输出可以看到已经生成了待处理的Orderabc/ingress-cert-dp6sp-3843501305,执行以下命令查看Order的事件和状态:kubectl describe order ingress-cert-dp6sp-3843501305 -n abc从Order的输出可以定位到是挑战资源创建失败、公网验证失败还是上游ACME服务返回错误。
检查API版本兼容性
你当前ClusterIssuer使用的API版本是cert-manager.io/v1alpha2,而Certificate的API版本是cert-manager.io/v1beta1,版本不一致大概率是问题根源:- 先确认集群中cert-manager的实际版本,若为1.0+版本,建议将所有cert-manager相关资源(ClusterIssuer、Ingress annotation对应配置)统一适配为
cert-manager.io/v1版本 - 确认cert-manager的CRD已经同步升级到对应版本,缺失CRD会导致资源状态无法正常同步
- 先确认集群中cert-manager的实际版本,若为1.0+版本,建议将所有cert-manager相关资源(ClusterIssuer、Ingress annotation对应配置)统一适配为
检查http01挑战资源状态
正常签发流程中cert-manager会自动创建临时的挑战用Service、Ingress资源,执行以下命令确认资源是否正常创建:kubectl get svc,ingress -n abc | grep cm-acme-http-solver若没有对应资源,查看cert-manager控制器日志排查报错:
kubectl logs -n cert-manager <cert-manager-controller-pod名称>重点排查是否有权限不足、IngressClass匹配错误的报错。
公网连通性校验
Let's Encrypt的ACME服务需要从公网访问你的域名80端口完成挑战验证:- 确认
abc.xyz.com的DNS解析已经正确指向集群Ingress的公网出口IP - 确认集群的安全组、防火墙已经放通80端口的公网入向访问
- 确认你没有配置全局的HTTP强制跳转HTTPS规则,该规则会导致ACME服务无法通过HTTP协议读取挑战内容,若有配置需要排除
/.well-known/acme-challenge/路径的跳转规则
- 确认
检查是否触发速率限制
Let's Encrypt生产环境对同一个一级域名每周最多签发50张证书,若近期大量申请证书触发了速率限制,也会导致申请卡住,可从cert-manager日志中查看是否有ACME服务返回的速率限制报错,触发限制后需等待一周恢复,或临时切换到Let's Encrypt staging环境测试。重试流程
若上述排查后无异常,可清理残留的卡住资源重新触发签发:kubectl delete certificate ingress-cert -n abc kubectl delete secret ingress-cert -n abc kubectl delete certificaterequest ingress-cert-dp6sp -n abc kubectl delete order ingress-cert-dp6sp-3843501305 -n abc清理完成后重新apply你的Ingress配置即可。
最后确认ClusterIssuer状态
执行以下命令确认ClusterIssuer本身处于Ready状态:kubectl describe clusterissuer letsencrypt若ClusterIssuer状态异常,需先修复ClusterIssuer的配置(如ACME账号注册失败、私钥丢失等问题)。
内容的提问来源于stack exchange,提问作者devcloud

