我正在将一些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
Cronjob
最初,我提出了在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——在当前运行的内部Kubernetes集群中,与作业相关的pod也没有正确终止,并且它达到了配额限制。
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服务的部署,一个用于任务调度的部署。(
我只是想知道你们通常是如何以可扩展的方式解决这个问题的
不要运行schedule:run
,而是使用K8s kind:Deployment(而不是Job(并将调度器作为守护进程运行:
php artisan schedule:work
https://laravel.com/docs/9.x/scheduling#running-调度器本地
更多详细信息:
请参阅:https://medium.com/@agungdarmanto/how-to-run-alaravel-application-in-to-kubernetes-6d0111dc98d