一款专为 containerd 环境打造,轻松搞定容器根文件系统的磁盘配额管理。


地址: github: vulyon/rootfs-quotas

痛点与挑战

在容器生态中,以下场景屡见不鲜:

  • 磁盘被撑爆:某个容器的日志、缓存文件突然“失控”,瞬间占用数百 GB 磁盘空间。
  • 节点故障:单个容器写满 /var/lib/containerd,导致整个节点磁盘耗尽,影响其他服务。
  • 排查困难:Kubernetes Pod 因磁盘压力被驱逐,但难以快速定位肇事容器。
  • 功能缺失:containerd + overlay2 环境下,缺乏类似 Docker --storage-opt size=10G 的原生限制支持。

解决方案:

RootFS-Quota 为容器根文件系统提供自动化、规则化的磁盘配额管理。无需手动干预,无需修改镜像或容器配置,即可解决上述痛点。


核心亮点

  • 自动生效 + 规则灵活
    • 容器启动时自动应用配额。
    • 支持按容器名镜像K8s Pod 设置规则。
    • 支持差异化限制(如:边车容器 100M,数据库 10G)。
  • 全生命周期管理
    • 实时监听 containerd 事件,响应迅速。
    • 容器删除后自动清理配额,无残留。
    • 无侵入性,现有容器不受影响。
  • 广泛兼容
    • 支持 Docker(containerd 运行时)、Kubernetes 及原生 containerd (ctr/nerdctl)。
    • 支持 XFSext4 文件系统。

工作原理

底层基于 Linux 内核成熟的 Project Quota 技术。

代码段

graph TD
    A[容器创建完成] --> B(containerd 事件监听)
    B -->|实时捕捉状态变化| C{规则匹配引擎}
    
    subgraph Rules [预设匹配规则]
    R1[容器名称]
    R2[镜像名称/标签]
    R3[Pod 元数据]
    end
    
    Rules -.-> C
    
    C -->|匹配成功| D[应用项目配额]
    
    subgraph Action [执行动作]
    D1[提取 upperdir 目录]
    D2[分配项目 ID]
    D3[设置配额限制 xfs_quota]
    end
    
    D --> Action
  1. 事件监听:订阅 containerd 事件流,监控容器生命周期。
  2. 路径探测:定位容器的 upperdir(overlay 可写层)。
  3. 规则匹配:根据配置(容器/镜像/Pod)确定配额大小。
  4. 配额生效:利用 Project Quota 在 upperdir 强制执行限制。
  5. 自动清理:容器销毁时同步移除配额配置。

文件系统支持:

  • XFS:原生支持(推荐)。
  • ext4:需在挂载参数中添加 prjquota

快速上手

1. 配置文件 (config.yaml)

YAML

manager:
  runtime: containerd          # 运行时类型
  mountPoint: /var/lib/containerd  # 挂载路径
  autoQuota: true              # 开启自动配额
  size: 30G                    # 默认兜底配额

matchRules:
  # 规则: nginx 镜像限制 5G
  - size: 5G
    level: image
    selector:
      name: nginx

  # 规则: production 命名空间下,名称以 database- 开头的 Pod 限制 20G
  - size: 20G
    level: pod
    selector:
      namespace: production
      name: database-

2. 启动代理

Bash

./rootfs-quota -config /etc/quota-agent/config.yaml

适用场景

场景 描述
多租户环境 防止单一租户容器占用所有磁盘资源。
开发集群 为开发者的容器设置宽松配额,防止构建产物失控。
生产 K8s 按负载类型分级: • 边车:小额度 • 应用:中额度 • 有状态:大额度
安全防御 避免恶意或意外的“磁盘炸弹”攻击。

项目优势

RootFS-Quota 填补了 containerd 在 overlay 文件系统下配额管理的空白:

  • 零侵入:无需修改 containerd 源码。
  • 全兼容:适配现有镜像与生态。
  • 高性能:支持数千容器并发,基于内核机制,开销极低。

参与贡献

如果您在生产环境中遇到问题,或有新的功能建议,欢迎加入我们:

  • 提交 Issue 反馈 Bug 或需求。
  • 提交 Pull Request 贡献代码。

未来规划 (Roadmap)

  • 支持更多文件系统(如 btrfs)。
  • 集成 Prometheus 监控指标。
  • 支持 Kubernetes 方式(deployment+daemonset)。
  • 支持软配额 (Soft Limit) 与硬配额 (Hard Limit)。

📚 了解更多

如果您觉得项目有用,欢迎在 GitHub 上点个 Star 支持!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐