【问题标题】:How to check health of docker image running sidekiq如何检查运行 sidekiq 的 docker 映像的运行状况
【发布时间】:2018-10-07 18:40:51
【问题描述】:

我在我的集​​群上使用 kubernetes,有几个 rails/node docker 镜像。他们中的大多数人都有 :3000/healtz 健康检查,它只返回状态 200 并在正文中返回 OK。

现在我正在尝试发现如何在运行 sidekiq 的 docker 映像上执行此健康检查的最佳方式。如何验证 Worker 是否正在运行?

【问题讨论】:

标签: ruby-on-rails docker kubernetes sidekiq


【解决方案1】:

如果你的镜像是 unix 的,你可以检查进程是否正在运行

$ ps aux | grep '[s]idekiq'

但这并不能保证一切都在 sidekiq 和 redis 中运行。

在这个sidekiq插件https://github.com/arturictus/sidekiq_alive中描述/开发了一种更好的方法

我在使用 k8s 的 livenessProbe 时遇到问题,并试图在不使用此库的情况下解决但尚未成功。

【讨论】:

  • 当然,只检查进程是否出现在ps 输出中的运行状况检查(活性探测)将是多余的,因为如果进程失败,kubelet 无论如何都会重新启动容器?我假设 sidekiq 在它自己的容器中运行(并且 restartPolicy 没有设置为从不)。 kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/…
  • 我最终在就绪探测中使用了这个 ps 技巧,并将其延迟了 30 秒以确保 sidekiq 在启动期间不会崩溃(例如,由于缺少配置)。
【解决方案2】:

Sidekiq 6.0 附带了一个新的sidekiqmon,您可以使用它来验证一个进程是否正在使用 redis 的当前机器上运行:

REDIS_URL=redis://redis.example.com:6380/5 sidekiqmon | grep $$(hostname)

文档:https://github.com/mperham/sidekiq/wiki/Monitoring#sidekiqmon

【讨论】:

    【解决方案3】:

    您有不同的方法,主要取决于您在 Kubernetes pod 中部署 Sidekiq 的方式。

    这里有一些。

    SIDEKIQMON

    从 Sidekiq v6 开始,我们有 sidekiqmon

    您可以尝试以下方法:

    bundle exec sidekiqmon processes | grep $(hostname)
    

    要使其正常工作,您必须能够 grep 与当前 pod/container 相关的正确运行进程。

    PS AUX(我以前用过)

    这样的事情可能会起作用:

    ps aux | grep '[s]idekiq 6'
    

    请注意末尾的 6(sidekiq 版本),以区别于您可能拥有的其他进程。 无论如何,这里的想法是使用ps aux 检查您的流程并尝试“grep”您需要监控的sidekiq。

    SIDEKIQ_ALIVE

    另一种方法是使用sidekiq_alive 但它需要更多的努力来配置和管理,我从未真正尝试过。这是唯一真正检查完整功能以及 Redis 状态的工具。

    SYSTEMCTL

    如果您使用 systemd 部署 sidekiq,您可以这样做:

    systemctl status sidekiq | grep '[r]unning'"
    

    所以最后我用于 Sidekiq 部署的 YAML 清单如下所示:

              livenessProbe:
                exec:
                  command: ["/bin/bash", "-l", "-c", "bundle exec sidekiqmon processes | grep $(hostname)"]
                initialDelaySeconds: 120
                periodSeconds: 30
                successThreshold: 1
                failureThreshold: 3
                timeoutSeconds: 30
    
    

    请注意,只有 sidekiq_alive 方法会执行完整的端到端测试,同时检查 redis 状态。也许这太多了,你可以有其他的 Redis 监控系统,所以也许在这里,使用 kubernetes LivenessProbes,你不需要检查整个流程,只需检查 sidekiq 进程是否仍然存在或由于内存泄漏而崩溃.这取决于您的需求。

    “为什么需要这种 LivenessProbes?”

    因为如果您通过 systemd 或类似方式启动 Sidekiq,您的主进程(PID 1)将为/usr/bin/python3 /usr/bin/systemctl start sidekiq,而使用 ExecStart 启动的相关进程为sidekiq 6.1.3 your_app_name [0 of 5 busy]。如果你有内存泄漏,最后一个会崩溃而不是 PID 1。 因此,您需要一种用于 Sidekiq 的 livenessProbes。

    相反,如果您不使用 systemd 并且您的 PID 1 是 sidekiq 6.1.3 your_app_name [0 of 5 busy],因为您使用 bundle exec sidekiq 启动它,则您不需要它。

    【讨论】:

      猜你喜欢
      • 2018-04-01
      • 2021-02-24
      • 1970-01-01
      • 2016-07-05
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      相关资源
      最近更新 更多