Kubernetes - 如何仅运行一次作业

55

我有一个工作定义,基于 Kubernetes 网站上的例子。

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-with-timeout-6
spec:
  activeDeadlineSeconds: 30
  completions: 1
  parallelism: 1
  template:
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["exit", "1"]
      restartPolicy: Never

我希望运行此任务一次,如果失败不重新启动。使用命令"exit 1",Kubernetes会尝试运行新的Pod获取"exit 0"代码,直到达到"activeDeadlineSeconds"超时时间。如何避免这种情况?我想在Kubernetes中运行构建命令以检查编译,如果编译失败,我将获得与0不同的退出代码。我不想再次运行编译。

这是可能的吗?如何做到?


你想要运行它零次还是一次?恰好一次?还是至少一次?它们都有不同的潜在实现。 - deed02392
3个回答

73

现在可以通过设置backoffLimit: 0来实现,这会告诉控制器不进行任何重试。默认为6次。


46

如果你想要一个仅需一次尝试的命令运行器,你可能应该创建一个裸 pod,因为该任务将尝试执行命令直到成功或达到活动截止时间。

只需从你的模板创建 pod 即可:

apiVersion: v1
kind: Pod
metadata:
  name: pi
spec:
  containers:
  - name: pi
    image: perl
    command: ["exit", "1"]
  restartPolicy: Never

但是当命令完成后如何停止/杀死Pod呢?在作业的情况下,正在运行的Pod会停止。 - rishabh.bhardwaj
5
如果您将restartPolicy设置为Never,就像我的答案中一样,在完成Pod后它将停止。 - Nebril
3
使用Pod而非Job的问题在于,Pod也会因为偶发原因(例如节点被杀死或其他用户无法控制的问题)而失败。 - mkm
Pods不是一个安全的建议,因为与Jobs不同,Pod资源不能保证最终成功。 - deed02392

2
很遗憾,目前无法防止作业控制器在失败时重新生成新的Pod。不过kubernetes社区正在研究解决方案,请参见“退避策略和失败Pod限制”:https://github.com/kubernetes/community/pull/583。请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接