k8s 部署 laravel 任务调度

最近工作中需要在 k8s 中部署 laravel 的任务调度,作为笔记记录下来。

使用 CronJob 资源类型实现, CronJobk8s 的一种资源类型,可以在集群中定时执行任务。这样可以保证任务在集群中只被执行一次。

CronJob 参考:kubernetes.io/zh-cn/docs/tasks/job...

cronjob.yml

apiVersion: batch/v1
kind: CronJob
metadata:
  name: laravel-scheduler
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          volumes:
            - name: volume-test
              configMap:
                name: test-env
                items:
                  - key: .env
                    path: .env
                defaultMode: 420 
          containers:
            - name: laravel-scheduler
              image: test:dev
              imagePullPolicy: IfNotPresent
              volumeMounts:
                - name: volume-test
                  readOnly: true
                  mountPath: /var/www/html/test/.env
                  subPath: .env
              command: ["/bin/sh", "-c", "php artisan schedule:run"]
          restartPolicy: OnFailure

参数说明:

  • apiVersion: batch/v1beta1:这表示我们正在使用 Kubernetes API 的 batch/v1beta1 版本。这是 Kubernetes CronJob 资源的 API 版本。

  • kind: CronJob:这表示我们正在创建的资源类型是 CronJob。

  • metadata::这部分包含了 CronJob 的元数据。

    • name: laravel-scheduler:这是我们 CronJob 的名字。
  • spec::这部分包含了 CronJob 的详细配置。

    • schedule: "* * * * *":这是 CronJob 的运行时间表,格式与 Unix cron 相同。这里的配置表示每分钟运行一次。

    • jobTemplate::这部分定义了每次 CronJob 运行时创建的 Job 的模板。

  • spec::这部分定义了 Job 的详细配置。

    • template::这部分定义了 Job 创建的 Pod 的模板。
  • spec::这部分定义了 Pod 的详细配置。

    • volumes::这部分定义了 Pod 使用的卷。这里定义了一个名为 volume-test 的卷,它的内容来自名为 test-env 的 ConfigMap。

      • name: volume-test:卷的名称。

      • configMap::这部分定义了卷的内容来自于一个 ConfigMap。

        • name: test-env:ConfigMap 的名称,它应该在同一个命名空间中。

        • items::这部分定义了从 ConfigMap 中选择哪些数据填充到卷中。

          • key: .env:这是 ConfigMap 中的一个键,它的值将被填充到卷中。

          • path: .env:这是在卷中的文件路径,ConfigMap

          • defaultMode: 420:这是卷中文件的默认权限模式,它是一个八进制数字。420 对应的十进制是 644,表示文件拥有者有读写权限,而属组用户和其他用户只有读权限。

    • containers::这部分定义了 Pod 中运行的容器。

      • name: laravel-scheduler:容器的名字。

      • image: test:dev:容器使用的镜像。

      • imagePullPolicy: IfNotPresent:镜像拉取策略,如果本地没有镜像,则从仓库拉取。

      • volumeMounts::定义了容器中的卷挂载点。

        • name: volume-test:卷的名称,它应该与 volumes 部分定义的卷名称相同。

        • readOnly: true:这是卷的读写模式,如果为 true,表示卷是只读的。

        • mountPath: /var/www/html/test/.env:这是在容器中的挂载路径,卷中的文件将出现在这个路径下。

        • subPath: .env:这是卷中的文件或目录,它将被挂载到 mountPath 指定的路径。这里 .env 文件将被挂载到 /var/www/html/test/.env

      • command: ["/bin/sh", "-c", "php artisan schedule:run"]:容器启动后执行的命令。

    • restartPolicy: OnFailure:Pod 的重启策略。这里的配置表示如果容器退出状态非0(出现错误),则重新启动容器。

配置字典

ConfigMap使用参考:kubernetes.io/zh-cn/docs/concepts/...

test-env 配置

kind: ConfigMap
apiVersion: v1
metadata:
  name: test-env
data:
  .env: |-
    APP_NAME=test
    APP_ENV=local
    APP_KEY=
    APP_DEBUG=ture
    APP_URL=http://localhost

    LOG_CHANNEL=stack
    LOG_DEPRECATIONS_CHANNEL=null
    LOG_LEVEL=debug

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=
    DB_USERNAME=
    DB_PASSWORD=

参数说明均通过 gpt 翻译得到:laughing:

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6
sanders

我有两个问题:

  1. 看楼主没有设置 .spec.concurrencyPolicy 这个默认是允许并发,那么如果遇到长耗时的任务会不会造成 POD 越来越多的情况?如果这样会不会因 .spec.containers.resources.requests 占用资源导致节点池扩缩或资源调度失败?
  2. 在迭代 POD 版本代升级时,是否会强制中断正在执行的任务,导致任务执行不完整?如果出现这种情况,楼主会采用什么方案进行补救?
1个月前 评论
cccyzloong 1个月前
zxinxin (楼主) 1个月前
zxinxin (楼主) 1个月前
sanders (作者) 1个月前
cccyzloong 1个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!