故障排查:k8s内存不足(0 nodes are available:Insufficient memory)

Posted 农民工老王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了故障排查:k8s内存不足(0 nodes are available:Insufficient memory)相关的知识,希望对你有一定的参考价值。

博客主页:https://tomcat.blog.csdn.net
博主昵称:农民工老王
主要领域:Java、Linux、K8S
期待大家的关注💖点赞👍收藏⭐留言💬

目录

故障详情

最近,在工作中遇到一个问题:某位同事在我维护的k8s集群中部署deployment时一直遇到如下报错:

0/4 nodes are available: 1 node(s) had taint node-role.kubernetes.io/master: true, that the pod didn't tolerate, 3 Insufficient memory.

如图所示:

看到这个内存不足的报错后,我就在rancher的dashboard里查看了集群资源的利用情况(本文中k8s由rancher部署和托管):


上述页面显示,所有的节点都有比较充裕的内存空间,就连内存消耗最多的机器,都还剩7G。

通过查看yaml中的资源需求,确定了待部署的deployment所需内存仅有1G。

   resources:
     limits:
       cpu: "1"
       memory: 2Gi
     requests:
       cpu: 500m
       memory: 1Gi

这下就郁闷了,明明内存还有很多,为何却报错内存不足?

分析原因

最终我发现rancher dashboard中的内存占用数值 反映的是各个节点的内存实际使用情况,相当于在计算机上用free或者top命令查看到的数据。而本文中的报错是针对resources.requests中申明的所需内存的数值。

部署deployment、statefulSets等各种k8s对象时,在配置文件里添加resources.requests就可以给容器申明所需内存和CPU资源。但全部容器的所需资源之和不能超过集群可用资源的总量。

比如本文中的K8S集群的可用内存为24*3=72G。那么部署的所有对象的resources.requests中的memory之和就不能大于72G。在新部署k8s对象时,就要检查 当前已经部署的对象 总共申明了多少requests资源,已经占用了集群总体可用资源的多大比例,其剩余部分是否大于当前新部署对象声明的所需资源。

进行上述检查的命令是kubectl describe node。下图是对本文中的k8s集群的检查结果。可以明显地看到内存的Requests已经达到99%。剩余的1%不足1G,因而无法部署上文中的deployment。

解决故障

找到了报错原因,那解决这个故障也就很容易了。以下三个方法都可以消除报错,并实现deployment的安装:

  1. 清理已安装的k8s对象,既可以删除一部分,也可以将某些对象的requests的值换成一个更小的数。
  2. 扩容k8s集群。
  3. 修改待安装的deployment的requests的值,减少申明的所需内存。

如需转载,请注明本文的出处:农民工老王的CSDN博客https://blog.csdn.net/monarch91 。

以上是关于故障排查:k8s内存不足(0 nodes are available:Insufficient memory)的主要内容,如果未能解决你的问题,请参考以下文章

JVM故障问题排查心得「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?

k8s医生k8s集群故障排查 – 关于kubelet 的NotReady故障

k8s学习-CKA真题-集群故障排查kubelet

k8s学习-CKA真题-集群故障排查kubelet

解决k8s集群中Redis Cluster故障

一次k8s node节点负载高的问题