K8S部分业务POD内存持续泄露问题
1.前言
线上K8S集群有极少量的PHP业务,它们的POD内存持续走高直到OOM,相信与特殊代码场景有关,需要展开分析。
我从POD的内存监控原理入手,分析到底内存用到了哪些地方。
2.分析过程
-
第一步:分析pod的内存限制原理
- 容器化依赖Cgroup限制内存资源,Docker采集容器的内存使用量也是基于Cgroup技术
- 实际上,Cgroup标准做法是把每个子系统作为一棵树(Hierarchy),然后在树里面创建子cgroup做 资源限制。
- Centos默认创建了这样的N颗树,每棵树管理1个子系统,K8S就是在这些树中创建子目录来使用Cgroup能力。
-
第二步:分析pod的内存限制是如何实现的(以内存memory为例,我们知道POD可以设置resource limit)
-
首先docker ps找到目标pod的相关容器,至少有2个容器,一个是pause容器,一个是应用容器
-
拿着应用容器的container id,执行docker inspect 可以看到label里有一个pod唯一标识uid
-
K8S创建了kubepods子cgroup,仍旧以memory为例
-
ll /sys/fs/cgroup/memor
-
-