php - 在 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 和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
另外,我觉得为这些一次性作业配置监视和日志记录堆栈有点棘手。
部署
我正在考虑尝试将调度程序部署为另一个使用部署资源在容器中具有 cron 设置的 pod,而不是使用 cronjob。
(Web 服务部署一个,任务调度部署一个。)
我只是想知道你们通常如何以可扩展的方式解决这个问题。
解决方案
推荐阅读
- c# - 检测两个字符串之间的差异
- c# - 如何在 c# 中使用 open cv 检测目标上的弹孔
- google-apps-script - 获取股票名称中带有 ^ 的股票的 API 信息
- css - 博客布局缩小 [css]
- azure - 如何将应用程序发布到 Visual Studio 2017 中在 azure 中创建的多个 webapp
- javascript - 如何在Javascript中映射所有叶节点的值?
- http - 颤动如何处理http服务器端验证错误
- php - 特殊字符问号秀(Laravel 项目)
- javascript - 正则表达式:接受十进制正数,但不以点开头
- matlab - 数组结构数组到二维数组