You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:24:35