使用Kubernetes Ingress-Nginx访问Vault返回503,疑似健康检查失败
结合你提到的其他服务(Jenkins、Consul、Prometheus等)用相同Ingress配置都能正常运行,唯独Vault出问题,而且端口转发可以直接访问Pod,确实大概率是健康检查相关的问题,咱们一步步来定位:
1. 先确认Vault自身的运行状态(最常见诱因)
Vault的默认健康检查路径是/v1/sys/health,而非你测试用的/v1/1。而且Vault在未初始化或者**密封(sealed)**状态下,这个健康检查接口会返回503状态码,直接被ingress-nginx判定为后端不健康,从而给外部请求返回503。
你可以通过端口转发先验证Vault的状态:
curl -v 127.0.0.1:8200/v1/sys/health
如果返回状态码是503,且响应内容包含"sealed": true或者"initialized": false,那问题就明确了——你需要先完成Vault的初始化与unseal操作,之后健康检查会返回200,ingress-nginx就能正常转发请求了。
2. 检查Ingress的健康检查注解配置
如果Vault已经处于unseal状态,那就要确认Ingress是否配置了正确的健康检查路径。ingress-nginx默认会复用后端Pod的探针配置,但如果你的Ingress模板没有添加对应注解,可能会用错误的路径做健康检查。
确保你的Vault Ingress配置中添加了这两个关键注解:
annotations: nginx.ingress.kubernetes.io/readiness-probe-path: /v1/sys/health nginx.ingress.kubernetes.io/liveness-probe-path: /v1/sys/health
补上注解后重新应用Ingress配置,再测试访问。
3. 验证Service与Endpoints的关联状态
虽然你能通过端口转发访问Pod,但还是要确认Ingress关联的Service是否正确指向了Vault Pod:
- 查看Service的端口与标签选择器是否匹配:
kubectl describe service <你的Vault Service名称> -n vault
确保Port配置为8200,Selector与Vault Pod的标签完全一致(比如app=vault这类标识)。
- 检查Endpoints是否包含Pod的IP:
kubectl get endpoints <你的Vault Service名称> -n vault
如果Endpoints为空,说明Service和Pod没有正确关联,这也会导致ingress-nginx找不到后端,返回503。
4. 查看ingress-nginx控制器的日志
直接查看控制器日志能拿到最直观的错误信息,先找到ingress-nginx控制器的Pod:
kubectl get pods -n ingress-nginx
然后过滤出Vault相关的日志内容:
kubectl logs <ingress-nginx-controller-xxxxxx> -n ingress-nginx | grep -i vault
你可能会看到类似health check failed for upstream vault/vault-service:8200的日志,后面会附带具体的返回码,帮你精准定位问题。
5. 检查Vault Pod的运行日志
最后确认Vault Pod本身有没有异常:
kubectl logs vault-vault-f9778f86d-srr9n -n vault
查看是否有启动失败、端口监听异常之类的错误,确保Vault确实在正常监听8200端口。
内容的提问来源于stack exchange,提问作者Brando__




