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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

博客主页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 2.6部署和托管
在这里插入图片描述
在这里插入图片描述
上述页面显示所有的节点都有比较充裕的内存空间就连内存消耗最多的机器都还剩7G。

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

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

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

分析原因

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

而在rancher 2.5的管理界面中展示的数据为k8s对象申明的所需资源也就是本文中的报错所提示的不够的资源。如下图所示
在这里插入图片描述
如果不知道这个变化就容易遇到类似的问题。

部署deployment、statefulSets等各种k8s对象时在配置文件里添加resources.requests就可以给容器申明所需内存和CPU资源。但全部容器的所需资源之和不能超过集群可用资源的总量。同时在新部署k8s对象时必须有一个worker节点的各项剩余资源都大于当前部署的k8s对象申明的所需资源才能实现部署否则就会报类似上文中的错误。

进行上述检查的命令是kubectl describe node。但该命令返回的信息过于庞杂如果只是想查看集群的CPU和内存资源的申明占用情况可以使用下面的指令进行查看和过滤

kubectl describe node |grep -E '((Name|Roles):\s{6,})|(\s+(memory|cpu)\s+[0-9]+\w{0,2}.+%\))'

下图是对本文中的k8s集群的检查结果。可以明显地看到所有的worker节点的内存Requests都已经达到99%剩余的1%不足1G因而无法部署上文中的deployment。

请添加图片描述

解决故障

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

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

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s