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

时间:2018-09-12 18:00:22

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

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

但是,创建的Pod仅保留为“正在运行”,而不是在任务完成后停止。是应该在执行所有代码后自动停止Pod,还是需要明确的指令来停止Pod?如果是这样,那么在创建之后(由Cron Job创建)终止Pod的命令是什么?

我正在阅读,默认情况下应该有某种〜30s的终止宽限期,但是在运行了一次细微执行的cronjob〜20分钟之后,所有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

3 个答案:

答案 0 :(得分:1)

CronJob本质上是工作的小甜饼。也就是说,它知道如何创建作业并在特定时间执行它们。话虽如此,在查看CronJob的垃圾收集和清理行为时,我们只需看一下Kubernetes文档对这个主题in the context of jobs的评价:

  

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

答案 1 :(得分:0)

添加一个process.kill();代码中的一行可在代码完成执行后显式结束进程,从而使Pod在执行后自动停止

答案 2 :(得分:0)

Kubernetes中的

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

因此,与旨在永久运行的服务不同,由容器创建的容器中的容器必须在作业完成后退出。边车模式存在一个显着的问题,该问题通常需要手动处理吊舱生命周期。如果您的主Pod需要其他Pod提供日志记录或数据库访问,则必须安排它们在主Pod完成后退出,否则它们将保持运行状态,并且k8s不会认为作业已完成。在这种情况下,与作业关联的广告连播将永远不会终止。

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

此外,旧豆荚完工后要保留一段时间,以便细读原木等。您可能会看到列出的Pod没有处于活动状态,因此没有消耗工作节点上的计算资源。


如果吊舱未完成,请提供有关吊舱正在运行的代码的更多信息,以便我们协助确定为什么该过程永不退出。