首页 > 解决方案 > 在 Kubernetes 中为 Laravel 运行“php artisan schedule:run”的好习惯

问题描述

我正在努力将一些 Laravel PHP 应用程序集成到一个新的 Kubernetes 架构中,并且仍在努力研究如何php artisan schedule:run以一种好的方式运行。

在 Laravel 官方手册中,建议我们像这样设置 cronjob。

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

参考。https://readouble.com/laravel/5.7/en/scheduling.html

定时任务

最初,我想出了在 Kubernetes 中使用 cronjob 的想法,它现在运行良好,但开始担心当前的架构。

(一个部署用于 Web 服务,一个 cronjob 用于任务调度。)

---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cron
  namespace: my-laravel-app
spec:
  concurrencyPolicy: Replace
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - image: my_laravel_app_image:latest
            name: cron
            command: ["php", "artisan", "schedule:run"]
            imagePullPolicy: Always
            envFrom:
            - configMapRef:
                name: laravel-app-config
            - secretRef:
                name: laravel-app-secret
          restartPolicy: Never

但是,由于我concurrencyPolicy: Replace在这里使用 pod 本身可能会终止,即使作业仍在运行(超过 1 分钟)。为了避免这个问题,我可以使用默认值concurrencyPolicy: Allow,但它引入了另一个问题——即使我设置failedJobsHistoryLimit为 1 和successfulJobsHistoryLimit1,与作业关联的 pod 在当前运行的内部 Kubernetes 集群中也没有正确终止,它达到配额限制.

NAME                        READY   STATUS      RESTARTS   AGE
pod/test-cronjob-a           0/1     Completed   0          4m30s
pod/test-cronjob-b           0/1     Completed   0          3m30s
pod/test-cronjob-c           0/1     Completed   0          2m29s
pod/test-cronjob-d           0/1     Completed   0          88s
pod/test-cronjob-e           0/1     Completed   0          28s

参考。https://github.com/kubernetes/kubernetes/issues/74741#issuecomment-712707783

另外,我觉得为这些一次性作业配置监视和日志记录堆栈有点棘手。

部署

我正在考虑尝试将调度程序部署为另一个使用部署资源在容器中具有 cron 设置的 pod,而不是使用 cronjob。

(Web 服务部署一个,任务调度部署一个。)

我只是想知道你们通常如何以可扩展的方式解决这个问题。

标签: phplaravelkubernetes

解决方案


推荐阅读