我有一个容器,该容器运行一些从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
答案 0 :(得分:1)
CronJob
本质上是工作的小甜饼。也就是说,它知道如何创建作业并在特定时间执行它们。话虽如此,在查看CronJob
的垃圾收集和清理行为时,我们只需看一下Kubernetes文档对这个主题in the context of jobs的评价:
作业完成时,不会再创建其他Pod,但是Pod也不会被删除。将它们保持在周围使您仍然可以查看已完成的容器的日志,以检查是否有错误,警告或其他诊断输出。作业对象在完成后也将保留下来,以便您查看其状态。用户可以在注意到旧作业的状态后删除它们。使用kubectl(例如
kubectl delete jobs/pi
或kubectl delete -f ./job.yaml
)删除作业。
答案 1 :(得分:0)
添加一个process.kill();代码中的一行可在代码完成执行后显式结束进程,从而使Pod在执行后自动停止
答案 2 :(得分:0)
一个 job 旨在运行一个pod的单个实例并确保其运行完成。正如另一个答案所指出的,CronJob
是Job
的工厂,它知道如何以及何时根据指定的时间表生成作业。
因此,与旨在永久运行的服务不同,由容器创建的容器中的容器必须在作业完成后退出。边车模式存在一个显着的问题,该问题通常需要手动处理吊舱生命周期。如果您的主Pod需要其他Pod提供日志记录或数据库访问,则必须安排它们在主Pod完成后退出,否则它们将保持运行状态,并且k8s不会认为作业已完成。在这种情况下,与作业关联的广告连播将永远不会终止。
终止宽限期在此处不适用:此计时器在Kubernetes请求终止Pod之后(例如,如果您将其删除)适用。它指定在kubelet即将终止它之前,可以让Pod正常关闭的最长时间。如果Kubernetes从不认为您的工作完成,则将不会进入Pod生命周期的这一阶段。
此外,旧豆荚完工后要保留一段时间,以便细读原木等。您可能会看到列出的Pod没有处于活动状态,因此没有消耗工作节点上的计算资源。
如果吊舱未完成,请提供有关吊舱正在运行的代码的更多信息,以便我们协助确定为什么该过程永不退出。