You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Kubernetes Ingress-Nginx访问Vault返回503,疑似健康检查失败

排查Vault通过ingress-nginx返回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__

火山引擎 最新活动