当我尝试为 awx_web 容器设置活性和就绪性问题时,我不断收到此错误
Liveness probe failed: Get http://POD_IP:8052/: dial tcp POD_IP:8052: connect: connection refused
Run Code Online (Sandbox Code Playgroud)
我的容器 awx_web 部署中的“Liveness & Readiness”部分
ports:
- name: http
containerPort: 8052 # the port of the container awx_web
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 8052
initialDelaySeconds: 5
periodSeconds: 5
readinessProbe:
httpGet:
path: /
port: 8052
initialDelaySeconds: 5
periodSeconds: 5
Run Code Online (Sandbox Code Playgroud)
如果我测试端口 8052 是否从与包含容器 awx_web 的 pod 位于同一命名空间的另一个 pod 中打开,或者如果我使用部署在与容器 awx_web 相同的 pod 中的容器进行测试,我会得到此消息(端口已打开)
/ # nc -vz POD_IP 8052
POD_IP (POD_IP :8052) open
Run Code Online (Sandbox Code Playgroud)
如果我从部署了包含容器 awx_web 的 …
在 Kubernetes 中Kubernetes Health Check Probes
,如果timeoutSeconds
超过会发生什么periodSeconds
?例如:
initialDelaySeconds: 10
periodSeconds: 5
timeoutSeconds: 10
successThreshold: 1
failureThreshold: 3
Run Code Online (Sandbox Code Playgroud)
Pod 什么时候会“失败”?
initialDelaySeconds
+ ( periodSeconds
* failureThreshold
); 或者initialDelaySeconds
+ ( MAX
( periodSeconds
, timeoutSeconds
) * failureThreshold
);当 Pod 成功时,同样的问题也适用。
kubernetes kubernetes-health-check readinessprobe livenessprobe
我有一个 Next.js 应用程序,它有 2 个简单端点readiness
,liveness
具有以下实现:
return res.status(200).send('OK');
Run Code Online (Sandbox Code Playgroud)
我已经根据api 路由文档创建了端点。/stats
另外,我根据此处的文档有一个basePath 。因此,探测端点位于/stats/api/readiness
和/stats/api/liveness
。
当我在本地 Docker 容器中构建并运行应用程序时,探测端点可访问并返回 200 OK。
但是,当我将应用程序部署到 k8s 集群时,探测失败。时间还很充裕initialDelaySeconds
,所以这不是原因。
我通过连接到service
pod port-forward
,当 pod 刚刚启动时,在失败之前,我可以到达端点并返回 200 OK。过了一会儿,它开始像往常一样失败。
我还尝试通过健康的 pod 访问失败的 pod:
k exec -t [healthy pod name] -- curl -l 10.133.2.35:8080/stats/api/readiness
Run Code Online (Sandbox Code Playgroud)
同样的情况 - 一开始,虽然 pod 尚未失败,但我在curl 命令上得到 200 OK。过了一会儿,它开始失败。
我得到的探针错误是:
Readiness probe failed: Get http://10.133.2.35:8080/stats/api/readiness: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
Run Code Online (Sandbox Code Playgroud)
有趣的实验 - …
kubernetes google-kubernetes-engine readinessprobe livenessprobe
我想知道是否有可能对 Pod 中的多个容器或仅对 Pod 中的一个容器应用活性和就绪性探测检查。我确实尝试检查多个容器,但容器 A 的探测检查失败,而容器 B 中的探测检查通过。
kubernetes kubernetes-health-check readinessprobe livenessprobe
我有一个 k8s 集群。我们的服务是基于队列的。我们的 Pod 订阅事件队列、获取事件并执行任务。那么对于这种服务,如何定义k8s的liveness探针和readiness探针呢?
场景:一个 K8S Pod 具有多个容器,并且为每个容器配置活性/就绪探针。现在,如果活性探测在某些容器上成功,但在少数容器上失败,k8s 会做什么。
我有一个部署到 Kubernetes 的应用程序,该应用程序依赖于外部应用程序。有时,这两者之间的连接会进入无效状态,只能通过重新启动我的应用程序来修复。
为了自动重新启动,我配置了一个活动探针来验证连接。
这一直工作得很好,但是,我担心如果外部应用程序出现故障(这样连接错误不仅仅是由于无效的 Pod 状态),我的所有 Pod 将立即重新启动,并且我的应用程序将变成完全不可用。我希望它保持运行,以便不依赖于不良服务的功能可以继续。
我想知道 Pod 中断预算是否会阻止这种情况,因为它限制了由于“自愿”中断而减少的 Pod 数量。然而,K8s 文档没有说明活性探测失败是否是自愿中断。他们是吗?
我有一个运行无限循环的 python 程序,但是,每隔一段时间代码就会冻结。没有出现任何错误或任何其他消息来提醒我出现问题。我想知道 Kubernetes 是否有任何活性探针可以帮助捕获代码何时冻结,以便它可以杀死并重新启动该容器。
我有一个想法,让 python 代码在每次完成循环时生成一个定期日志。这样我就可以让活性探针每 30 秒左右检查一次日志文件,以查看文件是否已更新。如果在指定的时间后文件尚未更新,则假定程序冻结并且容器被终止并重新启动。
我目前正在使用以下 python 代码进行测试:
#Libraries
import logging
import random as r
from time import sleep
#Global Veriables
FREEZE_TIME = 60
'''Starts an infinate loop that has a 10% chance of
freezing...........................................'''
def main():
#Create .log file to hold logged info.
logging.basicConfig(filename="freeze.log", level=logging.INFO)
#Start infinate loop
while True:
freeze = r.randint(1, 10) #10% chance of freezing.
sleep(2)
logging.info('Running infinate loop...')
print("Running infinate loop...")
#Simulate a freeze.
if freeze == 1:
print(f"Simulating freeze …
Run Code Online (Sandbox Code Playgroud) 我已将 Spring Boot 更新为2.5.2
从2.1.8.RELEASE
. 在此之前,活性和就绪性探测都很好。现在,在更新 Spring Boot 后,我更新了我的应用程序属性文件:
management.endpoints.web.exposure.include=*
management.endpoints.jmx.exposure.include=health,info
management.endpoint.metrics.enabled=true
management.endpoint.prometheus.enabled=true
management.metrics.enable.*=true
management.metrics.enable.all=true
management.metrics.export.prometheus.enabled=true
management.metrics.use-global-registry=true
management.endpoint.health.probes.enabled=true
management.health.livenessstate.enabled=true
management.health.readinessstate.enabled=true
management.endpoint.health.show-details=always
Run Code Online (Sandbox Code Playgroud)
我已分别向某些文档添加了最后 4 行。
在本地启动项目并从浏览器检查后:
http://localhost:8090/actuator/health/liveness
给出{"status":"UP"}
但
http://localhost:8090/actuator/health/readiness
给出{"status":"OUT_OF_SERVICE"}
的是 503 状态。
{
"status": "OUT_OF_SERVICE",
"components": {
"diskSpace": {
"status": "UP",
"details": {
"total": 499963174912,
"free": 326313852928,
"threshold": 10485760,
"exists": true
}
},
"livenessState": {
"status": "UP"
},
"ping": {
"status": "UP"
},
"readinessState": {
"status": "OUT_OF_SERVICE"
}
},
"groups": [
"liveness",
"readiness"
] …
Run Code Online (Sandbox Code Playgroud) 我在获取 kubernetes livenessProbe exec 命令来处理环境变量时遇到困难。\n我的目标是让 liveness 探针监视 pod 上的内存使用情况并执行 httpGet 运行状况检查。
\n“如果容器内存使用量超过资源限制的 90% 或 http 响应代码/health
失败,则探测应该失败。”
活性探针配置如下:
\n\nlivenessProbe:\n exec:\n command:\n - sh\n - -c\n - |-\n "used=$(awk '{ print int($1/1.049e+6) }' /sys/fs/cgroup/memory/memory.usage_in_bytes);\n thresh=$(awk '{ print int( $1 / 1.049e+6 * 0.9 ) }' /sys/fs/cgroup/memory/memory.limit_in_bytes);\n health=$(curl -s -o /dev/null --write-out "%{http_code}" http://localhost:8080/health);\n if [[ ${used} -gt ${thresh} || ${health} -ne 200 ]]; then exit 1; fi"\n initialDelaySeconds: 240\n periodSeconds: 60\n failureThreshold: 3\n timeoutSeconds: 10\n\n
Run Code Online (Sandbox Code Playgroud)\n如果我执行到(ubuntu)pod并运行这些命令,它们都可以正常工作并完成工作。 …
kubernetes ×10
livenessprobe ×10
ansible-awx ×1
code-freeze ×1
http ×1
logging ×1
maven ×1
python ×1
spring-boot ×1