容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
24647 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册

12 | 容器文件Quota:容器为什么把宿主机的磁盘写满了?

设置写入数据块的限制
设置Project ID
使用XFS Quota限制容器的OverlayFS大小
Project模式
限制目录的写入数据量
使用xfs_quota命令查询被限制目录的project ID和限制的数据量
Docker实现限流功能
XFS Quota
容器中运行的程序错误或配置错误可能导致磁盘写满
容器文件系统写入数据实际上是往宿主机磁盘写数据
upperdir
lowerdir
思考题
解决方法
容器写入数据导致宿主机磁盘写满
容器文件系统OverlayFS
容器文件Quota

该思维导图由 AI 生成,仅供参考

你好,我是程远。今天我们聊一聊容器文件 Quota。
上一讲,我们学习了容器文件系统 OverlayFS,这个 OverlayFS 有两层,分别是 lowerdir 和 upperdir。lowerdir 里是容器镜像中的文件,对于容器来说是只读的;upperdir 存放的是容器对文件系统里的所有改动,它是可读写的。
从宿主机的角度看,upperdir 就是一个目录,如果容器不断往容器文件系统中写入数据,实际上就是往宿主机的磁盘上写数据,这些数据也就存在于宿主机的磁盘目录中。
当然对于容器来说,如果有大量的写操作是不建议写入容器文件系统的,一般是需要给容器挂载一个 volume,用来满足大量的文件读写。
但是不能避免的是,用户在容器中运行的程序有错误,或者进行了错误的配置。
比如说,我们把 log 写在了容器文件系统上,并且没有做 log rotation,那么时间一久,就会导致宿主机上的磁盘被写满。这样影响的就不止是容器本身了,而是整个宿主机了。
那对于这样的问题,我们该怎么解决呢?

问题再现

我们可以自己先启动一个容器,一起试试不断地往容器文件系统中写入数据,看看是一个什么样的情况。
用 Docker 启动一个容器后,我们看到容器的根目录 (/) 也就是容器文件系统 OverlayFS,它的大小是 160G,已经使用了 100G。其实这个大小也是宿主机上的磁盘空间和使用情况。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了容器文件Quota的重要性以及如何通过XFS Quota的Project模式来限制容器对宿主机磁盘的写入量。首先介绍了OverlayFS的工作原理和容器对文件系统的写入方式,以及可能导致宿主机磁盘被写满的情况。随后详细介绍了XFS文件系统的Quota特性,重点讲解了Project模式的工作原理和使用方法,并通过实际操作演示了如何限制容器对宿主机磁盘的写入量。文章还探讨了Docker中如何实现XFS Quota限制以及如何应对不是由Docker启动的容器的情况。总的来说,本文通过深入浅出的方式介绍了容器文件Quota的技术特点和解决方法,对于需要深入了解容器文件系统和磁盘写入限制的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《容器实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 莫名
    容器 quota 的局限性:容器通常采用 overlay2 driver,仅支持在宿主文件系统 xfs 上开启 quota 功能。意味着 overlay over ext4 不支持 quota 功能,而实际生产环境上 ext4 的使用远多于 xfs。

    作者回复: @莫名, 的确,我一直使用的是xfs, 对于ext4 quota的功能没有测试过。 不过我之前搜索过, ext4在2016年就应该支持project quota了。我们可以一起再确认一下。 ``` commit 689c958cbe6be4f211b40747951a3ba2c73b6715 Author: Li Xi <pkuelelixi@gmail.com> Date: Fri Jan 8 16:01:22 2016 -0500 ext4: add project quota support This patch adds mount options for enabling/disabling project quota accounting and enforcement. A new specific inode is also used for project quota accounting. [ Includes fix from Dan Carpenter to crrect error checking from dqget(). ] Signed-off-by: Li Xi <lixi@ddn.com> Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Reviewed-by: Andreas Dilger <adilger@dilger.ca> Reviewed-by: Jan Kara <jack@suse.cz>

    2020-12-11
    3
    20
  • Geek2014
    上篇的评论中提到:“我们在2019年初就不用docker了。” 这篇中,老师提到了containerd,是说你们已经用containerd替换了docker吗?有机会对containerd和docker之间的使用对比做个介绍吗?

    作者回复: @Geek2014 对的,我们已经使用containerd快两年了。 这是之前我们组做的分享: https://www.infoq.cn/article/odslclsjvo8bnx*mbrbk

    2020-12-11
    2
    13
  • Sun
    老师,我觉得可以补充下 现在k8s 1.14 开始,默认开启 LocalStorageCapacityIsolation, 可以通过限制resources.limits.ephemeral-storage 和resources.requests.ephemeral-storage 来保护宿主机 rootfs了。

    作者回复: @Sun, 谢谢,很好的补充。 k8s 通过du来检查ephemeral-storage相关volume/目录的大小,然后如果超出limit就evict pod。 du的开销会比较大,evict pod比较适合stateless pod。不过最新的k8s应该在用filesystem quota来限制emptyDir的大小了。

    2020-12-22
    2
    12
  • 徐少文
    老师,CGroup子系统中没有对硬盘使用量进行限制的功能模块吗?除了通过文件系统的quota去限制还有其他的方法吗?

    作者回复: cgroup里没有对磁盘容量使用限制的模块。

    2021-07-13
    4
  • Helios
    老师能说下你们应用容器Quota的场景么。对于无状态服务一般就是日志会写文件了,离线任务比如机器学习的模型也不敢给人家限制呀😂

    作者回复: 如果用户需要使用大容量的磁盘空间,需要使用volume. Quota主要来限制容器的rootfs, 这个rootfs一般是在host的磁盘会和别的容器共享,所以需要对它做限制。

    2020-12-13
    2
    3
  • Action
    老师 为什么overlayFS 并不是docker_id 呢? [root@localhost overlay2]# docker inspect 5440662c8db [ { "Id": "5440662c8db65d5d9ab522e0be1a3911584c492527fcde334c3fdec090cd3857", "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55", "GraphDriver": { "Data": { "LowerDir": "/home/data/docker/overlay2/4146b7c314a97b46695a59ccdc323709eda7177b3e91ed30d3f4f9326a061584-init/diff:/home/data/docker/overlay2/dc1e8c89044058319c4e0b6917603f3ed8972cd155bfced0c7c0c2509ddaae14/diff", "MergedDir": "/home/data/docker/overlay2/4146b7c314a97b46695a59ccdc323709eda7177b3e91ed30d3f4f9326a061584/merged", "UpperDir": "/home/data/docker/overlay2/4146b7c314a97b46695a59ccdc323709eda7177b3e91ed30d3f4f9326a061584/diff", "WorkDir": "/home/data/docker/overlay2/4146b7c314a97b46695a59ccdc323709eda7177b3e91ed30d3f4f9326a061584/work" }, "Name": "overlay2" }, } ]

    作者回复: 看moby(docker)代码里,docker自己对这个目录自己做了一个随机数的生成,具体原因不清楚。

    2020-12-16
    1
  • 宝仔
    这个是一定要基于xfs文件系统吗?如果是ext4文件系统呢?

    作者回复: 我没有在ext4上测试过,不过通过内核信息,还有网上别人的尝试,ext4应该也是支持(project)quota的。 https://discuss.linuxcontainers.org/t/how-do-i-set-up-the-project-quota-needed-for-limiting-container-storage-size-for-the-dir-backend-on-ubuntu-18-04/7311 ``` commit 689c958cbe6be4f211b40747951a3ba2c73b6715 Author: Li Xi <pkuelelixi@gmail.com> Date: Fri Jan 8 16:01:22 2016 -0500 ext4: add project quota support This patch adds mount options for enabling/disabling project quota accounting and enforcement. A new specific inode is also used for project quota accounting. [ Includes fix from Dan Carpenter to crrect error checking from dqget(). ] Signed-off-by: Li Xi <lixi@ddn.com> Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Reviewed-by: Andreas Dilger <adilger@dilger.ca> Reviewed-by: Jan Kara <jack@suse.cz>

    2020-12-11
    1
  • DayDayUp
    老师讲的太好了,不知道面试贵司会不会有机会呢?老师在eBay哪个team啊?应届生要吗???

    作者回复: eBay cloud team. 我们一直在招人的。

    2021-11-28
  • 谢哈哈
    可以通过xfs_quota -x -c "report -pbih " 目录名称查询projectid
    2020-12-11
    6
  • 上邪忘川
    [root@localhost ~]# xfs_quota -x -c 'report -h /tmp/xfs_prjquota' Project quota on / (/dev/mapper/centos-root) Blocks Project ID Used Soft Hard Warn/Grace ---------- --------------------------------- #0 3.2G 0 0 00 [------] #2 8K 100M 100M 00 [------] #3 100M 100M 100M 00 [------] #101 10M 0 10M 00 [------]
    2020-12-11
    3
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部