代码之家  ›  专栏  ›  技术社区  ›  jlyh

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

  •  1
  • jlyh  · 技术社区  · 6 年前

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

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

    据我所知,默认情况下有大约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
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Michael Hausenblas    6 年前

    A CronJob 基本上是一个饼干刀的工作。也就是说,它知道如何创造就业机会,并在特定时间执行这些工作。现在,也就是说,当看到一个 in the context of jobs :

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

        2
  •  0
  •   jlyh    6 年前

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

        3
  •  0
  •   Cosmic Ossifrage    6 年前

    A 在Kubernetes中,它的目的是运行pod的单个实例,并确保它运行到完成。另一个答案是 CronJob Job 它知道如何以及何时根据指定的计划生成作业。

    终止宽限期在此不适用:此计时器在Kubernetes请求您的pod终止后适用(例如,如果您删除它)。它规定了在kubelet立即终止pod之前,pod可以正常关闭的最长时间。如果Kubernetes从不认为您的工作是完整的,那么pod生命周期的这个阶段将不会进入。

    此外,完工后,旧的豆荚会被保留一段时间,以便仔细阅读原木等。您可能会看到列出的pod不是活动运行的,因此不会占用工作节点上的计算资源。


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