Kubernetes Pod 与容器 OOMKilled

Ale*_*don 2 qos containers out-of-memory kubernetes

如果我正确理解 Kubernetes OOM 杀死 pod 或容器的条件(来自 komodor.com):

如果容器使用的内存超过其内存限制,则会以 OOMKilled 状态终止。同样,如果节点上所有容器或所有 pod 的总体内存使用量超过定义的限制,则一个或多个 pod 可能会被终止。

这意味着,如果 Pod 中的容器超过总内存,它将被杀死(容器),但 Pod 本身不会被杀死。同样,如果一个 Pod 中有多个容器,并且该 Pod 本身超出了其内存限制(即该 Pod 中所有容器的内存限制之和),则该 Pod 将被 OOM 杀死。然而,只有当其中一个容器超过其内存限额时,后一种情况才可能出现。这样的话——容器不是会先被杀死吗?

我试图了解 pod 而不是容器被 OOM 杀死的实际情况。

我还注意到,当 Pod 中有一个容器并且该容器反复超出其内存限额时,Pod 和容器会间歇性地被终止。我观察到这一点 -容器将重新启动,这可以通过观察 Pod 中的日志来观察到,并且每隔一次 - Pod就会被终止并重新启动,从而增加其重新启动计数。

如果它有助于理解行为 - Pod 的 QOS 类别是Burstable

Eng*_*ery 8

Pod 根本不会被 OOM 杀死。OOMKilled 是最终由内核进程(OOM Killer)杀死进程(容器是进程)引起的状态,然后由 kubelet 识别并在容器上设置状态。如果 pod 中的主容器被终止,那么默认情况下 kubelet 将重新启动 pod。Pod 无法终止,因为 Pod 是一种数据结构而不是进程。同样,它本身不能受到内存(或 CPU)的限制,而是受到其组成部分的总和的限制。

您引用的文章使用了不精确的语言,我认为这引起了一些混乱。媒体上有一篇更好、更短的文章更准确地介绍了这一点,这里还有一篇更长、更深入的文章