【问题标题】:Kubernetes - how to run job only onceKubernetes - 如何只运行一次作业
【发布时间】:2017-02-15 00:52:02
【问题描述】:

我有一个基于 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 的退出代码。我不想再次运行编译。

有可能吗?怎么样?

【问题讨论】:

    标签: kubernetes jobs kubernetes-jobs


    【解决方案1】:

    如果你想要一个一次性的命令运行器,你可能应该创建一个裸 pod,因为作业会尝试执行命令,直到它成功或满足活动期限。

    只需从您的模板创建 pod:

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

    【讨论】:

    • 但是如何在命令完成时停止/杀死 pod?在作业的情况下,正在运行的 pod 停止。
    • @rishabh.bhardwaj 如果您将restartPolicy 设置为Never,就像我的回答一样,完成吊舱后将停止。
    • 使用 Pod 代替作业的问题是 Pod 也会因为虚假原因失败,例如节点被杀死或其他不受用户控制的问题。
    【解决方案2】:

    遗憾的是,目前无法阻止作业控制器在失败时重新生成新的 pod,但 kubernetes 社区正在研究解决方案,请参阅:

    “退避策略和失败的 pod 限制”https://github.com/kubernetes/community/pull/583

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        相关资源
        最近更新 更多