我在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部署将重新启动容器,不管它们是如何终止的——成功还是失败。
容器不是一个永无止境的过程。它可以(并且确实)在需要时终止。例如,当您运行cronjobs
或jobs
时回到你的问题。我们不知道你的应用程序在做什么,除了它是一个节点应用程序。它是否正在处理一些事情,然后在完成队列时终止?
尝试通过在本地运行容器重现问题,使用如下命令:
docker run -it path/to/image
(如果您需要挂载卷,那么就挂载卷)
如果容器运行、处理和终止,执行:
echo $?
这将返回上一个命令的错误代码,如果返回0,你已经复制了Kubernetes所看到的。
如果是这种情况,有两种方法可以纠正:
- 更改代码的编写方式,以不断检查新工作,而不是以零退出,然后返回检查新工作。
- 更改设置Kubernetes资源的方式,并使用Job(用于一次性运行)或CronJob(用于计划的重复运行)。这将不需要你以任何方式改变你的代码。