k8s pod 不断崩溃(CrashLoopBackOff),但描述显示代码为 0 的"Completed"?



我在k8s上运行一个基于AWS java KCL库的节点应用程序。

每隔5分钟左右,容器就会崩溃,并伴有"crashloopbackoff";然后重新启动-我不知道为什么。

容器日志没有显示错误,在某个点流简单地以

结束:
Stream closed EOF for sol/etl-sol-onchain-tx-parse-6b7d8f4c94-tf8tc (parse)

pod事件也没有显示有用的信息,看起来像这样:

│     State:          Running                                                                               
│       Started:      Sun, 08 May 2022 10:06:36 -0400                                                       
│     Last State:     Terminated                                                                            
│       Reason:       Completed                                                                             
│       Exit Code:    0                                                                                     
│       Started:      Sun, 08 May 2022 09:58:42 -0400                                                       
│       Finished:     Sun, 08 May 2022 10:03:43 -0400                                                       
│     Ready:          True                                                                                  
│     Restart Count:  6

怎么可能写着"完成"呢?退出码是0?容器是一个永无止境的过程,它永远不应该完成。

CPU/mem请求占用率不超过25-50%。

还有什么可能导致这种情况?容器应该使用4-7线程(不确定是否绿色)-也许这就是问题所在?在M5上运行。large(2个vcpu, 8gb ram)

我认为你说的不准确。

容器是一个永无止境的过程,它永远不应该完成。

在我看来,这不是链接到kubernetes,而是链接到容器中的应用程序。尝试直接在你的主机上执行你的容器(例如在docker中)并检查行为。

错误码0表示应用程序以成功结束——尽管根据应用程序的不同,这可能会产生误导。例如,如果您的代码要求在出现错误时以代码0退出,则会发生以下情况:

Kubernetes部署将重新启动容器,不管它们是如何终止的——成功还是失败。

容器不是一个永无止境的过程。它可以(并且确实)在需要时终止。例如,当您运行cronjobsjobs

时回到你的问题。我们不知道你的应用程序在做什么,除了它是一个节点应用程序。它是否正在处理一些事情,然后在完成队列时终止?

尝试通过在本地运行容器重现问题,使用如下命令:

docker run -it path/to/image

(如果您需要挂载卷,那么就挂载卷)

如果容器运行、处理和终止,执行:

echo $?

这将返回上一个命令的错误代码,如果返回0,你已经复制了Kubernetes所看到的。

如果是这种情况,有两种方法可以纠正:

  1. 更改代码的编写方式,以不断检查新工作,而不是以零退出,然后返回检查新工作。
  2. 更改设置Kubernetes资源的方式,并使用Job(用于一次性运行)或CronJob(用于计划的重复运行)。这将不需要你以任何方式改变你的代码。

最新更新