繁体   English   中英

k8s pod 不断崩溃 (CrashLoopBackOff),但描述显示代码为 0 的“已完成”?

[英]k8s pod keeps crashing (CrashLoopBackOff), but describe shows "Completed" with code 0?

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

每隔 5 分钟左右,容器就会因“CrashLoopBackOff”而崩溃并重新启动——我不明白为什么。

容器日志没有显示任何错误,在某些时候 stream 只是以以下内容结尾:

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? 容器是一个永无止境的过程,它永远不应该完成。

最多使用 25-50% 的 CPU/内存请求。

还有什么可能导致这个? 容器应该使用 4-7 个线程(不确定是否为绿色)——也许这就是问题所在? 在 M5 上运行它。 大型(2 个 vCPU,8gb 内存)。

我不认为你说的是准确的:

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

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

错误代码 0 表示应用程序成功终止——尽管这可能会产生误导,具体取决于应用程序。 例如,如果您的代码要求在出现错误时以代码 0 退出,就会发生这种情况。

Kube.netes 部署将重新启动容器,无论它们如何终止——成功或失败。

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

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

尝试通过使用类似以下内容在本地运行容器来重现该问题:

docker run -it path/to/image

(如果您需要安装卷,请这样做)

如果容器运行、处理并终止,请执行以下操作:

echo $?

这将返回最后一个命令的错误代码,如果返回 0,则您已经复制了 Kube.netes 看到的内容。

如果是这种情况,您可以通过以下两种方式纠正此问题:

  1. 更改代码的编写方式以不断检查新工作,这样它就不会以零退出,而是返回检查新工作。
  2. 更改设置 Kube.netes 资源的方式并使用 作业(用于一次性运行)或CronJob (用于计划的重复运行)。 这不需要您以任何方式更改代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM