Kubernetes中Cert-Manager HTTP-01挑战返回404错误求助
排查Cert-Manager HTTP-01挑战404/308问题的步骤
1. 检查Ingress的HTTPS重定向配置
- 查看Nginx Ingress全局配置,确认是否开启强制HTTPS重定向(
ssl-redirect: true)。如果开启,ACME的HTTP-01请求会被308重定向到HTTPS,但挑战路径在HTTPS下未正确配置就会导致404。 - 给Kuard的Ingress添加注解
nginx.ingress.kubernetes.io/ssl-redirect: "false",临时关闭该Ingress的HTTPS重定向,测试是否解决挑战失败问题。
2. 验证ACME自动生成的挑战Ingress
- 执行
kubectl get ingress,找到名称包含cm-acme-http-solver的Ingress资源:- 确认其
spec.rules中的域名和路径(/.well-known/acme-challenge/<token>)与挑战要求一致; - 检查
spec.rules.http.paths[0].backend.service.name是否指向对应的ACME solver服务。
- 确认其
- 查看该挑战Ingress的注解,排除冲突的Nginx配置(比如路径重写、IP白名单限制等)。
3. 分析Nginx Ingress Controller日志
- 执行
kubectl logs -n <ingress-namespace> <nginx-ingress-controller-pod>,搜索/.well-known/acme-challenge关键词:- 确认请求是否成功到达Ingress Controller;
- 查看返回308/404的具体原因,比如是否匹配到错误的Ingress规则,或后端服务转发失败。
4. 确认Metallb与Ingress的网络关联
- 执行
kubectl get svc -n <ingress-namespace>,检查Nginx Ingress Service的类型为LoadBalancer,且已分配Metallb提供的外部IP; - 验证DNS解析的域名是否指向该外部IP,避免DNS配置错误导致请求流向异常。
5. 检查ACME挑战Pod状态
- 执行
kubectl get pods -n cert-manager,确认名称包含cm-acme-http-solver的Pod处于Running状态; - 执行
kubectl describe pod <solver-pod-name> -n cert-manager,排查是否有启动失败、资源不足或网络策略限制等问题。
6. 测试挑战路径的可达性
- 从集群内部节点,执行
curl http://<nginx-ingress-cluster-ip>/.well-known/acme-challenge/<token> -H "Host: <your-domain>",验证是否返回200及正确令牌; - 从集群外部,直接curl外部IP的挑战路径:
curl http://<external-ip>/.well-known/acme-challenge/<token>,对比DNS访问的结果,定位是DNS、路由还是Ingress配置问题。
7. 检查Helm安装的Nginx Ingress自定义配置
- 执行
helm get values <nginx-ingress-release-name> -n <ingress-namespace>,查看是否存在全局路径重写、自定义注解等可能干扰ACME挑战路径匹配的配置; - 确认是否启用
enable-ssl-passthrough等可能影响HTTP请求处理的选项,这类配置可能导致挑战请求无法正确转发。
内容的提问来源于stack exchange,提问作者Robert Fent
相关产品推荐
相关产品推荐

