【问题标题】:Deploying container as a CronJob to (Google) Kubernetes Engine - How to stop Pod after completing task将容器作为 CronJob 部署到 (Google) Kubernetes Engine - 完成任务后如何停止 Pod
【发布时间】:2018-09-15 23:09:57
【问题描述】:

我有一个容器,它运行从 MySQL 数据库获取的一些数据,并在 console.log() 中简单地显示结果,并希望在 GKE 中将其作为 cron 作业运行。到目前为止,我的容器在我的本地机器上工作,并已成功将其部署到 GKE(据我所知,没有抛出任何错误)。

但是,创建的 pod 只是保持运行状态,而不是在任务完成后停止。 pod 是否应该在执行完所有代码后自动停止,或者它们是否需要明确的指令才能停止?如果需要,在创建后终止 pod 的命令是什么(通过 Cron 作业)?

我读到默认情况下应该有大约 30 秒的某种终止宽限期,但是在运行了大约 20 分钟的分钟执行的 cronjob 之后,所有的 pod 仍在运行。不确定是否有办法从代码内部终止 pod,否则让 cronjob 生成大量 pod 闲置运行会有点愚蠢。下面是我的 cronjob.yaml:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: test
spec:
  schedule: "5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: test
            image: gcr.io/project/test:v1
            # env:
            #   - name: "DELAY"
            #     value: 15
          restartPolicy: OnFailure

【问题讨论】:

  • 即使使用 Jobs 对象,您的工作是否完成? kubernetes.io/docs/concepts/workloads/controllers/…
  • 他们真的应该在完成后退出。你能发布你的工作配置yaml吗?
  • @mstorkson 我已经使用 cronjob.yaml 文件编辑了我的帖子。
  • @Rico 我会尽快尝试您的建议,但出于好奇,是否有任何预期的差异?
  • @jlyh 基本上,如果该选项没有完成这项工作,这意味着您的特定应用程序有问题。您的应用可能没有发出exit 调用

标签: kubernetes google-cloud-platform google-kubernetes-engine


【解决方案1】:

CronJob 本质上是工作的千篇一律。也就是说,它知道如何创建作业并在特定时间执行它们。现在,话虽如此,在查看 CronJob 的垃圾收集和清理行为时,我们可以简单地查看 Kubernetes 文档对 in the context of jobs 这个主题的看法:

当 Job 完成时,不会再创建 Pod,但也不会删除 Pod。保留它们可以让您仍然查看已完成 pod 的日志,以检查错误、警告或其他诊断输出。作业对象在完成后也会保留,以便您查看其状态。用户可以在记录其状态后删除旧作业。使用 kubectl 删除作业(例如 kubectl delete jobs/pi 或 kubectl delete -f ./job.yaml)。

【讨论】:

    【解决方案2】:

    添加一个 process.kill();在代码执行完后显式结束进程的代码行允许 pod 在执行后自动停止

    【讨论】:

      【解决方案3】:

      Kubernetes 中的 job 旨在运行 pod 的单个实例并确保它运行完成。正如另一个答案所指定的,CronJob 是 Jobs 的工厂,它知道如何以及何时根据指定的时间表生成作业。

      因此,与旨在永久运行的服务不同,由 pod 创建的 pod 中的容器必须在作业完成后退出。 Sidecar 模式存在一个显着问题,通常需要手动处理 pod 生命周期;如果您的主 pod 需要额外的 pod 来提供日志记录或数据库访问,您必须安排这些在主 pod 完成后退出,否则它们将继续运行并且 k8s 不会认为作业完成。在这种情况下,与作业关联的 pod 将永远不会终止。

      终止宽限期在此处不适用:此计时器适用于 Kubernetes 请求您的 pod 终止(例如,如果您将其删除)。它指定了在 kubelet 立即终止之前 pod 可以正常关闭的最长时间。如果 Kubernetes 从来没有认为你的工作已经完成,则不会进入 pod 生命周期的这个阶段。

      此外,旧的 pod 在完成后会保留一段时间,以便阅读日志等。您可能会看到列出的 pod 没有主动运行,因此不会消耗工作节点上的计算资源。


      如果您的 pod 未完成,请提供有关它们正在运行的代码的更多信息,以便我们可以帮助确定进程永远不会退出的原因。

      【讨论】:

        猜你喜欢
        • 2020-06-02
        • 1970-01-01
        • 2016-08-31
        • 2020-03-12
        • 2020-02-14
        • 2020-09-23
        • 2020-09-29
        • 1970-01-01
        • 2017-08-24
        相关资源
        最近更新 更多