【问题标题】:Do Kubernetes liveness probes run in parallel with your application?Kubernetes liveness 探针是否与您的应用程序并行运行?
【发布时间】:2021-02-23 08:58:18
【问题描述】:

我有一个在 Kubernetes 上运行的 pod,我正在为其设计一个活性探针。我的应用程序从队列中读取数据(通过循环不断搜索新消息并在找到时执行其他功能)并且不通过 HTTP 公开,因此我需要一个命令活跃度探测。我正在考虑一个简单的实现是否可行:

livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy

但是,我不确定 cat 是否会成功,即使应用程序在循环中的某个点“卡住” - 文件仍然存在。 这归结为对我无法在文档中找到的活性探针的基本缺乏了解 - 大概它们以某种方式与您的应用程序串联运行,因此如果您的应用程序未运行,则无法执行命令?但我对这一点没有信心。

如果命令可以并行执行,那么我相信我将需要某种时间戳检查,在每个循环中更新一个文件,并且 liveness 探针检查其时间戳。如果第一种方法可行,它会更简单,但任何人都可以确认是否是这种情况?谢谢。

编辑:我的应用代码。我添加了 sleep(60)s 来尝试测试如果文件在一分钟内没有更新,liveness probe 是否会失败,但它们不会是正常应用程序代码的一部分。

INITIALISATION CODE

with open('loaded.txt','w') as f:          # readiness probe = check this file exists
    f.write('loaded')

current_backoff = 0
    max_backoff = 10
    while True:
        if current_backoff < max_backoff:
            current_backoff +=1
        with open('loaded.txt','w') as f:
            f.write('loaded')
            sleep(60)

        messages = input_queue_client.receive_messages(visibility_timeout=100)
        for message in messages:
            with open('loaded.txt','w') as f:
                f.write('loaded')
            sleep(60)
            current_backoff = 0
 
            CODE TO PROCESS MESSAGES

        sleep(current_backoff)

我的活跃度探测尝试:

1.

        livenessProbe:
          exec:
            command:
              - find
              - /var/app/loaded.txt
              - -mmin 
              - '+0.1'
          initialDelaySeconds: 10
          periodSeconds: 10
  1. (如果 find 返回任何内容,则命令返回失败,否则 cat 文件)
        livenessProbe:
          exec:
            command:
              - find
              - /var/app/loaded.txt
              - -mmin 
              - '+0.1'
              - -exec
              - cat
              - '/var/app/loaded.txt{}'
              -  ;
          initialDelaySeconds: 10
          periodSeconds: 10
  1. (如果从 find 返回任何内容,则命令返回失败,否则不返回任何内容)
        livenessProbe:
          exec:
            command:
              - find
              - /var/app/loaded.txt
              - -mmin 
              - '+0.1'
              - -exec
              - if[[{}]]
              - ;
          initialDelaySeconds: 10
          periodSeconds: 10

我也尝试了所有这些用 - 而不是 +。尽管窗口非常短(最终会更长!)和 sleep 命令,但探测从未失败。

【问题讨论】:

    标签: kubernetes health-monitoring livenessprobe


    【解决方案1】:

    kubelet 在每个节点中完成的活跃度探测。是的,它与您的应用程序并行运行。

    在您的情况下,您可以在每次开始循环中的新迭代时触摸/tmp/healthy 文件。并在健康检查中使用find /tmp/health -mmin +0.5 之类的命令。如果文件超过半分钟,此命令不返回任何内容。如果运行状况检查命令没有返回任何内容,则假定检查通过。

    【讨论】:

    • 感谢您的解释,这很有帮助。我尝试使用您建议的解决方案,但我认为无论文件是否在过去 0.5 分钟内被修改,运行状况检查都会通过。如果该命令没有返回任何内容,则假定运行状况检查正在通过。如果命令返回一个文件,它似乎也假设它正在传递。如果文件太旧,如何让它返回错误状态代码?
    • 我用过:` livenessProbe: exec: command: - find - /myfile.txt - -mmin - '-0.5' ` 也试过+0.5!
    • @Lucy 这很奇怪,如果命令返回一些东西,健康检查不应该通过。您是否尝试过只创建一次文件,然后再不碰它?
    • @Lucy 您是否可以展示一些您的应用程序的最小示例,以便我可以尝试在本地重现您的问题?
    • 谢谢,我今天早上通过使用指定的条件退出代码构建了一个单独的 bash 脚本解决了这个问题,然后将其作为 liveness probe 命令运行。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 2019-05-18
    • 2020-12-26
    • 2020-12-13
    • 2021-12-27
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    相关资源
    最近更新 更多