我使用 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) 健康检查:
对“/”响应 200。内容无关紧要。
将任意 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 终止。