GCE 健康检查设置正在恢复为默认设置

GCE 健康检查设置正在恢复为默认设置

我使用 Kubernetes Engine 中的 Ingress 在 GCP 上设置了负载均衡器。

后端服务默认将所有实例注册为不健康。我将健康检查更新为 HTTPS 协议和 /healthz url,因为这是我的健康检查的 url。

我将其放置几分钟,后端服务状态所有实例现在都健康,然后我在日志中看到我的 pod 在 /healthz 上提供 200 个响应。

我导航到该页面,它开始显示 502 错误。我返回控制台中的健康检查页面,健康检查已恢复为 HTTP /。

是什么原因导致健康检查恢复到 HTTP?以下日志显示,10 分钟内健康检查继续请求我设置的 https,然后请求变回 http。

...
[W 180621 20:02:35 iostream:1451] SSL Error on 9 ('10.128.0.14', 48346): [SSL: HTTP_REQUEST] http request (_ssl.c:833)
[W 180621 20:02:35 iostream:1451] SSL Error on 9 ('10.128.0.13', 63030): [SSL: HTTP_REQUEST] http request (_ssl.c:833)
[I 180621 20:02:43 web:2106] 200 GET /healthz (10.128.0.14) 0.75ms
[I 180621 20:02:43 web:2106] 200 GET /healthz (10.128.0.13) 0.80ms
[I 180621 20:02:43 web:2106] 200 GET /healthz (10.128.0.14) 0.74ms
...
[I 180621 20:05:46 web:2106] 200 GET /healthz (10.128.0.13) 1.26ms
[I 180621 20:05:46 web:2106] 200 GET /healthz (10.128.0.14) 0.63ms
[I 180621 20:05:46 web:2106] 200 GET /healthz (10.128.0.15) 0.64ms
[W 180621 20:05:46 iostream:1451] SSL Error on 9 ('10.128.0.14', 49971): [SSL: HTTP_REQUEST] http request (_ssl.c:833)
[W 180621 20:05:46 iostream:1451] SSL Error on 9 ('10.128.0.15', 62893): [SSL: HTTP_REQUEST] http request (_ssl.c:833)
[W 180621 20:05:48 iostream:1451] SSL Error on 9 ('10.128.0.13', 52191): [SSL: HTTP_REQUEST] http request (_ssl.c:833)
[W 180621 20:05:48 iostream:1451] SSL Error on 9 ('10.128.0.13', 60549): [SSL: HTTP_REQUEST] http request (_ssl.c:833)

编辑:我正在为有问题的 pod 添加就绪探测器,入口连接到该 pod。

readinessProbe:
  httpGet:
    port: 8902
    scheme: HTTPS
    path: /healthz
  initialDelaySeconds: 5
  periodSeconds: 10
  successThreshold: 1

答案1

我检查了一下,它应该是预期的行为。

Kubernetes 控制健康检查,并从 Kubernetes 集群内部的数据对其进行配置。Kubernetes 不会看到通过 gcloud 对健康检查所做的任何更改。

因此我猜测检查它并且任何修改都会被恢复是正常的。

使用的解决方案就绪探测反而。


还请看一下

健康检查

当前,所有服务后端必须满足以下任一要求才能通过 GCE 负载均衡器发送给它的 HTTP(S) 健康检查:

  1. 对“/”响应 200。内容无关紧要。

  2. 将任意 URL 作为就绪探测器公开在支持服务的 pod 上。

Ingress 控制器首先查找兼容的就绪探测,如果找到,则将其用作 GCE 负载均衡器的 HTTP(S) 健康检查。如果没有就绪探测,或者就绪探测需要特殊的 HTTP 标头,则 Ingress 控制器会将 GCE 负载均衡器的 HTTP 健康检查指向“/”。

答案2

我遇到过同样的问题。

问题是我的 readinessProbe 设置为仅 HTTPS

readinessProbe:
  httpGet:
    path: "/health?ready=1"
    port: 8080
    scheme: HTTPS

然而 GCE Backends 会自动假定您的服务响应 HTTP,并且默认会在那里扫描健康检查。

您可以详细了解 GKE Ingresses 以及 Heath Checks 如何响应这里

为了解决这个问题,我需要更新我的服务以仅使用 HTTPS 进行响应

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/app-protocols: '{"my-port-name":"HTTPS"}'
spec:
  ports:
  - port: 8080
    targetPort: 8080
    name: my-port-name

这会导致入口创建的后端服务通过 HTTPS 扫描 readinessProbes。

注意:在执行此操作之前,请务必拆除您的 Ingress、LoadBalancer 和 HealthCheck,然后重新创建它,因为它不会响应应用于您的服务的更新。

答案3

看起来您的后端仅支持 HTTPS 协议,但您已Ingress为 HTTP 协议部署了资源。部署后手动更改配置不是解决方案,因为主服务器会还原更改以符合清单。根据本文件您可以通过指定包含 TLS 私钥和证书的密钥来保护 Ingress。目前,Ingress 仅支持单个 TLS 端口 443,并假定 TLS 终止。

相关内容