我如何在 Kubernetes 中 运行 delayed_jobs?

How do I run delayed_jobs in Kubernetes?

我可以从 pods(在 kubernetes 上)和 运行 这个命令之一登录控制台:

RAILS_ENV=production bin/delayed_job start

工作 运行 正确地做到了这一点。但是,当 pods 被删除或重新启动时,作业会停止 运行ning。

我也尝试在初始化文件中添加上面的命令(例如 config/initializers/delayed_jobs_runner.rb),但在启动应用程序时出现递归循环。

我尝试做的另一件事是用这个

创建一个名为 my-jobs.yaml 的新文件
apiVersion: batch/v1
kind: Job
metadata:
  name: job
spec:
  template:
    spec:
      containers:
      - name: job
        image: gcr.io/test-app-123/somename:latest
        command: ["/bin/bash", "-l", "-c"]
        args: ["RAILS_ENV=production bundle exec rake jobs:work"]
      restartPolicy: Never
  backoffLimit: 4

然后我 kubectl apply -f my-jobs.yaml,但工作没有 运行宁。

知道如何在 kubernetes 中正确 运行 delayed_jobs 吗?

编辑:这是我的 Dockerfile:

FROM gcr.io/google_appengine/ruby

# Install 2.5.1 if not already preinstalled by the base image
RUN cd /rbenv/plugins/ruby-build && \
    git pull && \
    rbenv install -s 2.5.1 && \
    rbenv global 2.5.1 && \
    gem install -q --no-rdoc --no-ri bundler 
    # --version 1.11.2

ENV RBENV_VERSION 2.5.1

# Copy the application files.
COPY . /app/

# Install required gems.
RUN bundle install --deployment && rbenv rehash

# Set environment variables.
ENV RACK_ENV=production \
    RAILS_ENV=production \
    RAILS_SERVE_STATIC_FILES=true

# Run asset pipeline.
RUN bundle exec rake assets:precompile


CMD ["setup.sh"]


# Reset entrypoint to override base image.
ENTRYPOINT ["/bin/bash"]




################### setup.sh ############################
cd /app && RAILS_ENV=production bundle exec script/delayed_job -n 2 start
bundle exec foreman start --formation "$FORMATION"
#########################################################

运行 一个 docker 容器中的多个进程是有问题的,因为您无法轻易观察特定进程的生命周期 - 每个容器都需要一个 "main" 进程,当它退出时,容器也退出。

查看 Github (https://github.com/collectiveidea/delayed_job#user-content-running-jobs) 我强烈建议将您的启动命令稍微更改为 运行 它在前台,因为现在当您使用守护进程启动 Kubernetes 作业时 - 作业立即结束,因为 docker 容器生命周期与 "main" 前台进程生命周期直接相关,因此当您 运行 仅后台进程时,您的主进程会立即退出,您的容器也会立即退出。

将命令更改为:

RAILS_ENV=production script/delayed_job run

在前台启动 worker,这样您的 Kubernetes 作业就不会退出。另请注意,Kubernetes 作业不适用于此类不定式任务(作业应该有开始和结束)所以我建议使用 ReplicaSet

现在我正在这样做:

this_pid=$$
(while [[ $(ps -ef | grep delayed_job | grep -v -e grep -e tail | head -c1 | wc -c) -ne 0 ]]; do sleep 10; done; kill -- -$this_pid) &

在启动多个 worker 之后。在此之后,我 tail -f 日志,以便将它们发送到容器的标准输出。我很疯狂,所以我也 运行ning logrotate 来检查日志。无论如何,rails 环境很大,所以容器需要很大,我们需要能够 运行 很多工作,我不想要很多 pods 运行 这样做。这似乎是有效的,如果工作人员由于某种原因死亡,它将停止并重新启动。