如何正确使用concurrencyPolicy进行GKE cron作业?

时间:2019-01-28 07:34:17

标签: kubernetes

我将concurrencyPolicy设置为Allow,这是我的cronjob.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: gke-cron-job
spec:
  schedule: '*/1 * * * *'
  startingDeadlineSeconds: 10
  concurrencyPolicy: Allow
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            run: gke-cron-job
        spec:
          restartPolicy: Never
          containers:
            - name: gke-cron-job-solution-2
              image: docker.io/novaline/gke-cron-job-solution-2:1.3
              env:
                - name: NODE_ENV
                  value: 'production'
                - name: EMAIL_TO
                  value: 'novaline.dulin@gmail.com'
                - name: K8S_POD_NAME
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.name
              ports:
                - containerPort: 8080
                  protocol: TCP

阅读文档后:https://cloud.google.com/kubernetes-engine/docs/how-to/cronjobs

我仍然不知道如何使用concurrencyPolicy

我如何运行cron作业并发?

以下是cron作业的日志:

☁  nodejs-gcp [master] ⚡  kubectl logs -l run=gke-cron-job

> gke-cron-job-solution-2@1.0.2 start /app
> node ./src/index.js

config:  { ENV: 'production',
  EMAIL_TO: 'novaline.dulin@gmail.com',
  K8S_POD_NAME: 'gke-cron-job-1548660540-gmwvc',
  VERSION: '1.0.2' }
[2019-01-28T07:29:10.593Z] Start daily report
send email:  { to: 'novaline.dulin@gmail.com', text: { test: 'test data' } }

> gke-cron-job-solution-2@1.0.2 start /app
> node ./src/index.js

config:  { ENV: 'production',
  EMAIL_TO: 'novaline.dulin@gmail.com',
  K8S_POD_NAME: 'gke-cron-job-1548660600-wbl5g',
  VERSION: '1.0.2' }
[2019-01-28T07:30:11.405Z] Start daily report
send email:  { to: 'novaline.dulin@gmail.com', text: { test: 'test data' } }

> gke-cron-job-solution-2@1.0.2 start /app
> node ./src/index.js

config:  { ENV: 'production',
  EMAIL_TO: 'novaline.dulin@gmail.com',
  K8S_POD_NAME: 'gke-cron-job-1548660660-8mn4r',
  VERSION: '1.0.2' }
[2019-01-28T07:31:11.099Z] Start daily report
send email:  { to: 'novaline.dulin@gmail.com', text: { test: 'test data' } }

如您所见,时间戳表示cron作业不是并发的。

1 个答案:

答案 0 :(得分:1)

这是因为您正在阅读错误的文档。 CronJobs不是GKE特有的功能。有关CronJob API的完整文档,请参考Kubernetes文档:https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/#concurrency-policy(在下面引用)。

并发策略决定在先前的CronJob仍在运行时是否可以启动新容器。如果您有一个CronJob每5分钟运行一次,有时作业需要8分钟,那么您可能会遇到同时运行多个作业的情况。这项政策决定了在这种情况下该怎么做。

  

并发策略

     

.spec.concurrencyPolicy字段也是可选的。它指定如何处理由该cron作业创建的作业的并发执行。规范只能指定以下并发策略之一:

     
      
  • Allow(默认):cron作业允许同时运行的作业
  •   
  • Forbid:Cron作业不允许并发运行。如果是时候开始新的任务并且之前的任务还没有完成,则cron任务会跳过新的任务
  •   
  • Replace:如果是时候开始新的作业了,而以前的作业还没有完成,那么cron作业将用新的作业替换当前正在运行的作业。
  •   
     

请注意,并发策略仅适用于同一cron作业创建的作业。如果有多个cron作业,则始终允许其各自的作业同时运行。