我在 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
- 我如何确定此 OOM 终止与机器或 pod 限制有关?
- 有几个 apache pod,我不知道如何识别该进程所属的 pod。有办法吗?
- 如果这些可以在 pod 内访问,那就太好了,这样人们就可以看到实际上属于 pod 的被杀死的线程(最好是在错误输出中)。是否可以?
以相同的顺序回答您的问题:
-
kubectl get events
在运行 pod 的命名空间中。您将看到 Kubernetes OOM 事件等。如果什么都没有——那就是内核本身。
-
有一个项目名为pid2pod https://github.com/heptiolabs/pid2pod,但它只 grep 仍在运行的内容。另一种选择是将 dmesg 路由到 stdout(在容器操作系统级别)并实施通过 Kubernetes 元数据丰富进行集中式日志收集 https://github.com/helm/charts/blob/d339305a27326a98681e654eb5f4f9bd6882f3aa/stable/fluent-bit/templates/config.yaml#L82。然后每个日志事件都会在元数据中包含 pod id。
-
不确定你想在这里解决什么问题。通常,一个 pod(我假设是一个容器)是一个进程。一旦它被 OOM 杀死,pod 内就没有其他东西可以对此采取行动。这是控制器的(Deployment
) 负责对此事件做出反应并重新创建 pod。
如果你只是想观察剩余 Pod 中的 OOM,你可以实现类似库贝手表 https://github.com/bitnami-labs/kubewatch。不幸的是,我没有一个项目可以让您直接在 Pod 内订阅,但这可以用作示例。或者,如果是集中式日志记录,您可以订阅 Pod 内的日志流。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)