如何解决Cert-Manager中配置Let's Encrypt ClusterIssuer后执行kubectl get issuer无资源返回的问题?
问题分析与解决方案
嘿,我来帮你拆解下遇到的问题:
核心问题:ClusterIssuer vs Issuer 资源混淆
你执行 kubectl get issuer 看不到资源,是因为你创建的是ClusterIssuer(集群级资源),而 issuer 命令对应的是命名空间级的 Issuer 资源——这是cert-manager里两个完全不同的CRD(自定义资源定义)。
要查看你创建的ClusterIssuer,得用这个命令:
kubectl get clusterissuers
或者更简洁的缩写:
kubectl get clusterissuer
你的YAML配置里的两个潜在问题
除了资源类型的误解,你的配置还有两个需要修正的地方:
过时的API版本
你用的cert-manager.io/v1alpha2是旧版API,现在cert-manager的稳定版本已经用cert-manager.io/v1了,建议把apiVersion改成这个,避免后续出现兼容性问题。DNS Solver的Token配置错误
在digitalocean.tokenSecretRef.key字段里,你直接写了DigitalOcean的token值——这是错误的用法。这个字段应该指向你提前创建的Kubernetes Secret里的key名称,而不是直接填token内容。
正确的操作步骤是:
- 先创建存储DigitalOcean Token的Secret:
kubectl create secret generic digitalocean-dns --from-literal=token=5XXXX31d821ba586302ff5d38647b701de750823711ff55b2a776c60d8eXXXXX
- 然后修改ClusterIssuer配置里的key字段为你刚才设置的key名(比如这里是
token):
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: email: ykaratoprak@sphereinc.com server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt-prod solvers: - dns01: digitalocean: tokenSecretRef: name: digitalocean-dns key: token # 这里填Secret里的key名称,不是token值
关于“部分证书存在”的说明
你提到有部分证书存在,大概率是这些证书是通过其他Issuer/ClusterIssuer签发的,或者是手动创建的证书资源。你可以用以下命令排查它们的签发来源:
# 查看所有命名空间的证书 kubectl get certificates -A # 查看具体证书的详情,找到Issuer字段 kubectl describe certificate <你的证书名称> -n <证书所在命名空间>
在describe输出里,Issuer字段会明确显示该证书使用的是哪个签发者资源。
内容的提问来源于stack exchange,提问作者loki
相关产品推荐
相关产品推荐

