Kubernetes中是否有一个liveness探测器可以捕捉Python容器冻结的情况?

6yjfywim  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(125)

我有一个运行无限循环的python程序,但是,每隔一段时间代码就会冻结。没有出现错误或任何其他消息来提醒我出了问题。我想知道Kubernetes是否有任何liveness探测器,可以帮助捕捉代码冻结的时间,以便它可以杀死并重新启动该容器。
我有一个想法,让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()

如果有人能告诉我如何实现这个日志的想法,或者如果有更好的方法来做到这一点,我将不胜感激!我目前正在使用Kubernetes的Docker-Desktop的windows 10,如果这有什么不同。此外,我是相当新的,所以如果你能保持你的答案“Kubernetes傻瓜”的水平,我会很感激。

pbpqsu0x

pbpqsu0x1#

在Kubernetes中,活动探测器的常用方法是访问HTTP端点Kubernetes检查响应状态代码是否福尔斯200-399范围内成不成功(=failure)。运行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有详细的解释与一些伟大的例子。

相关问题