K8S资源回收机制

原文:https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/node

一 问题现象
服务器的磁盘空间爆满(90%以上),触发某种机制,致使大量pod处于被驱逐状态(Evicted),大部分镜像被删除,全部服务均不可用。docker

二 问题追踪
发现服务器的存储达到某个状态(假如是超过90%)后会删除自身的一些资源,比较明显的是删除了大量的镜像,所以会出现一些pod的状态是镜像下载失败,包括k8s自身的系统镜像。服务器自己并不存在自动清理根目录,除非是写自动清理的脚本。排查了一圈,并不存在,所以极大几率是k8s本身给删的。我在官方的一篇文档中,找到了这个机制。服务器

三 机制说明
每一个node上的kubelet都负责按期采集资源占用数据,并与预设的 threshold值进行比对,若是超过 threshold值,kubelet就会尝试杀掉一些Pod以回收相关资源,对Node进行保护。kubelet关注的资源指标threshold大约有以下几种:ide

  • memory.available
  • nodefs.available
  • nodefs.inodesFree
  • imagefs.available
  • imagefs.inodesFree

每种threshold又分为eviction-soft和eviction-hard两组值。soft和hard的区别在于前者在到达threshold值时会给pod一段时间优雅退出,然后者则崇尚“暴力”,直接杀掉pod,没有任何优雅退出的机会。这里还要提一下nodefs和imagefs的区别:日志

nodefs: 指node自身的存储,存储daemon的运行日志等,通常指root分区/;
imagefs: 指docker daemon用于存储image和容器可写层(writable layer)的磁盘;
在我遇到的问题中,咱们的imagefs和nodefs分区是同一个分区,即/分区,占用率很高(96%)。列一下其中一些指标的阈值:blog

memory.available<100Mi
nodefs.available<10%
nodefs.inodesFree<5%
imagefs.available<15%
(至于其余的指标阈值为啥没有,由于我没找到。)资源

其中比较重要的动做,就是达到nodefs和imagefs的阈值后的回收机制。文档

K8S资源回收机制

简单来讲,就是nodefs超过阈值了,k8s会自动干掉本机上的pod和pod对应的容器(这里是k8s的驱逐机制,删除本节点pod,在其余节点启动,在不放守护机制的前提下是不顺滑的,存在必定时间的服务中断);若是imagefs超过阈值了,会删除没有使用到的镜像文件。get

那么问题来了:若是nodefs和imagefs是同一个分区,会出现什么问题呢?k8s会首先驱逐本机上的pod到其余节点,而后资源仍然不够,会删除没有被使用到的镜像,直到剩余空间低于设定的阈值,甚至会删除k8s的系统镜像。kubernetes

四 解决办法
1 修改这几个指标的阈值(不推荐)

2 添加监控,在阈值到达以前提早处理

相关文章
相关标签/搜索