php - 在 Kubernetes 中为 Laravel 运行 'php artisan schedule:run' 的良好实践

标签 php laravel kubernetes

我正在努力将一些 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/

相关文章:

php - 将 PHP 和 Rails 放在同一服务器上

mysql - Laravel 中按日期分组数据库结果

docker - 远程访问Kubernetes入口

php - 使用 Laravel 4.1 和 mysql 的一个 Fortrabbit 应用程序的多个数据库

php - 从网站让 iPhone/智能手机振动,可能吗?

laravel - Firefox 无法连接到本地服务器子域

laravel - Laravel 4.1 中的类自动加载

elasticsearch - 如何激活和配置 ElasticSearch Kafka Connect 接收器?

kubernetes - 在 GCP 上部署 Weaviate k8s 设置时,无法在 API 组中列出资源 "configmaps"

php - 这种语法在 PHP 中的特殊用途? (三重 'Angle Brackets')