【问题标题】:Is there a liveness probe in Kubernetes that can catch when a python container freezes?Kubernetes 中是否有一个活性探针可以在 python 容器冻结时捕获?
【发布时间】:2021-10-12 03:41:11
【问题描述】:

我有一个运行无限循环的 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 for {FREEZE_TIME} sec.")
            sleep(FREEZE_TIME)


#Start code with main()
if __name__ == "__main__":
    main()

如果有人能告诉我如何实现这个日志想法,或者如果有更好的方法来做到这一点,我将不胜感激!我目前正在 Docker-Desktop 上为 Windows 10 使用 Kubernetes,如果这有所作为的话。另外,我对此还很陌生,所以如果您能将您的答案保持在“Kubernetes for dummy”级别,我将不胜感激。

【问题讨论】:

  • 如果你在 Python 进程中运行 HTTP 服务器,你可以使用kubernetes liveness probe。您可以想象有一个主循环,它每次通过循环时都会增加一个计数器,并且有一个 Web 服务会反复休眠,直到它看到计数器增加。然后,liveness probe 将能够测量主循环是否在进行中。

标签: python kubernetes logging livenessprobe code-freeze


【解决方案1】:

在 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 有详细的解释和一些很好的例子。

【讨论】:

  • 这是很棒的东西。感谢您的答复!我没有想过让活性探针运行另一个脚本来检查代码。我也很感激这个链接,它派上用场了!我将不得不研究这种 http 方法是如何工作的。
  • @boblerbob,乐于助人:)
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 2021-05-24
  • 2019-03-28
相关资源
最近更新 更多