GCP Kubernetes中cert-manager HTTP-01校验404错误求助
解决GCP Kubernetes中cert-manager HTTP-01挑战404问题
核心排查与修复步骤
1. 检查自动生成的挑战Ingress状态
cert-manager会为HTTP-01挑战创建临时Ingress,先确认其基本运行状态:
- 列出backend命名空间下的Ingress,定位
cm-acme-http-solver-开头的条目:
检查kubectl get ingress -n backendADDRESS列是否有分配GCP负载均衡IP,若为空则说明Ingress未成功创建,需排查GCP负载均衡配额或cert-manager权限。 - 查看该Ingress的详细配置,验证路径规则与后端关联:
确认kubectl describe ingress <自动Ingress名称> -n backendRules包含/.well-known/acme-challenge/*的路径,Backend关联到cm-acme-http-solver-开头的Service,同时检查对应Pod状态:kubectl get pods -n backend | grep cm-acme-http-solver
2. 确认域名DNS解析指向正确IP
HTTP-01挑战要求域名必须解析到挑战Ingress的IP:
- 用
dig验证域名解析结果:
对比返回的IP与挑战Ingress的dig api.lumiwealth.comADDRESS,若不一致,需在域名服务商处将api.lumiwealth.com的A记录修改为该Ingress的IP(GCP Ingress创建后会自动分配负载均衡IP,需手动更新DNS)。
3. 检查GCP防火墙规则
GCP Ingress-GCE需要开放80端口的入站流量:
- 登录GCP控制台,进入VPC网络 > 防火墙规则,查找
k8s-fw-开头的规则,确认其允许tcp:80端口的入站流量,目标为集群节点标签(如gke-<集群名>-<节点池名>-*),来源为0.0.0.0/0。 - 若缺失该规则,手动创建:
- 名称:
allow-http-acme-challenge - 目标标签:通过
kubectl get nodes --show-labels获取集群节点标签 - 协议端口:
tcp:80 - 来源IP范围:
0.0.0.0/0 - 行动:允许
- 名称:
4. 修正ClusterIssuer的Ingress类配置
GKE 1.19+版本推荐使用ingressClassName字段,更新ClusterIssuer配置:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: email: "rob@lumiwealth.com" privateKeySecretRef: name: letsencrypt-prod server: "https://acme-v02.api.letsencrypt.org/directory" solvers: - http01: ingress: ingressClassName: ingress-gce # 替换原class字段
应用更新:
kubectl apply -f cluster-issuer.yaml
5. 验证cert-manager权限
确保cert-manager服务账号有权限在backend命名空间创建资源:
kubectl auth can-i create ingress -n backend --as=system:serviceaccount:cert-manager:cert-manager
若返回no,需检查cert-manager安装时的RBAC配置,确保包含backend命名空间的权限。
重置挑战流程
修正配置后,删除现有证书触发重新挑战:
kubectl delete certificate test-certificate -n backend kubectl apply -f test-certificate.yaml
查看cert-manager日志跟踪挑战状态:
kubectl logs -n cert-manager -l app=cert-manager -f
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

