前言
环境:k8s1.20、3节点 node1、node2、node3
问题
执行ubectl describe node | grep -i taints
命令时发现node2节点存在污点,显示内存不足
Taints: node.kubernetes.io/memory-pressure:NoSchedule
查看节点的详情:
从上面的节点详情可以看出,node2节点可分配的内存时36G,已分配才是55Mi (0%),所以为什么会有内存不足的污点呢?尝试重启kubelet或手动删除污点,结果还是一样,污点会自动加上。
从上面的图中最后的一句Warning信息可以看到,kubelet企图回收内存,但是存在异常了。
查看node2节点内存如下,available内存是25G,free是10G。
查看node1节点内存:
查看node3节点内存:
可以看到,node1和node3的内存,无论是free 还是available,都比node2的小,那么为什么node1和node3没有内存压力污点,而node2有内存污点呢?
解决办法:
1、重启kubelet 、docker,仍然有内存压力污点;
2、排查网络插件flannel,flannel是running状态的,排查节点磁盘,磁盘空间充足。
3、决定清空服务器缓存
echo 3 > /proc/sys/vm/drop_caches
drop_caches的值可以是0-3之间的数字,代表不同的含义:
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存
清空缓存后,内存变成了:
重启kubelet服务,这时没有节点内存压力了,节点正常了。
但是还是不明白为什么上面说的,node1和node3的内存,无论是free 还是available,都比node2的小,那么为什么node1和node3没有内存压力污点,而node2有内存污点呢?
问题仍然存在
第二天发现,k8s集群仍然显示内存压力污点,安装metric-server,执行kubectl top node
发现,有节点内存栏显示100%,但是到对应的节点上free -h
查看内存,内存不管是free 还是available 都还有十几G。
排查系统日志,tail -222f /var/log/messages
,发现存在大量异常报错信息,存在ceph相关的异常进程,停止掉这些进程,重启kubelet之后,内存压力的污点就没有了。