Kubernetes排错(十)-处理容器数据磁盘被写满

容器数据磁盘被写满造成的危害:

  • 不能创建 Pod (一直 ContainerCreating)
  • 不能删除 Pod (一直 Terminating)
  • 无法 exec 到容器

如何判断是否被写满?

容器数据目录大多会单独挂数据盘,路径一般是 /var/lib/docker,也可能是 /data/docker 或 /opt/docker,取决于节点被添加时的配置,可通过 docker info 确定:

$ docker info
...
Docker Root Dir: /var/lib/docker
...

如果没有单独挂数据盘,则会使用系统盘存储。判断是否被写满:

$ df
Filesystem     1K-blocks     Used Available Use% Mounted on
...
/dev/vda1       51474044  4619112  44233548  10% /
...
/dev/vdb        20511356 20511356         0 100% /var/lib/docker

解决方法

1)先恢复业务,清理磁盘空间

重启 dockerd (清理容器日志输出和可写层文件)

  • 重启前需要稍微腾出一点空间,不然重启 docker 会失败,可以手动删除一些docker的log文件或可写层文件,通常删除log:
$ cd /var/lib/docker/containers
$ du -sh * # 找到比较大的目录
$ cd dda02c9a7491fa797ab730c1568ba06cba74cecd4e4a82e9d90d00fa11de743c
$ cat /dev/null > dda02c9a7491fa797ab730c1568ba06cba74cecd4e4a82e9d90d00fa11de743c-json.log.9 # 删除log文件

注意: 使用 cat /dev/null > 方式删除而不用 rm,因为用 rm 删除的文件,docker 进程可能不会释放文件,空间也就不会释放;log 的后缀数字越大表示越久远,先删除旧日志。

  • 将该 node 标记不可调度,并将其已有的 pod 驱逐到其它节点,这样重启dockerd就会让该节点的pod对应的容器删掉,容器相关的日志(标准输出)与容器内产生的数据文件(可写层)也会被清理:
kubectl drain 10.179.80.31
  • 重启 dockerd:
systemctl restart dockerd
  • 取消不可调度的标记:
kubectl uncordon 10.179.80.31
2)定位根因,彻底解决 

问题定位方法见附录,这里列举根因对应的解决方法:

  • 日志输出量大导致磁盘写满:
    • 减少日志输出
    • 增大磁盘空间
    • 减小单机可调度的pod数量
  • 可写层量大导致磁盘写满: 优化程序逻辑,不写文件到容器内或控制写入文件的大小与数量
  • 镜像占用空间大导致磁盘写满:
    • 增大磁盘空间
    • 删除不需要的镜像

附录

查看docker的磁盘空间占用情况
$ docker system df -v

定位容器写满磁盘的原因

进入容器数据目录(假设是 /var/lib/docker,并且存储驱动是 aufs):

$ cd /var/lib/docker
$ du -sh *

  • containers 目录: 体积大说明日志输出量大
  • aufs 目录
    • diff 子目录: 容器可写层,体积大说明可写层数据量大(程序在容器里写入文件)
    • mnt 子目录: 联合挂载点,内容为容器里看到的内容,即包含镜像本身内容以及可写层内容
找出日志输出量大的 pod

TKE 的 pod 中每个容器输出的日志最大存储 1G (日志轮转,最大10个文件,每个文件最大100m,可用 docker inpect 查看):

$ docker inspect fef835ebfc88
[
    {
         ...
        "HostConfig": {
            ...
            "LogConfig": {
                "Type": "json-file",
                "Config": {
                    "max-file": "10",
                    "max-size": "100m"
                }
            },
...

查看哪些容器日志输出量大:

$ cd /var/lib/docker/containers
$ du -sh *

目录名即为容器id,使用排序与 docker ps 结果匹配可找出对应容器,最后就可以推算出是哪些 pod 存在大量数据写入。

找出可写层数据量大的 pod

可写层的数据主要是容器内程序自身写入的,无法控制大小,可写层越大说明容器写入的文件越多或越大,通常是容器内程序将log写到文件里了,查看一下哪个容器的可写层数据量大:

$ cd /var/lib/docker/aufs/diff
$ du -sh *

 通过可写层目录(diff的子目录)反查容器id:

$ grep 834d97500892f56b24c6e63ffd4e520fc29c6c0d809a3472055116f59fb1d2be /var/lib/docker/image/aufs/layerdb/mounts/*/mount-id
/var/lib/docker/image/aufs/layerdb/mounts/eb76fcd31dfbe5fc949b67e4ad717e002847d15334791715ff7d96bb2c8785f9/mount-id:834d97500892f56b24c6e63ffd4e520fc29c6c0d809a3472055116f59fb1d2be

mounts 后面一级的id即为容器id: eb76fcd31dfbe5fc949b67e4ad717e002847d15334791715ff7d96bb2c8785f9,使用前几位与 docker ps 结果匹配可找出对应容器,最后就可以推算出是哪些 pod占用大量磁盘。

找出体积大的镜像

看看哪些镜像比较占空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/738852.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于CDMA的多用户水下无线光通信(3)——解相关多用户检测

继续上一篇博文,本文将介绍基于解相关的多用户检测算法。解相关检测器的优点是因不需要估计各个用户的接收信号幅值而具有抗远近效应的能力。常规的解相关检测器有运算量大和实时性差的缺点,本文针对异步CDMA的MAI主要来自干扰用户的相邻三个比特周期的特…

wordpress教程自动采集并发布工具

随着互联网的快速发展,越来越多的人开始关注网络赚钱。而对于许多人来说,拥有一个自己的个人网站是一个不错的选择。然而,要让自己的个人网站内容丰富多样,就需要不断地进行更新。那么,有没有一种方法可以让我们轻松地…

服务器数据恢复—raid5热备盘同步失败导致阵列崩溃如何恢复数据?

服务器存储数据恢复环境&故障: 某品牌DS5300存储,包含一个存储机头和多个磁盘柜,组建了多组RAID5磁盘阵列。 某个磁盘柜中的一组RAID5阵列由15块数据盘和1块热备硬盘组建。该磁盘柜中的某块硬盘离线,热备盘自动替换并开始同步…

C语言入门系列:从内存原理看函数的值传递和引用传递

文章目录 一,值传递二,引用传递三,从内存原理看值传递和引用传递的区别1 值传递内存示意图2 引用传递内存示意图 参考文献 函数参数用于向函数传递数据,C语言支持两种传递方式:值传递和引用传递。 一,值传递…

校史馆虚拟翻书设计有哪些技术上的亮点?

近年来,互动多媒体已成为展览展示行业中备受瞩目的焦点,尤其是那些凭借尖端的投影与感应技术打造的互动装置,它们在各个主题展厅中独领风骚,其独特魅力不言而喻。而当我们深入思考其在校史馆设计中的应用时,不难预见&a…

【每日一题】503. 下一个更大元素 II

思路(c) 使用单调栈的解法,单调栈里面存的是大于当前元素的index,不是直接存值。但是这个题目是一个循环数组,可以在后面补一段前面的内容,这样就可以正常遍历。将每个位置对应的结果存在map中 后面循环…

BUUCTF [CISCN2019 华北赛区 Day2 Web1] Hack World

1、通过题目,可以知道该题目为SQL注入类型: 2、判断注入类型为数字注入: 3、通过BP抓包,来判断注入点。 字典爆破发现常规的注入方式都被过滤。 4、因此可以尝试通过布尔盲注的方式来得到flag。编写脚本得到flag import requests…

华为仓颉语言:编程语言的新篇章

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Vue.js 自定义组件的三种用法

1.创建项目 创建项目,你可以参考我以前的博文,这里省略了 项目的目录结构如下: 接着,我们在 src/components 目录下创建一个自定义的组件 SplashHello.vue,示例代码如下所示: <template><div><p>{{ title }}</p><p>{{ message }}</p&…

MTK7628+MT7612 加PA定频数据

1、硬件型号TR726A5G121-DPA PC9.02.0017。如下所示&#xff1a; 2、WIFI5.8 AC模式 42&#xff08;5120MHz&#xff09;信道&#xff0c;80带宽 3、WIFI5.8 AC模式 38&#xff08;5190MHz&#xff09;信道&#xff0c;40带宽 4、WIFI5.8 AC模式 36&#xff08;5180 MHz&…

【机器学习】自然语言处理的新前沿:GPT-4与Beyond

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f525;引言 背景介绍 文章目的 一、GPT-4简介 GPT-4概述 主要特性 局限性和挑战 二、自监督学习的新进展 自监督学习的原理 代表性模型和技术 三、少样本学习和零样本学习 少样本学习的挑战 先…

AIGC+艺术=教育变革?

在数字化时代的浪潮中&#xff0c;技术的每一次跃进都深刻影响着社会的各个领域&#xff0c;教育亦不例外。近年来&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术的兴起&#xff0c;为艺术教育领域带来了前所未有的变革机遇。当AIGC与艺术相结合&#xff0c;我…

人工智能-鲁棒性(通俗易懂)

1.什么是鲁棒性 在机器学习中&#xff0c;鲁棒性&#xff08;Robustness&#xff09;是指模型对于异常数据或噪声的抗干扰能力。一个鲁棒性较强的模型能够在面对未知的数据或者数据中存在噪声或异常值时&#xff0c;仍能保持较好的性能和泛化能力。鲁棒性是一个重要的性能指标…

JavaSE (Java基础):Scanner类介绍

4 Scanner最最最基础的使用 Scanner是Java中十分常用到的类&#xff0c;对于这个类的用法我认为并不难&#xff0c;想用直接调用就行&#xff0c;在IDE中输入&#xff1a;new Scanner&#xff08;System.in&#xff09;;后按住altenter键后会直接给这个被赋给类的元素&…

如何用家政服务小程序源码系统 快速搭建家政自己接单的软件?

随着移动互联网的快速发展&#xff0c;线上预约服务已成为家政行业的新趋势。然而&#xff0c;许多家政企业面临着信息不透明、服务质量参差不齐、管理效率低下等问题。家政服务小程序系统&#xff0c;可以帮助商家快速搭建自己的接单软件&#xff0c;提升服务效率&#xff0c;…

二叉树第一期:树与二叉树的概念

一、树 1.树的定义 与线性表不同&#xff0c;树是一种非线性的数据结构&#xff0c;由N(N>0)个结点组成的具有层次关系的集合&#xff1b;因其形状类似生活中一颗倒挂着的树&#xff0c;故将其数据结构称为树。 2.树的相关概念 根结点 没有前驱的结点&#xff0c;称为根…

【数据结构】时间复杂度

目录 一、算法的复杂度 二、时间复杂度 2.1 时间复杂度的概念 2.2 大O渐进表示法 2.3 计算时间复杂度步骤 三、常见时间复杂度举例 3.1 ❥ 常数阶 3.2 ❥ 线性阶 3.3 ❥ 平方阶 3.4 ❥ 对数阶 3.5 ❥ 指数阶 3.6 ❥ 多个未知数的复杂度 四、最好&#xff0c;最坏&am…

人工智能机器学习算法总结偏差和方差

1.定义 在机器学习中&#xff0c;偏差&#xff08;Bias&#xff09;和方差&#xff08;Variance&#xff09;是评估模型泛化能力的重要概念。它们描述了模型在训练数据上的表现以及对新数据的适应能力。 偏差&#xff08;Bias&#xff09; &#xff1a; 偏差是指模型的预测值与…

SARscape下载DEM进度条不动的问题

使用SARscape的DEM Extraction下载DEM&#xff0c;进度条不动问题的解决办法&#xff1a; 一个字&#xff1a; 我是等了一晚上&#xff0c;第二天就好了。下载的DEM范围是一景SAR影像&#xff0c;未裁剪。

Java研学-RBAC权限控制(八)

九 登录登出 1 登录作用 判断员工是否有权限访问&#xff0c;首先得知道现在操作的人是谁&#xff0c;所以必须先实现登录功能 2 登录流程 ① 提供登录页面&#xff0c;可输入用户名与密码信息&#xff0c;并添加执行登录的按钮。&#xff08;登录页面不能被拦截&#xff09;…