Kubernetes部署FastAPI:cert-manager HTTP01证书挑战Pending排查
针对你遇到的cert-manager HTTP-01挑战Pending且返回404的问题,以下是具体排查点和修复方案:
1. 修复Service的容器端口映射
你的my-api-service配置中注释了targetPort,Kubernetes会默认将Service的port:80转发到容器的80端口,但你的FastAPI服务大概率监听的是8080端口(从注释的targetPort:8080推测)。这会导致正常服务流量都无法到达容器,更不用说验证请求的转发。
修改Service配置,取消targetPort的注释:
apiVersion: v1 kind: Service metadata: name: my-api-service spec: selector: app: my-api ports: - name: http protocol: TCP port: 80 targetPort: 8080 # 取消注释,匹配FastAPI容器监听端口 # type: LoadBalancer # 注释掉,改用ClusterIP type: ClusterIP
2. 调整Service类型为ClusterIP
你同时使用了Ingress和LoadBalancer类型的Service,会导致流量绕过Ingress直接走Service的外部IP,cert-manager创建的临时验证Ingress无法接管验证请求。将Service改为ClusterIP,让所有外部流量通过Ingress Controller转发。
3. 确认Ingress Controller的80端口对外开放
HTTP-01挑战依赖80端口的可达性,需要确保nginx-ingress-controller的Service(通常为LoadBalancer类型)拥有可外部访问的IP,且80端口未被防火墙/安全组拦截。
执行以下命令检查Ingress Controller状态:
kubectl get svc -n ingress-nginx # 假设Ingress Controller部署在ingress-nginx命名空间
确认输出中的EXTERNAL-IP非<none>,且80端口(对应NodePort)能被外部访问。
4. 验证临时挑战Ingress的正确性
cert-manager会为每个验证请求创建临时Ingress,执行以下命令查看:
kubectl get ingress
找到名称以cm-acme-http-solver-开头的Ingress,确认其INGRESS CLASS为nginx,且规则包含/.well-known/acme-challenge/路径。
5. 测试挑战路径的可达性
在集群内部执行curl命令,测试临时solver服务的响应:
kubectl run -it --rm curl-test --image=curlimages/curl -- curl http://cm-acme-http-solver-zmcjf:8089/.well-known/acme-challenge/<你的挑战字符串>
(替换<你的挑战字符串>为kubectl describe challenge输出中的对应值)
如果能返回正确的验证内容,说明solver服务正常,问题出在外部流量到Ingress Controller的转发上。
内容的提问来源于stack exchange,提问作者Aniketos

