Cert-manager证书未生成且挑战未创建,Ingress无外部IP问题求助
解决cert-manager证书签发失败(Order无挑战、Secret为空)问题
我仔细看了你的配置和调试信息,核心问题出在Issuer的私钥Secret与证书Secret同名,这直接导致cert-manager无法正常与Let's Encrypt的ACME服务器交互,进而卡住了Order流程,无法创建HTTP-01挑战。另外还有一些细节需要调整,下面一步步来解决:
1. 核心错误:Issuer的私钥Secret和证书Secret重复
你的issuer.yaml里,privateKeySecretRef.name设置成了letsencrypt-staging-tls,这和Ingress中指定的证书Secret名称完全一样:
# issuer.yaml里的错误配置 privateKeySecretRef: name: letsencrypt-staging-tls # 这个应该是ACME账户私钥的存储Secret,不能和证书Secret同名
cert-manager中,Issuer的privateKeySecretRef是用来存储ACME账户的私钥(和Let's Encrypt通信的身份密钥),而Ingress的tls.secretName是用来存储最终签发的域名证书,这两个是完全独立的资源,同名会导致cert-manager混淆,无法正确生成账户私钥,进而无法创建有效的Order和挑战。
2. 修复步骤
步骤1:修改Issuer配置
更新issuer.yaml,把privateKeySecretRef.name改成一个全新的名称,比如letsencrypt-staging-account:
apiVersion: certmanager.k8s.io/v1alpha1 kind: Issuer metadata: name: letsencrypt-staging namespace: staging spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory email: hello@site.io privateKeySecretRef: name: letsencrypt-staging-account # 改成新的名称,和证书Secret区分开 http01: {}
步骤2:清理现有异常资源
先删除已经创建的异常Secret、Certificate和Order,避免残留问题:
# 删除异常证书Secret kubectl delete secret letsencrypt-staging-tls -n staging # 删除cert-manager创建的Certificate资源 kubectl delete certificate letsencrypt-staging-tls -n staging # 删除卡住的Order资源 kubectl delete order letsencrypt-staging-tls-593754378 -n staging
步骤3:重新应用配置
先更新Issuer,再重新应用Ingress:
kubectl apply -f issuer.yaml -n staging kubectl apply -f ingress.yaml -n staging
步骤4:验证流程
等待几分钟后,检查资源状态:
- 查看Certificate状态,确认
Ready变为True:kubectl describe certificate letsencrypt-staging-tls -n staging - 查看Order状态,确认是否创建了Challenge资源:
kubectl describe order <new-order-name> -n staging - 查看cert-manager的日志,确认没有报错:
kubectl logs -n cert-manager $(kubectl get pods -n cert-manager -l app=cert-manager -o name)
3. 额外注意事项
- 确保你的三个域名(
staging.site.io、staging.admin.site.io、staging.api.site.io)都正确解析到了nginx-ingress-controller的外部IP,HTTP-01挑战需要域名能被公网访问到。 - 检查nginx-ingress-controller的日志,确认不再出现
local SSL certificate staging/letsencrypt-staging-tls was not found的错误,这说明证书已经成功挂载。 - 关于Ingress没有外部IP的问题,如果你用的是云厂商的K8s集群,需要确认是否配置了LoadBalancer类型的Ingress Controller;如果是本地集群,可能需要用NodePort或者PortForward,不过你已经能通过Controller的IP访问,这个不影响证书签发,只是Ingress本身的IP问题,后续可以单独排查。
内容的提问来源于stack exchange,提问作者JC97
相关产品推荐
相关产品推荐

