Azure 上的 Kubernetes - 活动性和就绪性探测失败 - 活动探测失败,连接:连接被拒绝



我是Azure部署,kubernetes和HA实现的菜鸟。当我在应用部署过程中实现运行状况探测时,运行状况探测失败,当我尝试通过 URL 访问应用时,我最终会出现 503(内部服务器错误)或 502(网关错误)错误。删除运行状况探测后,我可以使用其 URL 成功访问应用。

我在实现运行状况探测时使用以下 yaml 部署配置,Azure DevOps 管道使用该配置。该应用程序需要不到 5 分钟才能使用,因此我将运行状况探测的initialDelaySeconds设置为300s

apiVersion: apps/v1
kind: Deployment
metadata:
name: myApp
spec:
... 
template:
metadata:
labels:
app: myApp
spec:
...
containers:
- name: myApp
...
ports:
- containerPort: 5000          
...
readinessProbe:
tcpSocket:
port: 5000
initialDelaySeconds: 300
periodSeconds: 5
successThreshold: 1
failureThreshold: 3
livenessProbe:
tcpSocket:
port: 5000
periodSeconds: 30 
initialDelaySeconds: 300
successThreshold: 1
failureThreshold: 3
...

当我执行部署并描述 pod 时,我在输出底部的"事件"下看到以下内容:

Type     Reason     Age                   From                             Message
----     ------     ----                  ----                             -------
Warning  Unhealthy  2m1s (x288 over 86m)  kubelet, aks-vm-id-appears-here  Readiness probe failed: dial tcp 10.123.1.23:5000: connect: connection refused

(这令人困惑,因为它将年龄标记为 2m1s - 但initialDelaySeconds大于此 - 所以我不确定为什么它将其报告为年龄)

就绪情况探测随后失败并出现相同的错误。IP 号与我的容器的 IP 匹配,我在容器描述的Containers下看到了这一点:

Containers:
....
Port:           5000/TCP

活动和就绪探测器的故障会导致 Pod 不断终止并重新启动。

该应用程序具有默认的index.html页面,因此我相信如果运行状况探测能够连接,它应该会收到 200 响应。

由于运行状况探测失败,因此不会将 Pod IP 分配给终结点对象,因此不会针对服务分配。

如果我从部署中注释掉readinessProbelivenessProbe,则当我通过浏览器使用 URL 时,应用程序会成功运行,并且 Pod IP 将成功分配为服务可以与之通信的终结点。端点地址的格式为 10.123.1.23:5000 - 即端口 5000 似乎是 pod 的正确端口。

我不明白为什么健康探测无法连接?在我看来,它应该尝试在看起来像 10.123.1.23:5000 的 IP 上连接是正确的。

端口可能需要比300 秒更长的时间才能打开,但我不知道有什么方法可以检查。如果我在 pod 上输入 bash 会话,则watch不可用(我读到watch ss -lnt可用于检查端口可用性)。

以下答案建议增加initialDelaySeconds但我已经尝试过 - https://stackoverflow.com/a/51932875/1549918

我看到了这个问题 - 但资源利用率(例如 CPU/RAM)不是问题 活动性和就绪性探测连接被拒绝

更新

如果我从 pod 的副本卷曲到 https://10.123.1.23:5000,我会收到类似的错误 (Failed to connect to ...the IP.. port 5000: Connection refused)。为什么会失败?我读到了一些东西,表明从另一个 pod 尝试此连接也可能表明运行状况探测的可访问性。

如果您不确定应用程序是否正确启动,请将其替换为已知良好的映像。 例如 httpd

将端口更改为 80,将映像更改为 HTTPD。

您可能还希望增加运行状况检查的超时,因为它默认为 1 秒以超时秒数=5

此外,如果您的图像是Web应用程序,那么最好使用HTTP探针

你的陈述

该应用程序具有默认的索引.html页面,因此我相信如果运行状况探测能够连接,它应该会收到 200 响应。

是不正确的。

您正在执行 tcpSocket 检查。尝试切换到:

livenessProbe:
failureThreshold: 3
httpGet:
path: /
port: 5000
scheme: HTTP

最新更新