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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:13:41