我如何在 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 运行 这样做。这似乎是有效的,如果工作人员由于某种原因死亡,它将停止并重新启动。
我可以从 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 运行 这样做。这似乎是有效的,如果工作人员由于某种原因死亡,它将停止并重新启动。