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

部署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.io
  • orders.acme.cert-manager.io
  • certificaterequests.cert-manager.io
  • certificates.cert-manager.io
  • issuers.cert-manager.io
  • clusterissuers.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资源:
    kubectl get ingress -n istio-system
    
    确认该Ingress的class为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ý

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:31:36