3

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

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

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

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

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

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 命令,但探测永远不会失败。

4

1 回答 1

2

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

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

于 2020-11-11T12:47:47.033 回答