不知道我做错了什么,但我遇到了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: {}
根据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
字段设置为秒数来完成此操作。
这是你的情况:如果你的容器连续六次无法拉动图像,你的工作将被视为失败。
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
。如果您没有重新拍摄图像,则无需为每个作业开始强制重新拉动。