Kubernetes CronJob停止安排工作

问题描述 投票:2回答:1

不知道我做错了什么,但我遇到了CronJobs停止安排新工作的问题。似乎只有在几次失败才能启动新工作之后才会发生这种情况。在我的具体情况下,由于无法拉动容器图像,乔布斯无法启动。

我并没有真正找到任何导致这种情况的设置,但我不是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: {}
kubernetes
1个回答
4
投票

kubernetes工作如何处理失败

根据Jobs - Run to Completion - Handling Pod and Container Failures

整个Pod都可以 也 由于多种原因失败,例如当pod从节点上被踢出(节点被升级,重新启动,删除等),或者如果Pod的容器失败并且.spec.template.spec.restartPolicy = "Never"。当Pod失败时,作业控制器启动一个新的Pod。

您正在使用restartPolicy: Never作为jobTemplate,所以,请参阅Pod backoff failure policy的下一个引用:

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

.spec.backoffLimit没有在你的jobTemplate中定义,因此它使用默认值(6)。

以下,根据Job Termination and Cleanup

默认情况下,除非Pod失败,否则Job将不间断运行,此时Job将按照上述.spec.backoffLimit进行操作。终止作业的另一种方法是设置活动截止日期。通过将作业的.spec.activeDeadlineSeconds字段设置为秒数来完成此操作。

这是你的情况:如果你的容器连续六次无法拉动图像,你的工作将被视为失败。


Cronjobs

根据Cron Job Limitations

cron作业在其计划的每个执行时间创建一个作业对象一次[...]。 Cronjob只负责创建与其计划相匹配的作业,而Job则负责管理它所代表的Pod。

这意味着所有pod / container故障都应由作业控制器处理(即调整jobTemplate)。

“重审”工作:

如果其作业失败,则无需创建Cronjob。您只需要等待下一个计划。

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

kubectl create job --from=cronjob/my-cronjob-name my-manually-job-name

你应该做什么:

如果您的容器无法持续下载图像,您有以下选择:

  • 显式设置和调整backoffLimit到更高的值。
  • 使用restartPolicy: OnFailure作为容器,因此Pod将保留在节点上,只有容器才会重新运行。
  • 考虑使用imagePullPolicy: IfNotPresent。如果您没有重新拍摄图像,则无需为每个作业开始强制重新拉动。
© www.soinside.com 2019 - 2024. All rights reserved.