kubernetes磁盘爆满故障处理
一、什么情况下磁盘可能会爆满 ?
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 (比如 emptyDir
,ConfigMap
,Secret
),通过 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磁盘爆满故障处理相关推荐
- vsphere6.0故障:关于vCenter Appliance6.0磁盘爆满和WEB503错误问题
故障现像和https://blog.51cto.com/8189171/2063182 老肖的博客一样.vsphere web client登录闪退,SSH无法使用,出现报503错误503 Servi ...
- linux服务器磁盘爆满分析
项目场景: linux虚拟服务器 问题描述: linux服务器使用时间长后,导致系统登录失败(磁盘爆满). 原因分析: 登录失败:redis服务无法访问.启动redis后,redis的log日志显示启 ...
- 解决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 ...
- pcieport 0000:00:1.0:AER: PCIe Bus Error: severity=Corrected--解决ubuntu磁盘爆满导致无法开机问题
在ubuntu跑程序的时候结果数据太大导致磁盘爆满导致无法开机,出现了pcieport 0000:00:1c.5: PCIe Bus Error: severity=Corrected.....的报错 ...
- 关于linux磁盘爆满定位大文件的方法
在linux较长时间运行中,往往会过短时间磁盘使用率达到98%以上,此时,如何定位占用空间较大文件的位置呢?下面将逐步排查: 1. df -h 此时看到/dev/vdal的占用率已经100%,严重爆满 ...
- 反反复复的磁盘丢失故障处理过程
这两天遇到一个问题,很让人头疼,就是我们的CX3-10C上分配给一台服务器的虚拟磁盘老是掉线,原因起先不明,不过现在正常了. 说说大致经过吧,前天晚上开始出现这个情况,BCC告警短信发到我手机 ...
- 关于磁盘爆满异常(Linux下已经删除文件继续占用空间问题)
今天一个同事跟我说磁盘爆了,df -h 查看磁盘使用率显示确实是100%,但是我du -sh *查看磁盘使用情况时,又发现磁盘情况根本不可能占满.磁盘是40G,使用顶多在10G,那还有的30多G去哪了 ...
- kubernetes 磁盘、PV、PVC
6.1.介绍卷 6.1.1.卷的类型 emptyDir-用于存储临时数据的简单空目录 hostPath-用于将目录从工作节点的文件系统挂载到pod nfs-挂载到pod中的NFS共享卷. 还有其他的如 ...
- linux文件句柄满了 现象_Linux 离奇磁盘爆满,如何解决? | 原力计划
作者 | 一得的跋涉责编 | 伍杏玲出品 | CSDN博客对于 Linux 磁盘满的问题,我们通常的处理思路是用 du 查找可清理的大文件,然后临时删掉让磁盘使用率先降下来,从而尽快保证磁盘能继续写入 ...
最新文章
- SAP HU 序列号里的Sales Order号码不一致导致PGI失败问题之对策
- 是否患有新冠肺炎? 你咳嗽一声
- 边缘计算在天猫精灵云应用上的落地实践
- 工业交换机单纤或双纤都只是占用一个端口吗?
- 两个不同的数据库如何跨库事务
- php怎样连接上数据库服务器,php怎样连接数据库
- 从零开始学keras之神经网络的数学表示
- ubuntu 绑定网卡
- aix Oracle 限制访问,改变AIX上使用oracle的一些限制
- PHP判断手机横向,H5横竖屏检测的方法
- WinRAR v5.90 正式版简体中文汉化特别版本
- mysql 间隙锁_MySQL间隙锁问题
- Aspect Level Sentiment Classification with Deep Memory Network
- perl oracle ppm,perl – 为什么没有找到ppm:命令?
- sql sever 存储过程总结及实验
- 微博创作者网址及申请条件,微博创作者收益
- matlab 图片RGB颜色提取
- 3D游戏建模师的工作现状令人担忧,想要走的远,必须活到老,学到老才不被淘汰
- Ubuntu18.04更改国内镜像源(阿里云、网易、清华、中科大)
- 青岛物联网关键技术资源发展路线图发布