不知道我在做什么错,但是我遇到了一个问题,即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)
整个吊舱可以
也失败,因为多种原因,当盒被启动了节点(节点升级,重新启动,删除等),例如,或如果吊舱的容器失败并且.spec.template.spec.restartPolicy = "Never"。当Pod发生故障时,作业控制器将启动一个新Pod。
您正在使用restartPolicy: Never你的jobTemplate,所以,请参见下一报价波德退避失败策略:
在某些情况下,由于配置中的逻辑错误等原因,您需要在重试一定次数后使作业失败。为此,请设置
.spec.backoffLimit为指定重试次数,然后再将作业视为失败。退避限制默认设置为6。如果在作业的下一个状态检查之前未出现新的失败Pod,则会重置退避计数。
该.spec.backoffLimit不会在你的定义jobTemplate,所以它使用默认设置(6)。
根据工作终止和清理:
默认情况下,除非Pod发生故障,否则作业将不间断运行,此时,该作业将遵循
.spec.backoffLimit上述说明。终止工作的另一种方法是设置有效期限。通过将.spec.activeDeadlineSeconds作业字段设置为秒数来执行此操作。
这就是您的情况:如果您的容器连续六次无法提取图像,则您的作业将被视为失败。
根据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。如果您不重新标记图像,则无需为每个作业开始强制重新拉动。只是为了扩展Eduardo Baitello的回答,我还想再提两个注意事项:
Eduardo 提到了Cronjob 限制,但没有详细说明这个Too many missed start time (> 100)问题。为此,我发现唯一的解决方案是删除 cronjob 并重新创建它。您可以修补 cronjob 以降低其频率,从而欺骗调度程序再次运行它。然后你可以将它重新修补回原来的样子,但这更棘手。本kubectl describe cronjob CRONJOB_NAME应该列出这个作为它的,如果这已影响的事件之一,它通常会影响具有高频率cronjobs。
如果您有很多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)
| 归档时间: |
|
| 查看次数: |
1342 次 |
| 最近记录: |