当前位置:网站首页>Kubernetes内存泄露怎么玩
Kubernetes内存泄露怎么玩
2022-08-06 00:34:00 【InfoQ】
问题描述
- 当 k8s 集群运行日久以后,有的 node 无法再新建 pod,并且出现如下错误,当重启服务器之后,才可以恢复正常使用。查看 pod 状态的时候会出现以下报错。
applying cgroup … caused: mkdir …no space left on device
- 具体查看是否存在内存泄露
$ cat /sys/fs/cgroup/memory/kubepods/memory.kmem.slabinfo
slabinfo - version: 2.1
# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
解决方案
- 解决方法思路:关闭 runc 和 kubelet 的 kmem,因为升级内核的方案改动较大,此处不采用。
- kmem 导致内存泄露的原因:
2.1 编译 runc
- 配置 go 语言环境
$ wget https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz
$ tar xf go1.12.9.linux-amd64.tar.gz -C /usr/local/
# 写入bashrc
$ vim ~/.bashrc
$ export GOPATH="/data/Documents"
$ export GOROOT="/usr/local/go"
$ export PATH="$GOROOT/bin:$GOPATH/bin:$PATH"
$ export GO111MODULE=off
# 验证
$ source ~/.bashrc
$ go env
- 下载 runc 源码
$ mkdir -p /data/Documents/src/github.com/opencontainers/
$ cd /data/Documents/src/github.com/opencontainers/
$ git clone https://github.com/opencontainers/runc
$ cd runc/
$ git checkout v1.0.0-rc9 # 切到v1.0.0-rc9 tag
- 编译
# 安装编译组件
$ sudo yum install libseccomp-devel
$ make BUILDTAGS='seccomp nokmem'
# 编译完成之后会在当前目录下看到一个runc的可执行文件,等kubelet编译完成之后会将其替换
2.2 编译 kubelet
- 下载 kubernetes 源码
$ mkdir -p /root/k8s/
$ cd /root/k8s/
$ git clone https://github.com/kubernetes/kubernetes
$ cd kubernetes/
$ git checkout v1.15.3
- 制作编译环境的镜像(Dockerfile 如下)
FROM centos:centos7.3.1611
ENV GOROOT /usr/local/go
ENV GOPATH /usr/local/gopath
ENV PATH /usr/local/go/bin:$PATH
RUN yum install rpm-build which where rsync gcc gcc-c++ automake autoconf libtool make -y \
&& curl -L https://studygolang.com/dl/golang/go1.12.9.linux-amd64.tar.gz | tar zxvf - -C /usr/local
- 在制作好的 go 环境镜像中来进行编译 kubelet
$ docker run -it --rm -v /root/k8s/kubernetes:/usr/local/gopath/src/k8s.io/kubernetes build-k8s:centos-7.3-go-1.12.9-k8s-1.15.3 bash
$ cd /usr/local/gopath/src/k8s.io/kubernetes
#编译
$ GO111MODULE=off KUBE_GIT_TREE_STATE=clean KUBE_GIT_VERSION=v1.15.3 make kubelet GOFLAGS="-tags=nokmem"
- 替换原有的 runc 和 kubelet
- 将原有 runc 和 kubelet 备份
$ mv /usr/bin/kubelet /home/kubelet
$ mv /usr/bin/docker-runc /home/docker-runc
- 停止 docker 和 kubelet
$ systemctl stop docker
$ systemctl stop kubelet
- 将编译好的 runc 和 kubelet 进行替换
$ cp kubelet /usr/bin/kubelet
$ cp kubelet /usr/local/bin/kubelet
$ cp runc /usr/bin/docker-runc
- 检查 kmem 是否关闭前需要将此节点的 pod 杀掉重启或者重启服务器,当结果为 0 时成功
$ cat /sys/fs/cgroup/memory/kubepods/burstable/memory.kmem.usage_in_bytes
- 检查是否还存在内存泄露的情况
$ cat /sys/fs/cgroup/memory/kubepods/memory.kmem.slabinfo边栏推荐
- eBay, Amazon, Lazada, Shopee, AliExpress, Meikeduo and other cross-border e-commerce platforms, what conditions do I need to meet to evaluate the self-supporting account?How to optimize listing?
- Viola-Jones Detector (VJ)---Study Notes
- Uniapp H5 public authorization number
- 关于时间格式和获取指定时间的方法
- Vernacular Machine Learning - Convolutional Neural Network CNN
- 物理 NFT 有什么特别之处?
- Solve the problems arising from the mysql statement MAX () function
- 如何对齐微信小程序胶囊按钮?
- 横向联邦学习-梯度安全聚合
- window.postMessage() Cross-domain communication between parent and child pages
猜你喜欢
随机推荐
2022 Shandong Health Expo, China Health Industry Exhibition, Postnatal Health Exhibition, Baby Care Exhibition
【论文阅读】Virtual Adversarial Training: a Regularization Method for SL and SSL
Lateral federal study - gradient security polymerization
横向联邦学习-梯度安全聚合
What is a man-in-the-middle attack?
Child pages to monitor the parent page click event
将多维数组变成一维数组及数组转置
Day6: Multiple-choice questions required for the interview
解决mysql语句MAX()函数中出现的问题
Simple understanding of JWT
Viola-Jones检测器(VJ)---学习笔记
About the time format and the method of getting the specified time
Distributed the second level cache components of actual combat (Redis + Caffeine implementation)
子页面监听父页面点击事件
shell之函数和数组
Qt入门(三)——计算器项目的实现
2022第四届山东国际大健康产业博览会,中国大健康产业展览会
Privacy Computing Overview
Is it safe to choose a mobile phone application for a securities account?
【LeetCode】209. 长度最小的子数组









