金库库伯内特斯的入口nginx。怀疑缺乏成功的健康检查

金库库伯内特斯的入口nginx。怀疑缺乏成功的健康检查,nginx,kubernetes,Nginx,Kubernetes,我正在使用ingress nginx系统。我正在广泛利用这个项目。詹金斯、领事、普罗米修斯和更多的人使用与结尾所附的完全相同的入口配置工作得很好 我可以通过kubectl的端口转发直接访问我的保险箱。但当我试图通过我的nginx入口访问它时,返回503 kubectl port-forward vault-vault-f9778f86d-srr9n 8200:8200 -n vault curl 127.0.0.1:8200/v1/1 {"errors":["Vault is se

我正在使用ingress nginx系统。我正在广泛利用这个项目。詹金斯、领事、普罗米修斯和更多的人使用与结尾所附的完全相同的入口配置工作得很好

我可以通过kubectl的端口转发直接访问我的保险箱。但当我试图通过我的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>
如果我试图访问我的领事后端,我会看到以下内容

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
vault curl-v 127.0.0.1:8200
*重新生成的URL:127.0.0.1:8200/
*正在尝试127.0.0.1。。。
*连接到127.0.0.1(127.0.0.1)端口8200(#0)
>GET/HTTP/1.1
>主持人:127.0.0.1:8200
>用户代理:curl/7.43.0
>接受:*/*
>
未找到
有没有办法更改nginx尝试运行healthcheck的URL,或者完全禁用healthchecking

从nginx的文档中可以看出,如果后端组中只有一台服务器,则无论返回代码如何,都不应将其标记为不可用

发生什么事了

请注意,如果组中只有一台服务器,则 fail\u timeout和max\u fails参数将被忽略,服务器将被禁用 从未标记为不可用

k获取svc-n保险库
名称类型CLUSTER-IP外部IP端口年龄
vault ClusterIP 10.233.47.151 8200/TCP 1h
apiVersion:extensions/v1beta1
种类:入口
元数据:
注释:
kubernetes.io/ingres.class:nginx internal
名称:金库
名称空间:vault
规格:
规则:
-主持人:vault.me.com
http:
路径:
-后端:
服务名称:保险库
服务端口:8200
路径:/
tls:
-主持人:
-me.com
-vault.me.com
secretName:通配符秘密

通过port forward方法打开保险库将更改kubernetes吊舱级healthchecking的状态,ingress nginx会查询该状态以确定后端是否有效

打开vault后,您可以按预期访问后端

在撰写本文时,vault CLI似乎不遵守http 308重定向。这就给了你一个关于golang的解析器库的错误。我在这上面浪费了几个小时。我希望这些信息对某人有所帮助


我开始认为dnsname-->L4 LB外部k8s-->k8s入口ctroller/L7 nginx LB内部群集-->vault服务器只是一个不受支持的配置(我也尝试过,但与您不同,我无法让它工作)。(我认为这是因为它使入口控制器不必要地成为了一个MITM,我知道的还不够多,但我怀疑TLS隧道将在入口控制器处终止,达到未加密的MITM可读状态,然后在入口控制器和vault服务器之间形成新的TLS隧道,同样我也不太清楚。)考虑到这种担心,尽管我决定在k8s上为vault提供专用L4 LB服务,以确保TLS在vault服务器上只终止一次,因为在我看来这更安全,但我认为这是vault建议不要使用LBs的原因之一。
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
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