推送后我想创建一个 kaniko 构建作业,它目前可以工作,但作业完成后会显示:
kaniko-5jbhf 0/1 Completed 0 9m13s
然而,当我运行以下命令时它会无限期暂停:
kubectl wait --timeout=-1s --for=condition=Completed pod/kaniko
我的问题可以归纳为两个部分:1)。 如何等待 pod/job 完成?2)。 作业完成后如何删除它?
我已经尝试过 ttlSecondsAfterFinished 但是在集群中启用功能门控是有问题的并且没有如何操作的示例。
答案1
为了wait
评估资源的状态,您需要正确识别它。对于第二个代码片段,您需要提供pod id而不是作业名称:kubectl wait --timeout=-1s --for=condition=Completed pod/kaniko-5jbhf
。但是,将作业本身调用为 的语法似乎是正确的job/kaniko
。
供进一步参考在wait
。
现在,对于Job
删除,如果你不想使用功能门控,我认为你可以通过编程方式访问 API定位并删除完成的Jobs
或使它们依赖于父对象,父对象会级联删除它们。具体来说,Jobs
只有CronJobs
。缺点是CronJobs
按时间安排的对象,这意味着你需要开始设计基于时间的对象。
考虑到根据设计,Jobs
它们应该在完工后继续存在保存处理数据时发生的相关数据.此外,来自v1.12,它们也被设计为自我删除,这意味着启用这些功能门可能是实现您想要的最直接的方法。
答案2
无限期等待可能是由于使用了错误的条件名称造成的。我也遇到了同样的问题。我最终检查了源代码,得出了以下结论
$ kubectl wait --for=condition=Complete job/my-job
和
$ kubectl wait --for=condition=Failed job/my-job
正确的命名也可以如下找到:
$ kubectl explain job.status.conditions.type
KIND: Job
VERSION: batch/v1
FIELD: type <string>
DESCRIPTION:
Type of job condition, Complete or Failed.
答案3
如果需要等待 aJob
为Completed
或Failed
,可以执行以下操作:
kubectl wait --for=condition=ready pod --selector=job-name=YOUR_JOB_NAME --timeout=-1s
kubectl logs --follow job/YOUR_JOB_NAME
答案4
你不应该等待 Pod,等待适用于作业。我不确定这Completed
是否应该是一个条件 -complete
至少对我来说在本地似乎有效,所以应该是
kubectl wait --timeout=-1s --for=condition=complete job/${job_name}
除此之外,除非您想无限期地等待,否则请检查您是否指定了--timeout=-1s
负一作为超时值。
kubectl wait
将任何负超时参数视为“等待一周”。
来自 Kubernetes文档:
The length of time to wait before giving up.
Zero means check once and don't wait, negative means wait for a week.