我正在努力将一些 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
,即使作业仍在运行(超过 1 分钟),pod 本身也可能会终止。为避免此问题,我可以使用默认值 concurrencyPolicy: Allow
但它引入了另一个问题 - 即使我将 failedJobsHistoryLimit
设置为 1 并将 successfulJobsHistoryLimit
设置为1 与作业关联的 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
此外,我觉得为那些一次性作业配置监控和日志堆栈有点棘手。
部署
我不使用 cronjob,而是考虑尝试将调度程序部署为使用部署资源在容器中具有 cron 设置的另一个 pod。
(一次部署用于 Web 服务,一次部署用于任务调度。)
我只是想知道你们通常如何以可扩展的方式解决这个问题。
最佳答案
而不是运行 schedule:run
使用 K8s kind: Deployment(不是 Job)并将调度程序作为守护进程运行:
php artisan schedule:work
https://laravel.com/docs/9.x/scheduling#running-the-scheduler-locally
更多详情:
参见:https://medium.com/@agungdarmanto/how-to-run-a-laravel-application-into-kubernetes-a6d0111dc98d
关于php - 在 Kubernetes 中为 Laravel 运行 'php artisan schedule:run' 的良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66981054/