GKE私有集群中cert-manager HTTP-01挑战失败(401错误)求助
GKE私有集群中cert-manager HTTP-01挑战401失败排查方案
1. 私有集群端口访问权限检查
私有集群默认存在控制平面与节点的网络隔离,cert-manager的cm-acme-http-solver服务依赖GCP ALB的访问完成挑战,需确认以下配置:
- 检查节点池防火墙规则,是否允许GCP LB的IP段(
35.191.0.0/16、130.211.0.0/22)访问节点的NodePort端口范围(30000-32767)。 - 用命令查看现有规则:
gcloud compute firewall-rules list --filter="targetTags=YOUR_CLUSTER_NODE_TAGS" - 若缺少对应规则,创建一条允许ALB访问NodePort的规则:
gcloud compute firewall-rules create allow-alb-to-nodeport \ --allow tcp:30000-32767 \ --source-ranges 35.191.0.0/16,130.211.0.0/22 \ --target-tags YOUR_CLUSTER_NODE_TAGS \ --description "Allow GCP ALB to access NodePort services"
2. Ingress路径冲突修正
你的Ingress配置中/前缀路径会匹配所有请求,包括cert-manager的挑战路径/.well-known/acme-challenge/,若后端服务有认证拦截,会直接返回401。需添加优先匹配的挑战路径规则:
ingress: enabled: true annotations: kubernetes.io/ingress.class: 'gce' hosts: - host: myhost.com paths: - path: /.well-known/acme-challenge/ pathType: Prefix backend: service: name: cm-acme-http-solver-XXXX # 替换为实际solver服务名 port: number: 8089 - path: / pathType: Prefix tls: - hosts: - myhost.com # 修正原配置中的笔误myhost.com.com secretName: customer-secret-tls
注:cm-acme-http-solver为cert-manager临时创建的服务,可通过kubectl get svc -n cert-manager查看实际名称。
3. Cert-manager配置验证
- 确认Issuer/ClusterIssuer的HTTP-01 solver配置正确,指定GCE Ingress类:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: your-email@example.com privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: gce - 查看cert-manager核心日志获取细节:
kubectl logs -n cert-manager -l app=cert-manager
4. 后端服务认证规则排除
若myhost.com对应的后端服务配置了OAuth2、Basic Auth等认证机制,需将/.well-known/acme-challenge/路径添加到认证白名单,允许匿名访问。
内容的提问来源于stack exchange,提问作者Waseem Mir
相关产品推荐
相关产品推荐

