【问题标题】: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 中的其他容器仍在运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-06
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2012-10-27
      • 2013-08-18
      • 1970-01-01
      相关资源
      最近更新 更多