kubernetes cronjob只运行一次?

kubernetes cronjob只运行一次?,kubernetes,Kubernetes,我创建了一个k8s CronJob,每分钟运行以下计划: 附表:**/1*** 我看到我的CronJob被创建: NAMESPACE NAME READY STATUS RESTARTS AGE job-staging job-1593017820-tt2sn 2/3 Running 0 10m 我的工作只是对日志进行一次Printf,然后退出 当我做kubernetes get cronjob时,

我创建了一个k8s CronJob,每分钟运行以下计划:

附表:**/1***

我看到我的CronJob被创建:

NAMESPACE     NAME                   READY   STATUS    RESTARTS   AGE
job-staging   job-1593017820-tt2sn   2/3     Running   0          10m
我的工作只是对日志进行一次Printf,然后退出

当我做kubernetes get cronjob时,我看到:

当我查看日志时,它看起来只运行了一次,这是第一次运行。我需要阻止我的程序退出吗


我以为k8s会重新启动我的程序,但这可能是一个错误的假设。

你关于库伯内特斯重新启动程序的行为的假设是正确的

正如您可能知道的,作业基本上是一个Kubernetes吊舱,它执行某些进程,并在以零退出代码退出时成功完成。CronJob的Cron部分是最明显的,它将作业安排为在特定的时间模式下执行

CronJobs的大多数YAML对象都包含restartPolicy:OnFailure键,该键阻止Kubernetes为非零退出代码重新调度作业。Kubernetes文档中使用此标志

从kubectl指令获取的日志中可以看出,由于状态1,您的作业似乎失败了。我建议您使用kubectl logs-f-n default job-1593017820-tt2sn检查CronJob的日志。如果脚本使用退出代码显式退出,请检查可能的非零代码

[更新]

CronJob也有局限性:

cron作业大约在其计划的每个执行时间创建一个作业对象。我们之所以说“关于”,是因为在某些情况下,可能会创造两个工作岗位,也可能不会创造任何工作岗位。我们试图使这些罕见的,但不能完全防止它们。因此,jobs应该是幂等的


我认为这是非常罕见的情况,但也许你已经发现自己处于这种罕见的情况。文档是。

您对Kubernetes重启程序行为的假设是正确的

正如您可能知道的,作业基本上是一个Kubernetes吊舱,它执行某些进程,并在以零退出代码退出时成功完成。CronJob的Cron部分是最明显的,它将作业安排为在特定的时间模式下执行

CronJobs的大多数YAML对象都包含restartPolicy:OnFailure键,该键阻止Kubernetes为非零退出代码重新调度作业。Kubernetes文档中使用此标志

从kubectl指令获取的日志中可以看出,由于状态1,您的作业似乎失败了。我建议您使用kubectl logs-f-n default job-1593017820-tt2sn检查CronJob的日志。如果脚本使用退出代码显式退出,请检查可能的非零代码

[更新]

CronJob也有局限性:

cron作业大约在其计划的每个执行时间创建一个作业对象。我们之所以说“关于”,是因为在某些情况下,可能会创造两个工作岗位,也可能不会创造任何工作岗位。我们试图使这些罕见的,但不能完全防止它们。因此,jobs应该是幂等的


我认为这是非常罕见的情况,但也许你已经发现自己处于这种罕见的情况。文档是。

如何退出脚本?是否具有非零退出状态?你能给我们看一下你的配置文件吗?脚本是func main{log.Printfjob:start log.Printfjob:done}apiVersion:batch/v1beta1种类:CronJob元数据:名称:{{.Values.CronJob}}命名空间:{.Values.CronJob}-{.Values.ServiceStage}标签:app:{.Values.CronJob}-{.Values.ServiceStage}规范:并发策略:禁止失败的JobShistoryLimit:20成功的JobShistoryLimit:20计划:**/1****作业模板:规范:模板:元数据:名称:调度程序cron规范:脚本如何退出?是否具有非零退出状态?你能给我们看一下你的配置文件吗?脚本是func main{log.Printfjob:start log.Printfjob:done}apiVersion:batch/v1beta1种类:CronJob元数据:名称:{{.Values.CronJob}}命名空间:{.Values.CronJob}-{.Values.ServiceStage}标签:app:{.Values.CronJob}-{.Values.ServiceStage}规范:并发策略:禁止失败的JobShistoryLimit:20成功的JobShistoryLimit:20计划:**/1****作业模板:规范:模板:元数据:名称:调度程序cron规范:我确实有重新启动策略:OnFailure。我的脚本执行起来没有问题。即使添加os.Exit0作为脚本中的最后一行也没有什么区别,作业仍然不会重新启动。我在pod中运行了其他容器。他们可能会保留pod,导致它不会终止,因此不会重新安排下一个作业。如果脚本没有问题,则映像是最新的,可供使用,YAML定义位于点I wo
uld说你可能会达到工作的限制。我将更新我的答案以反映这些限制。既然您已经提到了它,从您的规范中,标志并发性:禁止和您对Pod的怀疑未终止,CronJob控制器不会在最后一个作业尚未完成时重新安排作业。要验证这一点,请将标志更改为允许,提交CronJob并运行kubect get jobs-watch,您可能会看到多个作业每分钟生成一个,状态为Running而不终止。然后,您可以尝试使用kubectl descripe job/{name}从pod或kubernetes中读取日志,以了解更多有关原因的信息。这可以帮助您,从我所看到的情况来看,我从未使用过这种用例,人们通常使用存储在卷中的文件来传达状态更改。当与侧车通信时,我喜欢在容器之间使用ZeroMQ消费者模式。我希望我能帮助你!干杯我确实有重启策略:OnFailure。我的脚本执行起来没有问题。即使添加os.Exit0作为脚本中的最后一行也没有什么区别,作业仍然不会重新启动。我在pod中运行了其他容器。他们可能会保留pod,导致pod无法终止,从而无法重新安排下一个作业。如果脚本没有问题,则映像是最新的,可供使用,YAML的定义是正确的。我想说,您可能已经达到了CronJob的限制。我将更新我的答案以反映这些限制。既然您已经提到了它,那么从您的规范中可以看到标志concurrencyPolicy:禁止以及您对Pod未终止的怀疑,CronJob控制器不会在最后一个尚未完成时重新安排作业。要验证这一点,请将标志更改为允许,提交CronJob并运行kubect get jobs-watch,您可能会看到多个作业每分钟生成一个,状态为Running而不终止。然后,您可以尝试使用kubectl descripe job/{name}从pod或kubernetes中读取日志,以了解更多有关原因的信息。这可以帮助您,从我所看到的情况来看,我从未使用过这种用例,人们通常使用存储在卷中的文件来传达状态更改。当与侧车通信时,我喜欢在容器之间使用ZeroMQ消费者模式。我希望我能帮助你!干杯
NAMESPACE     NAME                   READY   STATUS    RESTARTS   AGE
job-staging   job   */1 * * * *      False   1         19m        19m