将容器作为CronJob部署到(Google)Kubernetes引擎 - 如何在完成任务后停止Pod

问题描述 投票:1回答:3

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

但是,创建的pod只是保留为Running而不是在完成任务后停止。是否应该在执行所有代码后自动停止pod,或者它们是否需要显式指令才能停止,如果是,那么在创建后终止pod的命令是什么(由Cron作业)?

我正在读到默认情况下应该有某种约30秒的终止宽限期,但在运行了一分钟执行的cronjob约20分钟后,所有的pod仍在运行。不确定是否有办法从代码内部终止pod,否则让cronjob产生大量的pods仍然无法运行会有点傻。我在下面的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
kubernetes google-cloud-platform google-kubernetes-engine
3个回答
1
投票

一个CronJob本质上是一个工作的饼干切割机。也就是说,它知道如何创建作业并在特定时间执行它们。现在,正如所说,在查看垃圾收集和清理CronJob的行为时,我们可以简单地看看Kubernetes文档对这个主题有什么看法in the context of jobs

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


0
投票

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


0
投票

Kubernetes中的一项工作旨在运行pod的单个实例并确保其运行完成。另一个答案指出,CronJobJobs的工厂,它知道如何以及何时根据指定的时间表产生工作。

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

终止宽限期在此处不适用:此计时器适用于Kubernetes请求您的吊舱终止后(例如,如果您将其删除)。它指定在kubelet将立即终止它之前,pod正常关闭的最长时间。如果Kubernetes从未认为您的工作完成,则不会输入pod生命周期的这一阶段。

此外,旧的豆荚在完成一段时间后保持在周围以允许阅读原木等。您可能会看到列出了未主动运行的pod,因此不会消耗工作节点上的计算资源。


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

© www.soinside.com 2019 - 2024. All rights reserved.