部署Istio的K8s集群中cert-manager无法创建Let's Encrypt证书
问题分析与解决方案
核心问题定位
日志中出现的the server could not find the requested resource (get challenges.acme.cert-manager.io),说明cert-manager的ACME相关自定义资源定义(CRD)未正确部署或未被集群识别。challenges.acme.cert-manager.io是cert-manager处理ACME HTTP01挑战时依赖的自定义资源,缺失该CRD会导致挑战流程无法推进,最终证书处于Pending状态,仅生成临时密钥。
分步解决方案
1. 验证cert-manager CRD完整性
执行以下命令检查所有cert-manager相关CRD是否存在:
kubectl get crds | grep cert-manager
正常输出应包含:
challenges.acme.cert-manager.ioorders.acme.cert-manager.iocertificaterequests.cert-manager.iocertificates.cert-manager.ioissuers.cert-manager.ioclusterissuers.cert-manager.io
如果challenges.acme.cert-manager.io缺失,说明cert-manager安装不完整。
2. 重新部署cert-manager CRD
确保安装cert-manager时先部署官方CRD(版本需与你的cert-manager控制器版本匹配,示例使用v1.11.0,替换为你的实际版本):
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.crds.yaml
部署完成后,等待1-2分钟让集群识别CRD,再检查cert-manager Pod日志是否还有资源找不到的错误。
3. 检查cert-manager控制器与CRD版本一致性
执行以下命令查看控制器版本:
kubectl get pods -n cert-manager -o jsonpath='{.items[0].spec.containers[0].image}' | cut -d: -f2
确保该版本与CRD版本完全一致,版本不匹配会导致CRD无法被正确识别。
4. 排查HTTP01挑战路由配置
虽然你提到可访问/.well-known/acme-challenge/,仍需确认:
- Istio IngressGateway的NodePort(80端口)已正确暴露到外部,且防火墙/安全组允许80端口的入站流量。
- 你的域名解析记录指向集群节点的公网IP(因为使用NodePort而非LoadBalancer)。
- 检查cert-manager自动创建的用于挑战的Ingress资源:
确认该Ingress的kubectl get ingress -n istio-systemclass为istio,且规则正确指向ACME挑战路径。
5. 查看Order资源的详细状态
执行以下命令查看Order资源的具体错误信息:
kubectl describe order istio-system/my--domain-com-jl6gm-3167624428
该资源会记录挑战的具体进展,比如是否创建了Challenge资源、挑战是否被验证等,有助于定位后续问题。
额外注意事项
- 如果你是通过自定义方式安装cert-manager,确保没有遗漏ACME相关的CRD组件。
- 检查Calico网络策略是否阻止了cert-manager控制器与API Server之间的通信,或阻止了IngressGateway与挑战Pod的通信。
内容的提问来源于stack exchange,提问作者Tomáš Přitrský
相关产品推荐
相关产品推荐

