Kubernetes pod 内存与 cgroup

Kubernetes pod memory vs cgroup

我 运行在 Kubernetes pod 中使用 apache,我对 apache 进程的随机 OOM 终止感到困扰,我不确定原因。

pod 有 600M 的内存限制,看起来它可以很容易地消耗它,即使 PHP 每个 运行 有 128 MB 的限制。在观察 dmesg -w 时,我经常可以看到:

[4019392.626796] Memory cgroup out of memory: Kill process 4178127 (apache2) score 1137 or sacrifice child
[4019392.636520] Killed process 4178127 (apache2) total-vm:143960kB, anon-rss:22856kB, file-rss:10472kB, shmem-rss:28228kB
  1. 我如何确定此 OOM 终止与机器或 pod 限制有关?
  2. 有几个apache pods,我不知道如何识别这个进程所属的pod。有办法吗?
  3. 如果这些可以在 pods 中访问,那就太好了,这样人们就可以看到实际上属于 pod 的被杀死的线程(最好是在错误输出中)。可能吗?

以相同的顺序回答您的问题:

  1. kubectl get events 在您 运行 一个 pod 所在的命名空间中。您将看到 Kubernetes OOM 事件等。如果什么都没有 - 它将是内核本身。

  2. 有一个project called pid2pod, but it greps only what's still running. The other option will be to route dmesg to stdout (on container OS level) and implement centralized log collection with Kubernetes metadata enrichment。然后每个日志事件都会在元数据中有 pod id。

  3. 不确定您要在这里解决什么问题。通常,一个 pod(我假设是一个容器)是一个进程。一旦它被 OOM 杀死,就没有其他东西可以在 pod 内对此采取行动。控制器 (Deployment) 有责任对此事件做出反应并重新创建 pod。

    如果您只想观察剩余 pods 中的 OOM,您可以像 kubewatch 那样实现 smth。不幸的是,我没有可以让您直接在 pod 内订阅的项目,但这可以用作示例。或者在集中式日志记录的情况下,您可以订阅 pod 内的日志流。