一、什么情况下磁盘可能会爆满 ?

kubelet 有 gc 和驱逐机制,通过 --image-gc-high-threshold--image-gc-low- threshold--eviction-hard--eviction-soft--eviction-minimum-reclaim 等参数控制 kubelet 的 gc 和驱逐策略来释放磁盘空间,如果配置正确的情况下,磁盘一般不会爆满。

通常导致爆满的原因可能是配置不正确或者节点上有其它非 K8S 管理的进程在不断写数据到磁盘占用 大量空间导致磁盘爆满。

二、磁盘爆满会有什么影响 ?

影响 K8S 运行我们主要关注 kubelet 和容器运行时这两个最关键的组件,它们所使用的目录通常不 一样,kubelet 一般不会单独挂盘,直接使用系统磁盘,因为通常占用空间不会很大,容器运行时单 独挂盘的场景比较多,当磁盘爆满的时候我们也要看 kubelet 和 容器运行时使用的目录是否在这个 磁盘,通过 df 命令可以查看磁盘挂载点。


  • 容器运行时使用的目录所在磁盘爆满

如果容器运行时使用的目录所在磁盘空间爆满,可能会造成容器运行时无响应,比如 docker,执行 docker 相关的命令一直 hang 住,kubelet 日志也可以看到 PLEG unhealthy,因为 CRI 调 用 timeout,当然也就无法创建或销毁容器,通常表现是 Pod 一直 ContainerCreating 或 一 直 Terminating。

docker 默认使用的目录主要有:

  • /var/run/docker:用于存储容器运行状态,通过 dockerd 的**–exec-root** 参数指定
  • /var/lib/docker:用于持久化容器相关的数据,比如容器镜像、容器可写层数据、容器标准 日志输出、通过 docker 创建的 volume 等

Pod 启动可能报类似下面的事件:

Warning FailedCreatePodSandBox 53m kubelet, 172.22.0.44 Failed create pod sandbox: rpc error: code = DeadlineExceeded desc = context deadline exceeded
Warning FailedCreatePodSandBox 2m (x4307 over 16h) kubelet, 10.179.80.31 (combined similar events): Failed create pod sandbox: rpc error: code = Unknown desc = failed to create a sandbox for pod "apigateway-6dc48bf8b6-l8xrw": Error response from daemon: mkdir /var/lib/docker/aufs/mnt/1f09d6c1c9f24e8daaea5bf33a4230de7dbc758e3b22785e8ee21e3e3d921214 no space left on device
Warning Failed 5m1s (x3397 over 17h) kubelet, ip-10-0-151-35.us-west-2.compute similar events): Error: container create failed: container_linux.go:336: starting container process caused "process_linux.go:399: container init caused \"rootfs_linux.go:58: mounting \\\"/sys\\\" to rootfs \\\"/var/lib/dockerd/storage/overlay/051e985771cc69f3f699895a1dada9ef6483e912b46a99e004af7bb4852183eb/merged\\\" at \\\"/var/lib/dockerd/storage/overlay/051e985771cc69f3f699895a1dada9ef6483e912b46a99e004af7bb4852183eb/merged/sys\\\" caused \\\"no space left on device\\\"\""

Pod 删除可能报类似下面的事件:

Normal Killing 39s (x735 over 15h) kubelet, 10.179.80.31 Killing container with id docker://apigateway:Need to kill Pod

  • kubelet 使用的目录所在磁盘爆满

如果 kubelet 使用的目录所在磁盘空间爆满(通常是系统盘),新建 Pod 时连 Sandbox 都无法创 建成功,因为 mkdir 将会失败,通常会有类似这样的 Pod 事件:

Warning UnexpectedAdmissionError 44m kubelet, 172.22.0.44 Update plugin resources failed due to failed to write checkpoint file "kubelet_internal_checkpoint": write /var/lib/kubelet/device- plugins/.728425055: no space left on device, which is unexpected.

kubelet 默认使用的目录是 /var/lib/kubelet,用于存储插件信息、Pod 相关的状态以及挂 载的 volume (比如 emptyDirConfigMapSecret),通过 kubelet 的**–root- dir** 参数指定。


  • 如何恢复

如果容器运行时使用的 Docker,无法直接重启 dockerd 来释放一些空间,因为磁盘爆满后dockerd 无法正常响应,停止的时候也会卡住。需要先手动清理一点文件腾出空间好让 dockerd 能够停止并重启

可以手动删除一些 docker 的 log 文件或可写层文件,通常删除 log:

$ cd /var/lib/docker/containers
$ du -sh * # 找到比较大的目录
$ cd dda02c9a7491fa797ab730c1568ba06cba74cecd4e4a82e9d90d00fa11de743c-json.log.9
$ cat /dev/null > dda02c9a7491fa797ab730c1568ba06cba74cecd4e4a82e9d90d00fa11de743c-json.log.9 # 删除log文件
  • 注意:注意: 使用 cat /dev/null > 方式删除而不用 rm ,因为用 rm 删除的文件,docker 进 程可能不会释放文件,空间也就不会释放;log 的后缀数字越大表示越久远,先删除旧日志。

然后将该 node 标记不可调度,并将其已有的 pod 驱逐到其它节点,这样重启 dockerd 就会让该 节点的 pod 对应的容器删掉,容器相关的日志(标准输出)与容器内产生的数据文件(没有挂载 volume, 可写层)也会被清理:

kubectl drain <node-name>

重启 dockerd:

systemctl restart docker

等重启恢复,pod 调度到其它节点,排查磁盘爆满原因并清理和规避,然后取消节点不可调度标记:

kubectl uncordon <node-name>

  • 如何规避 ?

正确配置 kubelet gc 和 驱逐相关的参数,即便到达爆满地步,此时节点上的 pod 也都早就自动 驱逐到其它节点了,不会存在 Pod 一直 ContainerCreating 或 Terminating 的问题。

kubernetes磁盘爆满故障处理相关推荐

  1. vsphere6.0故障:关于vCenter Appliance6.0磁盘爆满和WEB503错误问题

    故障现像和https://blog.51cto.com/8189171/2063182 老肖的博客一样.vsphere web client登录闪退,SSH无法使用,出现报503错误503 Servi ...

  2. linux服务器磁盘爆满分析

    项目场景: linux虚拟服务器 问题描述: linux服务器使用时间长后,导致系统登录失败(磁盘爆满). 原因分析: 登录失败:redis服务无法访问.启动redis后,redis的log日志显示启 ...

  3. 解决Linux服务器磁盘爆满导致的MySQ错误Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock

    @[解决Linux服务器磁盘爆满导致的MySQ错误Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.so ...

  4. pcieport 0000:00:1.0:AER: PCIe Bus Error: severity=Corrected--解决ubuntu磁盘爆满导致无法开机问题

    在ubuntu跑程序的时候结果数据太大导致磁盘爆满导致无法开机,出现了pcieport 0000:00:1c.5: PCIe Bus Error: severity=Corrected.....的报错 ...

  5. 关于linux磁盘爆满定位大文件的方法

    在linux较长时间运行中,往往会过短时间磁盘使用率达到98%以上,此时,如何定位占用空间较大文件的位置呢?下面将逐步排查: 1. df -h 此时看到/dev/vdal的占用率已经100%,严重爆满 ...

  6. 反反复复的磁盘丢失故障处理过程

      这两天遇到一个问题,很让人头疼,就是我们的CX3-10C上分配给一台服务器的虚拟磁盘老是掉线,原因起先不明,不过现在正常了.   说说大致经过吧,前天晚上开始出现这个情况,BCC告警短信发到我手机 ...

  7. 关于磁盘爆满异常(Linux下已经删除文件继续占用空间问题)

    今天一个同事跟我说磁盘爆了,df -h 查看磁盘使用率显示确实是100%,但是我du -sh *查看磁盘使用情况时,又发现磁盘情况根本不可能占满.磁盘是40G,使用顶多在10G,那还有的30多G去哪了 ...

  8. kubernetes 磁盘、PV、PVC

    6.1.介绍卷 6.1.1.卷的类型 emptyDir-用于存储临时数据的简单空目录 hostPath-用于将目录从工作节点的文件系统挂载到pod nfs-挂载到pod中的NFS共享卷. 还有其他的如 ...

  9. linux文件句柄满了 现象_Linux 离奇磁盘爆满,如何解决? | 原力计划

    作者 | 一得的跋涉责编 | 伍杏玲出品 | CSDN博客对于 Linux 磁盘满的问题,我们通常的处理思路是用 du 查找可清理的大文件,然后临时删掉让磁盘使用率先降下来,从而尽快保证磁盘能继续写入 ...

最新文章

  1. SAP HU 序列号里的Sales Order号码不一致导致PGI失败问题之对策
  2. 是否患有新冠肺炎? 你咳嗽一声
  3. 边缘计算在天猫精灵云应用上的落地实践
  4. 工业交换机单纤或双纤都只是占用一个端口吗?
  5. 两个不同的数据库如何跨库事务
  6. php怎样连接上数据库服务器,php怎样连接数据库
  7. 从零开始学keras之神经网络的数学表示
  8. ubuntu 绑定网卡
  9. aix Oracle 限制访问,改变AIX上使用oracle的一些限制
  10. PHP判断手机横向,H5横竖屏检测的方法
  11. WinRAR v5.90 正式版简体中文汉化特别版本
  12. mysql 间隙锁_MySQL间隙锁问题
  13. Aspect Level Sentiment Classification with Deep Memory Network
  14. perl oracle ppm,perl – 为什么没有找到ppm:命令?
  15. sql sever 存储过程总结及实验
  16. 微博创作者网址及申请条件,微博创作者收益
  17. matlab 图片RGB颜色提取
  18. 3D游戏建模师的工作现状令人担忧,想要走的远,必须活到老,学到老才不被淘汰
  19. Ubuntu18.04更改国内镜像源(阿里云、网易、清华、中科大)
  20. 青岛物联网关键技术资源发展路线图发布

热门文章

  1. IDEA 导入依赖包
  2. 电子病历的基本功能——主要功能hiscookbook.电子病历的基本功能
  3. 【office各个版本安装包】
  4. 好用的redis桌面工具
  5. 计算机windows7连接打印机
  6. 【CS论坛】安全风险评估的3种错误方式
  7. 联想创投创业者巅峰对话 杨元庆:企业都会经历螺旋式上升
  8. 多核计算机是指有多个cpu,多核和多个CPU有什么区别?
  9. 美团面试常见问题总结
  10. Python学习第四篇:利用python抓取英语单词