运行 容器内的 Openshift 3 CronJob

Openshift 3 CronJob inside running container

如果我理解正确,您可以将 Openshift 配置为 运行 cronjobs,它将定期 运行 一项工作。每次 cronjob 触发时,作业似乎 运行 一个新容器。

我需要一种方法每分钟 运行 一个命令,但在 运行 宁 container/pod/deployment 内而不是每次都创建一个新容器。 我们使用 Openshift 来部署我们的 php 7 / Laravel 应用程序。该框架使用内置的调度程序。要使其正常工作,您必须每分钟使用 "php artisan run".

触发框架

据我了解,不应更改容器映像 (php+apache) 以包含 cron 服务。但是我应该怎么做呢?

我有一个有点非常规的解决方案。 OpenShift/Kubernetes有"Application Health Checks"的概念。这基本上是平台 运行 每隔一段时间(按照定义)发生的事情,并且可以进行 HTTP 调用、TCP 连接或 在容器内执行操作 。这样做的副作用是容器 中的命令 运行 失败 ,您的 pod 将重新启动。这通常用于检查应用程序是否不再响应并允许平台将其终止并重新启动。

但是,它完全可以被混为一谈来完全满足您的需求,并且不需要使用 CronJobs,目前仅在技术预览版中可用。

您应该能够 运行 以下内容,这将 patch 您当前的 DeploymentConfig 包含一个 livenessProbe 每分钟 运行 php artisan run :

oc patch dc/<deployment-name> -p '{"spec":{"template":{"spec":{"containers":[{"name":"<deployment-name>","livenessProbe":{"exec":{"command":["/bin/bash","-c","php","artisan","run","||","true"]},"initialDelaySeconds":60,"periodSeconds":60,"timeoutSeconds":120}}]}}}}'

Note that you'll need to provide the deployment-name twice in the above command.

这将告诉 OpenShift 在 pod 启动后 运行 /bin/bash -c php artisan run || true 60 秒,继续每 60 秒 运行,如果命令花费的时间超过120 秒到 运行。如果命令超时超过 3 次,pod 将被认为不健康并重新启动(|| true 确保即使命令失败,它也不会杀死 pod)。

我想追加到这个问题上,因为我刚刚将其与 Openshift 的本机 cron 作业功能一起使用。此功能使用您选择的现有图像构建一个新的 pod,运行s 您选择的命令(在本例中为“php artisan schedule:run”),然后关闭 pod。这在 Openshift 的在线文档中有概述。我使用 YAML 以及界面中的“使用 YAML/JSON 导入到项目”选项来创建 pod。如果我需要删除 cron 作业,我在 CLI 中使用“oc delete cronjob/myCron”。

这是 YAML 示例:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: myCron
spec:
  schedule: "*/1 * * * *"  
  jobTemplate:             
    spec:
      template:
        metadata:
          labels:          
            parent: "myCron"
        spec:
          containers:
          - name: myCron
            image: docker-registry.default.svc:5000/adv-dev/myApplication
            command: [php, artisan, "schedule:run"]
            envFrom:
            - configMapRef:
                name: my-config-map
          restartPolicy: OnFailure

注意事项:

  • myCron 是一个任意名称,但使用特定于需要 cron 的应用程序的名称 运行。
  • "*/1 * * * *" 是经典的 crontab 计划格式。在这里,它将作业设置为 运行 每分钟一次。
  • 映像“docker-registry.default.svc:5000/adv-dev/myApplication”是需要 cron 的 pod 的现有映像。请记住,此 cron 作业不会 运行 在现有的 pod 中。相反,openshift 将使用具有完全相同代码库的相同图像和该新 pod 中的命令行 运行 启动一个新 pod。之后 运行s openshift 将拆除 cron 作业 pod,留下带有日志的历史记录以供查看。默认情况下,将保留 3 个最近的 pod 历史记录。
  • envFrom 部分是您为 cron 作业 pod 注入环境变量(DB/SMTP usernames/passwords 等)的地方。它们需要是一个配置映射,以便它们可以被导入并可供代码使用。这意味着您还可以在“永久”pod 中使用相同的配置映射 运行ning 您的应用程序以避免重复。