Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Kubernetes运行延迟的_作业?_Ruby On Rails_Kubernetes_Delayed Job - Fatal编程技术网

Ruby on rails 如何在Kubernetes运行延迟的_作业?

Ruby on rails 如何在Kubernetes运行延迟的_作业?,ruby-on-rails,kubernetes,delayed-job,Ruby On Rails,Kubernetes,Delayed Job,我可以从一个POD(在kubernetes上)登录控制台并运行以下命令: RAILS_ENV=production bin/delayed_job start 通过这样做,作业可以正确运行。但是,当删除或重新启动POD时,作业将停止运行 我还尝试在初始化器文件(例如config/initializers/delayed_jobs_runner.rb)中添加上述命令,但在启动应用程序时,我得到了一个递归循环 我尝试做的另一件事是用这个函数创建一个名为my jobs.yaml的新文件 apiVer

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

RAILS_ENV=production bin/delayed_job start
通过这样做,作业可以正确运行。但是,当删除或重新启动POD时,作业将停止运行

我还尝试在初始化器文件(例如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
然后我对我的jobs.yaml执行
kubectl apply-f,但是jobs没有运行

知道如何在kubernetes中正确运行延迟的_作业吗

编辑:这是我的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容器中运行多个进程是有问题的,因为您无法轻松观察特定进程的生存期-每个容器都需要一个“主”进程,当它退出时,容器也会退出

在查看Github()时,我强烈建议您更改一点启动命令,以便在前台运行它,因为现在,当您使用守护进程启动Kubernetes作业时 -作业将立即结束,因为docker容器生命周期与“主”前台进程生命周期直接相关,所以当您只运行后台进程时,您的主进程将立即退出,容器也将立即退出

将命令更改为:

RAILS_ENV=production script/delayed_job run
什么让你的Kubernetes工作不会退出前台。还请注意,Kubernetes作业不适用于此类不定式任务(作业应具有开始和结束),因此我建议将其用于

现在我正在执行以下操作:

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

在启动多个工人之后。在这之后,I
tail-f
将日志发送到容器的标准输出。我很疯狂,所以我也运行logrotate来检查日志。无论如何,rails环境是相当大的,所以容器需要相当大,我们需要能够运行许多作业,我不希望有太多的pod运行。这似乎很有效,如果工人因某种原因死亡,它将停止并重新启动。

这更像是一个建议,您是否尝试过对此进行调查。它提供以独占方式运行作业、任务等的方法。您的作业失败或根本不启动?你的日志/事件显示了什么?你能试试吗:Nicola,工作开始得很好。只是每次我在kubernetes上创建/删除/重新创建新的pod时,我都必须手动启动delayed_jobs脚本。我必须登录到pod的一个外壳中,并在控制台中运行“RAILS_ENV=production bin/delayed_job start”。有没有一种方法可以自动完成这项工作?tekuri,我在上面的my-jobs.yaml中尝试过,但不幸的是,这些工作并没有开始。哇,Jakub!它起作用了!我将Dockerfile setup.sh中的“cd/app&&RAILS\u ENV=production bundle exec script/delayed\u job-n2 start”更改为“cd/app&&RAILS\u ENV=production bundle exec script/delayed\u job run”。但是,当我将其更改回上一个命令(没有“run”delayed_jobs命令)时,延迟的_jobs在部署后仍然运行。这是预期的吗?我还在测试,但这看起来很有希望。非常感谢你,Jakub!如果您将它们作为Kubernetes作业运行,请注意它们是不可变的,这意味着您不能在启动后更改它们的命令。你需要杀死特定的工作,删除并再次创建。好东西Jakub。感谢您在这方面的大力帮助。我从你那里学到了很多关于库伯内特斯的东西。非常感谢你!!现在奖励你赏金:)谢谢你的赏金,祝你在集装箱世界历险中好运:)!Rails在很多情况下需要运行多个进程才能提高效率。我正在寻找一种方法来做好这件事。我们让它运行,并且我们正在放置一个tail命令来跟踪日志作为前台。但我们面临的问题是,如果工作人员由于某种原因崩溃,比如云数据库重启或其他原因,它不会终止。我们在RailsWebPod中运行了6台puma服务器,我们对此进行了健康检查。所以我也在为worker容器进行健康检查。诚然,这是一个不完美的解决方案。但比一个工人的工作效率要高得多。