问题描述:
在这里插入图片描述

1.	安装go环境
2.	下载地址: https://golang.google.cn/dl/

在这里插入图片描述

[root@k8s-master home]# rm -rf /usr/local/go && tar -C /usr/local/ -zxvf go1.17.3.linux-amd64.tar.gz

3.	永久配置go 环境

[root@k8s-master home]# vim /etc/profile
export GOPATH="/data/Documents"
export GOROOT="/usr/local/go"
export PATH="$GOROOT/bin:$GOPATH/bin:$PATH"
export GO111MODULE=off 
[root@k8s-master home]# source /etc/profile

4.	查看go版本
[root@k8s-master home]# go version

在这里插入图片描述

5.	编译runc
https://github.com/opencontainers/runc
下载源码包,放入/data/Documents/src/github.com/opencontainers/ 中 

下载源码时,通过git下载
[root@k8s-master home]# yum install git -y

[root@k8s-master]# mkdir -p /data/Documents/src/github.com/opencontainers/
[root@k8s-master]# cd /data/Documents/src/github.com/opencontainers/
[root@k8s-master opencontainers]# git clone https://github.com/opencontainers/runc

在这里插入图片描述

[root@k8s-master opencontainers]# cd runc/

# 切到v1.0.0-rc9 tag
# [root@k8s-master runc]# git checkout v1.0.0-rc9  

6.	安装编译工具

[root@k8s-master runc]# yum -y install gcc gcc-c++ kernel-devel
[root@k8s-master ~]# sudo yum install -y libseccomp-devel


执行编译
[root@k8s-master runc]# make BUILDTAGS='seccomp nokmem'

安装编译组件sudo yum install libseccomp-develmake BUILDTAGS='seccomp nokmem'编译完成之后会在当前目录下看到一个runc的可执行文件,等kubelet编译完成之后会将其替换

在这里插入图片描述

7.	编译 kubelet

#下载 Kubernetes 源码
[root@k8s-master runc]# mkdir -p /root/k8s/
[root@k8s-master runc]# cd /root/k8s/

[root@k8s-master k8s]# git clone https://github.com/kubernetes/kubernetes
[root@k8s-master k8s]# cd kubernetes/

版本还原:根据自己安装的K8S版本,将源码还原到对应的版本:
git checkout v1.20.9
GO111MODULE=on KUBE_GIT_TREE_STATE=clean KUBE_GIT_VERSION=v1.20.9 make kubelet GOFLAGS="-tags=nokmem"
make编译的时候,必须要加上参数 GOFLAGS="-tags=nokmem"。这样编译的kubelet才不会开启kmem属性,也就不会导致内存泄漏。
生成的kubelet二进制文件在生成的_output路径下的bin当中。

产生的所有文件如下:
runc
在这里插入图片描述Kubelet
在这里插入图片描述

8.	替换原有的 runc 和 kubelet

# 将原有 runc 和 kubelet 备份
[root@k8s-master home]# mv /usr/bin/kubelet /home/kubelet
[root@k8s-master home]# mv /usr/bin/runc /home/runc

替换前的文件
在这里插入图片描述
在这里插入图片描述

9.	停止 docker 和 kubelet
[root@k8s-master home]# systemctl stop docker
[root@k8s-master home]# systemctl stop kubelet



10.	将编译好的runc和kubelet进行替换

[root@k8s-master bin]# cp /root/k8s/kubernetes/_output/bin/kubelet /usr/bin/kubelet
[root@k8s-master bin]# cp /root/k8s/kubernetes/_output/bin/kubelet /usr/local/bin/kubelet
[root@k8s-master runc]# cp /data/Documents/src/github.com/opencontainers/runc/runc /usr/bin/runc
  1. 检查kmem是否关闭前需要将此节点的pod杀掉重启或者重启服务器,当结果为0时成功

[root@k8s-master ~]# cat /sys/fs/cgroup/memory/kubepods/burstable/memory.kmem.usage_in_bytes
在这里插入图片描述
[root@k8s-master ~]# cat /sys/fs/cgroup/memory/kubepods/memory.kmem.slabinfo
在这里插入图片描述
12. 经测试需要重启服务器后内存泄漏问题才能解决

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐