Kubernetes Pod OOMKilled 解决方案

Edw*_*ard 12 memory kubernetes

我有一个在 Kubernetes 上运行的服务处理从另一个资源传递的文件。单个文件的大小可以在 10MB 到 1GB 之间变化。

最近我看到 pod 因为 OOMKilled 错误而死了:

State: Running
Started: Sun, 11 Nov 2018 07:28:46 +0000
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Started: Fri, 09 Nov 2018 18:49:46 +0000
Finished: Sun, 11 Nov 2018 07:28:45 +0000
Run Code Online (Sandbox Code Playgroud)

我通过增加 pod 上的资源(内存)限制来缓解这个问题。但是我担心每当出现流量或文件大小激增时,我们都会再次遇到这个 OOMKilled 问题。但是如果我将内存限制设置得太高,我担心它会导致这个 pod 的主机出现问题。

我通读了 Kubernetes 给出的最佳实践:https ://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/#best-practices 。但我不确定通过添加 --eviction-hard 和 --system-reserved=memory 可以解决问题。

有没有人有过类似问题的经验?

任何帮助,将不胜感激。

Ric*_*ico 5

不仅仅是 Kubernetes/Container 运行时问题,这是您应用程序中更多的内存管理,这将取决于运行时语言或 JVM 之类的东西是否正在运行您的应用程序。

您通常希望为应用程序中的内存使用设置一个上限,例如,JVM 中的最大堆空间,然后为垃圾收集和溢出留出一点空间。

另一个例子是 Go 运行时,看起来他们已经讨论了内存管理,但在撰写本文时没有解决方案。对于这些情况,最好ulimit为应用程序的特定进程手动设置虚拟内存。(如果您有泄漏,您将看到其他类型的错误)或使用超时

还有手动 cgroup 管理,但又是 docker 和 Kubernetes 应该做的。

这是一篇很好的文章,其中包含一些有关在容器中管理 JVM 的见解。