Kubernetes CronJob停止计划作业

the*_*her 3 kubernetes

不知道我在做什么错,但是我遇到了一个问题,即CronJobs停止安排新的Jobs。它看起来像这种情况发生了几个故障后,才推出了新的工作。在我的特定情况下,由于无法拉出容器映像,乔布斯无法启动。

我并没有真正找到可以导致这种情况的设置,但是我不是Kubernetes CronJobs的专家。以下配置:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  labels:
    app.kubernetes.io/instance: cron-deal-report
    app.kubernetes.io/managed-by: Tiller
    app.kubernetes.io/name: cron
    helm.sh/chart: cron-0.1.0
  name: cron-deal-report
spec:
  concurrencyPolicy: Forbid
  failedJobsHistoryLimit: 1
  jobTemplate:
    metadata:
      creationTimestamp: null
    spec:
      template:
        spec:
          containers:
          - args:
            - -c
            - npm run script
            command:
            - /bin/sh
            env:
            image: <redacted>
            imagePullPolicy: Always
            name: cron
            resources: {}
            securityContext:
              runAsUser: 1000
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Never
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
  schedule: 0/15 * * * *
  successfulJobsHistoryLimit: 3
  suspend: false
status: {}
Run Code Online (Sandbox Code Playgroud)

Edu*_*llo 7

kubernetes作业如何处理故障

根据工作-完成操作-处理Pod和容器故障

整个吊舱可以失败,因为多种原因,当盒被启动了节点(节点升级,重新启动,删除等),例如,或如果吊舱的容器失败并且 .spec.template.spec.restartPolicy = "Never"。当Pod发生故障时,作业控制器将启动一个新Pod。

您正在使用restartPolicy: Never你的jobTemplate,所以,请参见下一报价波德退避失败策略

在某些情况下,由于配置中的逻辑错误等原因,您需要在重试一定次数后使作业失败。为此,请设置 .spec.backoffLimit为指定重试次数,然后再将作业视为失败。退避限制默认设置为6。如果在作业的下一个状态检查之前未出现新的失败Pod,则会重置退避计数。

.spec.backoffLimit不会在你的定义jobTemplate,所以它使用默认设置(6)。

根据工作终止和清理

默认情况下,除非Pod发生故障,否则作业将不间断运行,此时,该作业将遵循.spec.backoffLimit上述说明。终止工作的另一种方法是设置有效期限。通过将.spec.activeDeadlineSeconds作业字段设置为秒数来执行此操作。

这就是您的情况:如果您的容器连续六次无法提取图像,则您的作业将被视为失败。


Cronjobs

根据Cron工作限制

cron作业在其计划的每个执行时间大约创建一次作业对象。Cronjob仅负责创建与其时间表匹配的Job,而Job又负责管理它所代表的Pod。

这意味着所有吊舱/容器故障应由作业控制器处理(即,调整jobTemplate)。

“重试”作业:

万一其作业失败,则无需重新创建Cronjob。您只需要等待下一个时间表。

如果要在下一个计划之前运行新作业,则可以使用Cronjob模板通过以下方式手动创建作业:

kubectl create job --from=cronjob/my-cronjob-name my-manually-job-name
Run Code Online (Sandbox Code Playgroud)

您应该做什么:

如果您的容器无法持续下载图像,则可以使用以下选项:

  • 显式设置并调整backoffLimit到更高的值。
  • 使用restartPolicy: OnFailure您的容器,所以波德将停留在节点上,只有容器将重新运行。
  • 考虑使用imagePullPolicy: IfNotPresent。如果您不重新标记图像,则无需为每个作业开始强制重新拉动。


Rob*_*man 6

只是为了扩展Eduardo Baitello的回答,我还想再提两个注意事项:

  1. Eduardo 提到了Cronjob 限制,但没有详细说明这个Too many missed start time (> 100)问题。为此,我发现唯一的解决方案是删除 cronjob 并重新创建它。您可以修补 cronjob 以降低其频率,从而欺骗调度程序再次运行它。然后你可以将它重新修补回原来的样子,但这更棘手。本kubectl describe cronjob CRONJOB_NAME应该列出这个作为它的,如果这已影响的事件之一,它通常会影响具有高频率cronjobs。

  2. 如果您有很多Cronjobs/Jobs那么您可能会遇到此错误 ( #77465 ),该错误已在1.14.7. 如果500整个集群中有多个作业,就会发生这种情况。这个更难找到,但您可以查询kube-scheduler日志以获取expected type *batchv1.JobList, got type *internalversion.List.

您可以kube-scheduler使用以下命令打印日志:

kubectl -n kube-system logs -l component=kube-scheduler --tail 100
Run Code Online (Sandbox Code Playgroud)