如何获取在Kubernetes节点上运行的Pods的历史记录?

14
在我们的Kubernetes集群中,我们遇到了节点内存不足且Linux调用OOM killer的零星情况。查看日志,似乎调度到该节点上的Pod正在请求比节点可分配的更多的内存。
问题在于,当触发OOM killer时,它会打印出进程和它们的内存使用情况列表。然而,由于我们所有的Docker容器都是Java服务,所以"进程名称"只显示为"java",无法让我们追踪导致问题的特定Pod。
如何获取在特定节点上运行的哪些Pod以及何时运行的历史记录?

6
一种方法是通过检查 kubectl get events,了解在不同节点上创建/删除各个 Pod 的情况。 - Anirudh Ramanathan
如果节点上的Pod已经消耗了节点的所有内存,那么这不应该触发OOM killer。它应该触发的是(1)Kubernetes将一个或多个Pod迁移到另一个节点(对于您的应用程序,这意味着它会收到一个SIGTERM)以释放内存,然后允许剩余的Pod消耗刚刚释放的内存。 只有当一个Pod尝试消耗超过其配置的“limit”的内存时,才应该调用OOM killer。 - undefined
5个回答

10

现在您可以使用kube-state-metrics kube_pod_container_status_terminated_reason来检测OOM事件。

kube_pod_container_status_terminated_reason{reason="OOMKilled"}

kube_pod_container_status_terminated_reason{container="addon-resizer",endpoint="http-metrics",instance="100.125.128.3:8080",job="kube-state-metrics",namespace="monitoring",pod="kube-state-metrics-569ffcff95-t929d",reason="OOMKilled",service="kube-state-metrics"}

5
我们使用Prometheus来监控OOM事件。
这个表达式应该报告内存使用达到限制的次数:
rate(container_memory_failcnt{pod_name!=""}[5m]) > 0

提供信息:这是比起正式文档来说的下一个最好的选择,代码


1
@camil在下面的回答中使用了更好的度量来源:kube_pod_container_status_terminated_reason - Alec Istomin

3

按创建时间戳排序,显示特定命名空间的事件历史记录:

kubectl get events -n YOURNAMESPACE -o wide --sort-by=.metadata.creationTimestamp

如果您想按creationTimestamp顺序检查所有命名空间的事件历史记录:

kubectl get events --all-namespaces -o wide --sort-by=.metadata.creationTimestamp

0

我猜你的Pods没有设置请求和限制,或者值不理想。

如果你正确地设置了这个,当一个Pod开始使用过多的内存时,该Pod将被杀死,你将能够找出是什么导致了问题。

关于查看节点上的所有Pods,你可以使用kubectl get events或在节点上使用docker ps -a,正如其他答案/评论中所引用的。


-4
一种方法是查看 docker ps -a 的输出,并将容器名称与您的 Pod 容器进行关联。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接