【问题标题】:Kubernetes pod still running even if js heap out of memory occur即使发生 js 堆内存不足,Kubernetes pod 仍在运行
【发布时间】:2022-12-01 04:46:50
【问题描述】:
我在使用 kOps 配置的 AWS EC2 中运行 K8s 1.17。我有一个 NodeJS pod,它总是到达JS heap out of memory。我希望 k8s 会自动杀死我的 pod 然后重新启动它或者 liveness probe 会生效。不幸的是,我仍然可以获取返回 HTTP 状态代码 200 的健康检查 API。另外,我的 nodejs pod Status = Running。
有没有一种方法,至少我的 pod 应该在 js 达到其内存限制时自动被杀死并重新启动?以下是来自 Pod 的日志:
【问题讨论】:
标签:
javascript
node.js
docker
kubernetes
amazon-ec2
【解决方案1】:
NodeJS 运行时内存不足不一定会触发容器重启。换句话说,如果内存使用量没有超过容器的 pod 规范中设置的内存资源限制,那么对于 kubernetes 来说没有理由执行 OOMKilled。
但是,当容器自行终止时,kubernetes 将根据重启策略尝试重启它。当然,当 kubernetes 终止容器并重新启动它时,还有其他条件,例如当 liveness 探测失败时。
所以当你的容器没有重启的时候,好像kubernetes还是认为它在正常运行。你说你的健康检查仍然以状态 200 回答。
这看起来像:
- 健康检查用于 liveness 探测,它响应正常
- 容器主进程没有退出,还在运行
因此,当您希望重新启动容器时,请确保
- 主进程退出
- 重启策略设置为始终
- liveness probe 行为正常
- 将内存资源限制设置为您期望应用程序正常行为的较低值
关于 Pod 与容器的注意事项:Pod 是一个抽象结构——没有要杀死的进程或其他东西。一个 pod 由一个或多个容器组成,这些容器都有自己的资源请求和限制,超过时可能会被终止。 Kubernetes 可能会终止一个 pod 的一个容器并重新启动它,而同一 pod 中的其他容器仍在运行。