在 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

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

最新更新