我如何在Kubernetes中运行delay_jobs?

时间:2018-08-29 23:21:23

标签: ruby-on-rails kubernetes delayed-job

我可以从其中一个Pod(在kubernetes上)登录控制台并运行以下命令:

RAILS_ENV=production bin/delayed_job start

作业可以正确运行。但是,当吊舱被删除或重新启动时,作业将停止运行。

我也尝试将上述命令添加到初始化文件(例如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中正确运行delay_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"
#########################################################

3 个答案:

答案 0 :(得分:2)

现在我正在这样做:

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) &

启动多名工作人员后。然后,我tail -f记录日志,使它们进入容器的标准输出。我非常疯狂,因此我也运行logrotate来检查日志。不管怎样,rails环境都很大,因此容器需要很大,我们需要能够运行许多工作,而我不希望运行太多的pod。这似乎是有效的,并且如果工人由于某种原因死亡,将停止并重新启动。

答案 1 :(得分:1)

您尚未发布Dockerfile,但通常来说,您在CMD的{​​{1}}指令中运行了多个命令。

首先,将要运行的命令放入bash脚本(称为Dockerfile):

setup.sh

然后在您的Dockerfile中...

RAILS_ENV=production bundle exec rake jobs:work
RAILS_ENV=production rails server    (start your rails server)

这应该在Rails服务器启动之前运行作业。

答案 2 :(得分:1)

在一个docker容器中运行多个进程是有问题的,因为您无法轻松观察特定进程的生命周期-每个容器都需要一个“主”进程,并且当退出时,容器也会退出。

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

将命令更改为:

RAILS_ENV=production script/delayed_job run

什么在前台启动工作人员,以便您的Kubernetes工作不会退出。另请注意,Kubernetes Jobs并非用于此类不定式的任务(job应该有开始和结束),所以我建议为此使用ReplicaSet