Kubernetes Cronjob只跑了一半时间

时间:2018-05-08 01:08:01

标签: kubernetes

我希望每15分钟就能触发一次工作,但每30分钟就会触发一次。

更新

我只是通过运行来简化问题:

kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"

如此处的文档中所述:https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/

然而,这份工作仍然拒绝按时运作。

$ kubectl get cronjobs
NAME               SCHEDULE      SUSPEND   ACTIVE    LAST SCHEDULE   AGE
hello              */1 * * * *   False     1         5m              30m
hello2             */1 * * * *   False     1         5m              12m

命令行创建cronjob需要25分钟才能运行,而从yaml创建的cronjob需要7分钟。他们最终都是在同一时间安排的,所以它几乎就像是etcd终于醒来并做了些什么?

原始问题:

当我深入到一个活跃的工作时,我看到Status: Terminated: Completed但是 Age: 25 minutes或大于15的东西。

在日志中,我看到要运行的python脚本已经完成了它的最终打印声明。该脚本基于s3中的输出文件大约需要2分钟才能完成。然后没有新的工作安排在28分钟以上。

我尝试过不同的配置:

Schedule: */15 * * * *Schedule: 0,15,30,45 * * * *

以及

Concurrency Policy: ForbidConcurrency Policy: Replace

这里还有什么可能出错?

修改了识别行的完整配置:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  labels:
    type: f-c
  name: f-c-p
  namespace: extract
spec:
  concurrencyPolicy: Forbid
  failedJobsHistoryLimit: 1
  jobTemplate:
    metadata:
      creationTimestamp: null
    spec:
      template:
        metadata:
          creationTimestamp: null
          labels:
            type: f-c
        spec:
          containers:
          - args:
            - /f_c.sh
            image: identifier.amazonaws.com/extract_transform:latest
            imagePullPolicy: Always
            env:
            - name: ENV
              value: prod
            - name: SLACK_TOKEN
              valueFrom:
                secretKeyRef:
                  key: slack_token
                  name: api-tokens
            - name: AWS_ACCESS_KEY_ID
              valueFrom:
                secretKeyRef:
                  key: aws_access_key_id
                  name: api-tokens
            - name: AWS_SECRET_ACCESS_KEY
              valueFrom:
                secretKeyRef:
                  key: aws_secret_access_key
                  name: api-tokens
            - name: F_ACCESS_TOKEN
              valueFrom:
                secretKeyRef:
                  key: f_access_token
                  name: api-tokens
            name: s-f-c
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Never
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
  schedule: '*/15 * * * *'
  successfulJobsHistoryLimit: 1
  suspend: false
status: {}

2 个答案:

答案 0 :(得分:2)

在测试集群中运行这些作业后,我发现外部环境阻止它们按预期运行。

在原始群集上,有大约20个预定的工作。 Kubernetes的内置调度程序尚不能始终如一地处理此卷。

可以可靠运行的最大作业数(在预期时间的一分钟内)可能取决于主节点的大小。

答案 1 :(得分:0)

这不是设计的吗?

  

cron作业在其计划的每个执行时间创建一个作业对象。我们说“约”,因为在某些情况下可能会创建两个作业,或者不会创建任何作业。我们试图使这些罕见,但不要完全阻止它们。因此,工作应该是幂等的。

参考。 https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#cron-job-limitations