Kubernetes 中是否有可以在 python 容器冻结时捕捉到的活动探测器?
Is there a liveness probe in Kubernetes that can catch when a python container freezes?
我有一个运行无限循环的 python 程序,但是,代码每隔一段时间就会冻结。没有出现任何错误或任何其他会提醒我出现问题的消息。我想知道 Kubernetes 是否有任何活动探测器可以帮助捕获代码何时冻结,以便它可以杀死并重新启动该容器。
我有一个想法,让 python 代码在每次完成循环时生成一个定期日志。这样我就可以让 liveness 探测器每 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 for {FREEZE_TIME} sec.")
sleep(FREEZE_TIME)
#Start code with main()
if __name__ == "__main__":
main()
如果有人能告诉我如何实现这个日志想法,或者是否有更好的方法来做到这一点,我将不胜感激!我目前在 Docker-Desktop 上使用 Kubernetes for windows 10 如果这有所作为。另外,我对此还很陌生,所以如果你能将你的答案保持在“Kubernetes for dummies”的水平,我将不胜感激。
Kubernetes 中活跃度探测的一种常见方法是访问 HTTP 端点(如果应用程序有)。 Kubernetes 检查响应状态代码是否落入 200-399 范围(成功)或不落入(失败)。 运行 HTTP 服务器不是强制性的,因为您可以 运行 一个命令或一系列命令。在这种情况下,健康状态基于退出代码(0 - 正常,其他任何 - 失败)。
鉴于您的脚本的性质和日志的想法,我将编写另一个 python 脚本来读取该日志的最后一行并解析时间戳。然后,如果当前时间和时间戳之间的差异大于 [insert reasonable amount]
则 exit(1)
,否则 exit(0)
.
如果您准备了健康检查脚本,可以通过以下方式启用:
spec:
containers:
- name: my_app
image: my_image
livenessProbe:
exec:
command: # the command to run
- python3
- check_health.py
initialDelaySeconds: 5 # wait 5 sec after start for the log to appear
periodSeconds: 5 # run every 5 seconds
documentation 有详细的解释和一些很好的例子。
我有一个运行无限循环的 python 程序,但是,代码每隔一段时间就会冻结。没有出现任何错误或任何其他会提醒我出现问题的消息。我想知道 Kubernetes 是否有任何活动探测器可以帮助捕获代码何时冻结,以便它可以杀死并重新启动该容器。
我有一个想法,让 python 代码在每次完成循环时生成一个定期日志。这样我就可以让 liveness 探测器每 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 for {FREEZE_TIME} sec.")
sleep(FREEZE_TIME)
#Start code with main()
if __name__ == "__main__":
main()
如果有人能告诉我如何实现这个日志想法,或者是否有更好的方法来做到这一点,我将不胜感激!我目前在 Docker-Desktop 上使用 Kubernetes for windows 10 如果这有所作为。另外,我对此还很陌生,所以如果你能将你的答案保持在“Kubernetes for dummies”的水平,我将不胜感激。
Kubernetes 中活跃度探测的一种常见方法是访问 HTTP 端点(如果应用程序有)。 Kubernetes 检查响应状态代码是否落入 200-399 范围(成功)或不落入(失败)。 运行 HTTP 服务器不是强制性的,因为您可以 运行 一个命令或一系列命令。在这种情况下,健康状态基于退出代码(0 - 正常,其他任何 - 失败)。
鉴于您的脚本的性质和日志的想法,我将编写另一个 python 脚本来读取该日志的最后一行并解析时间戳。然后,如果当前时间和时间戳之间的差异大于 [insert reasonable amount]
则 exit(1)
,否则 exit(0)
.
如果您准备了健康检查脚本,可以通过以下方式启用:
spec:
containers:
- name: my_app
image: my_image
livenessProbe:
exec:
command: # the command to run
- python3
- check_health.py
initialDelaySeconds: 5 # wait 5 sec after start for the log to appear
periodSeconds: 5 # run every 5 seconds
documentation 有详细的解释和一些很好的例子。