Ingress-nginx for kubernetes for vault.怀疑缺乏成功的健康检查



我正在使用ingress-nginx系统 https://github.com/kubernetes/ingress-nginx。我正在广泛使用这个项目。詹金斯、领事、普罗米修斯等人使用与末尾附加的完全相同的入口配置工作得很好。

我能够使用 kubectl 通过端口转发直接访问我的保管库 Pod。但是当我尝试通过我的nginx入口访问它时,我返回了一个503

kubectl port-forward vault-vault-f9778f86d-srr9n 8200:8200 -n vault
curl 127.0.0.1:8200/v1/1
{"errors":["Vault is sealed"]}
➜  vault curl -L vault.me.com/v1/1
<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body bgcolor="white">
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>nginx/1.13.8</center>
</body>
</html>

查看日志,我看到以下内容以响应 vault.me.com 卷曲

10.233.104.128 - [10.233.104.128] - - [19/Apr/2018:20:42:56 +0000] "GET / HTTP/1.1" 308 187 "-" "curl/7.43.0" 77 0.000 [] - - - -
10.233.104.128 - [10.233.104.128] - - [19/Apr/2018:20:42:56 +0000] "GET / HTTP/1.1" 503 213 "-" "curl/7.43.0" 77 0.000 [] - - - -

如果我尝试访问我的领事后端,我会看到以下内容。

10.233.104.128 - [10.233.104.128] - - [19/Apr/2018:20:43:34 +0000] "GET / HTTP/1.1" 308 187 "-" "curl/7.43.0" 78 0.000 [consul-consul-consul-8500] - - - -
10.233.104.128 - [10.233.104.128] - - [19/Apr/2018:20:43:39 +0000] "GET / HTTP/1.1" 308 187 "-" "curl/7.43.0" 78 0.000 [consul-consul-consul-8500] - - - -
10.233.104.128 - [10.233.104.128] - - [19/Apr/2018:20:43:39 +0000] "GET / HTTP/1.1" 301 39 "-" "curl/7.43.0" 78 0.002 [consul-consul-consul-8500] 10.233.114.4:8500 39 0.002 301
10.233.104.128 - [10.233.104.128] - - [19/Apr/2018:20:43:39 +0000] "GET /ui/ HTTP/1.1" 200 30178 "-" "curl/7.43.0" 81 0.001 [consul-consul-consul-8500] 10.233.82.19:8500 30178 0.001 200

我不完全确定发生了什么,也不清楚如何调试它。我花了两个小时阅读此工具的源代码,但我没有看到太多内容。

我在某处读到,任何不是 2xx 或 3xx 的响应都无法通过 nginx 的后端运行状况检查,并将从要路由到的后端池中删除。这将体现为我所看到的503。确实,vault 的/确实返回了非 2xx 或 3xx,所以这是有道理的。

vault curl -v 127.0.0.1:8200
* Rebuilt URL to: 127.0.0.1:8200/
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8200 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8200
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Cache-Control: no-store
< Content-Type: text/plain; charset=utf-8
< X-Content-Type-Options: nosniff
< Date: Thu, 19 Apr 2018 20:46:40 GMT
< Content-Length: 19
<
404 page not found

有没有办法更改nginx尝试进行健康检查的URL,或者完全禁用健康检查

https://docs.nginx.com/nginx/admin-guide/load-balancer/http-health-check/从nginx的文档中,它说如果后端组中有一个服务器,则无论返回代码如何,它都不应该被标记为不可用。

这是怎么回事?

请注意,如果组中只有一个服务器,则 忽略fail_timeout和max_fails参数,服务器 从未标记为不可用。

k get svc -n vault
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
vault-vault   ClusterIP   10.233.47.151   <none>        8200/TCP   1h
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx-internal
name: vault
namespace: vault
spec:
rules:
- host: vault.me.com
http:
paths:
- backend:
serviceName: vault-vault
servicePort: 8200
path: /
tls:
- hosts:
- me.com
- vault.me.com
secretName: wildcard-secret

通过端口转发方法解封保管库将改变 Kubernetes Pod 级别健康检查的状态,这是 ingress-nginx 查询以确定后端是否有效的状态。

保管库解封后,您可以根据需要访问后端。

在撰写本文时,保管库 CLI 似乎不尊重 http 308 重定向。这给了你一个关于 golang 解析器库的非常无用的错误。我为此浪费了几个小时。我希望这些信息对某人有所帮助。

https://github.com/hashicorp/vault/issues/4401

最新更新