首页/新闻资讯/正文详情

Rook 文件系统动态供给:从 CephFS 手动卷到 PVC/StorageClass 自动化编排

发布时间:2026/9/23 3:19:18 来源:云帆数科 栏目:资讯中心
Rook 文件系统动态供给:从 CephFS 手动卷到 PVC/StorageClass 自动化编排
云原生存储容器编排运维【免费下载链接】rookStorage Orchestration for Kubernetes项目地址https://gitcode.com/gh_mirrors/roo/rook点击查看免费下载导读本文围绕 Rook 仓库中的设计文档 dynamic-provision-filesystem.md 展开深入剖析文件系统动态供给Filesystem Dynamic Provisioning这一设计提案的动机、用户经验演进与实现思路。读者将掌握为何要在 Kubernetes 中通过 PVC StorageClass 消费 CephFS、设计文档中描述的rook.io/filesystem外部 provisioner 工作方式以及这一设计在当前 Rook 中如何被 CSI 驱动方案cephfs.csi.ceph.com所落地与演进。背景CephFS 消费的痛点与动态供给的价值在 Rook 早期版本中应用要挂载一个 CephFS 共享文件系统必须直接在 Pod/Deployment 的 volume 定义里手工填写 CephFS 卷插件所需的全部输入包括 monitor 地址、Ceph 用户、密钥引用等。设计文档明确指出其中部分输入非常笨重且需要一些 hacky 的命令才能获取Some of this inputs are very cumbersome and required hacky commands to obtain them。动态供给方案的核心思路是把存储供给职责从应用开发者手中剥离出来交给集群管理员定义的 StorageClass并通过 Kubernetes 原生的 PVC 机制完成消费。设计文档列举了三大收益深度贴合 Kubernetes APIPVC/PV 机制天然带来卷回收策略reclaim policy设置、供给过程的 RBAC 控制、访问模式accessMode定义等能力应用清单与存储类型解耦Pod 只需引用 PVC无论底层换成块存储还是文件系统Pod 清单都无需改动管理员与用户职责分离用户不必关心metadataPool、erasureCoded、亲和性affinity、容忍toleration等底层细节只需创建文件系统 PVC 并引用一个符合需求的 StorageClass。设计文档还追溯了这一概念的社区来源外部存储项目 kubernetes-incubator/external-storage 中的 cephfs 供给器已经实现了类似能力Rook 可以借鉴同一模式社区也通过 issuerook/rook#1125表达了明确诉求。现状体验手动指定 CephFS 卷设计文档用一个 MySQL Deployment 示例展示了改造前的消费体验用户需要在volumes段逐项填写monitors、user、secretRef等信息。apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: strategy: type: Recreate template: spec: containers: - image: mysql:5.6 name: mysql env: - name: MYSQL_ROOT_PASSWORD value: changeme ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage cephfs: monitors: - monitor1 - monitor2 - monitor3 user: admin secretRef: name: rook-admin这种方式的弊端是显而易见的monitor 列表会随集群拓扑变化而变动admin 用户与密钥的获取需要手工操作任何一个参数填错都会导致挂载失败。设计文档的结论是用户必须自己找出这些值并确保每个参数都正确提供。目标体验只用 PVC 消费文件系统引入动态供给后创建文件系统存储只需创建一个 PVC 对象与 Kubernetes 中其他所有存储供给方式保持一致apiVersion: v1 kind: PersistentVolumeClaim metadata: name: myfsdata spec: storageClassName: rook-filesystem-simple path: /myData # 未提供时使用根路径 / accessModes: - ReadWriteMany消费该存储的 Pod 清单则简化为apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: strategy: type: Recreate template: spec: containers: - image: mysql:5.6 name: mysql env: - name: MYSQL_ROOT_PASSWORD value: changeme ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: myfsdata设计文档特别强调了一个关键体验消费方 Pod 清单无论挂载的是文件系统还是块设备看起来都是一样的。这正是动态供给对应用开发者最重要的价值——存储形态的切换不再需要改动应用部署清单。StorageClass管理员定义供给策略PVC 示例中引用的rook-filesystem-simple是一个 StorageClass 对象。动态供给的存储会通过 StorageClass 获取如何供给存储的细节与配置StorageClass 由集群管理员创建。设计文档给出的文件系统 StorageClass 示例如下apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: rook-filesystem-simple provisioner: rook.io/filesystem parameters: fsName: myFS # 要使用的文件系统名称其中被引用的文件系统myFS需要管理员通过 CephFilesystem CRD 预先创建。例如一个具备更高可用性HA的rook-filesystem-goldapiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: rook-filesystem-gold provisioner: rook.io/filesystem parameters: fsName: mySuperHAFS通过定义多个 StorageClass 对象管理员可以为用户提供多种文件系统选项用户按需引用与自身需求匹配的 StorageClass 即可。实现方案基于 external-provisioner 的供给器设计文档给出了实现思路复用 Kubernetes 生态的 external-provisioner 控制器来监听 PVC 对象——Rook 当时已经在块设备供给中使用了该控制器。实现逻辑与块设备供给高度类似监听 PVCprovisioner 监听类型为rook.io/filesystem的 PVC 对象解析参数PVC 创建时provisioner 从 StorageClass 中解析文件系统信息如fsName创建卷源根据解析结果构造包含全部所需信息的 volume source如path、monitors、user、secretRef等回收清理PVC 被删除时对应的文件系统底层组件mds、data pools 等随之删除。当前演进设计落地为 Ceph CSI 动态供给值得说明的是这份设计文档提出的rook.io/filesystem独立 provisioner 方案在当前 Rook 代码库中已被更为成熟的Ceph CSI 驱动方案取代——CephFS 的动态供给能力由cephfs.csi.ceph.com驱动提供。从源码看Rook 的 CSI 配置在 pkg/operator/ceph/csi/config.go 中定义了cephFSDriverSuffix cephfs.csi.ceph.comconfig.go并在 pkg/operator/ceph/csi/secrets.go 中为 CephFS 供给器创建专用的 Ceph 用户client.csi-cephfs-provisionersecrets.go。这一演进保留了设计文档的所有核心理念——PVC 驱动的消费体验、StorageClass 承载供给策略、管理员与用户职责分离——但将供给实现从自定义 external-provisioner 迁移到了标准 CSI 架构。设计文档中复用 external-provisioner 控制器的思路与 CSI 架构中 sidecar 容器如csi-provisioner承担的角色在思想上一脉相承。当前的 StorageClass 形态Rook 当前示例仓库中的 CephFS StorageClass 位于 deploy/examples/csi/cephfs/storageclass.yaml相比设计文档的极简形态它承载了完整的 CSI 供给参数apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: rook-cephfs provisioner: rook-ceph.cephfs.csi.ceph.com # csi-provisioner-name parameters: # clusterID 是 rook 集群所在命名空间 clusterID: rook-ceph # namespace:cluster # 卷将创建于其中的 CephFS 文件系统名称 fsName: myfs # 卷将创建于其中的 Ceph pool # provisionVolume: true 时必填 pool: myfs-replicated # 密钥包含 Ceph admin 凭据由 operator 自动生成于集群同一命名空间 csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph # namespace:cluster csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph # namespace:cluster csi.storage.k8s.io/controller-publish-secret-name: rook-csi-cephfs-provisioner csi.storage.k8s.io/controller-publish-secret-namespace: rook-ceph # namespace:cluster csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph # namespace:cluster # (可选) 设为 true 以使用 KMS 中的密钥加密每个卷 # encrypted: true # (可选) 通过指定与 KMS ConfigMap 匹配的唯一 ID 使用外部 KMS 加密 # encryptionKMSID: kms-config-id # (可选) 驱动可使用 ceph-fuse (fuse) 或 ceph 内核客户端 (kernel) # mounter: kernel reclaimPolicy: Delete allowVolumeExpansion: true mountOptions: # uncomment the following line for debugging #- debug可以看到fsName参数从设计文档一路沿用到 CSI 时代provisioner的命名从rook.io/filesystem演变为带集群命名空间前缀的namespace.cephfs.csi.ceph.com。这与设计文档管理员定义 StorageClass、用户按需引用的职责划分完全一致。当前的 PVC 形态对应的 PVC 示例位于 deploy/examples/csi/cephfs/pvc.yaml--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: cephfs-pvc labels: group: snapshot-test spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: rook-cephfs相比设计文档的 PVC 示例当前实现取消了 PVC 上的path字段挂载子路径改为通过 VolumeMount 的subPath等机制处理并增加了resources.requests.storage容量声明——CephFS 的 CSI 驱动会通过目录配额quota来落实该容量上限参见 filesystem-storage.md 的 Quotas 章节。完整实操路径从 CephFilesystem 到 PVC综合当前仓库文档 filesystem-storage.md 与 ceph-csi-drivers.md一条完整的文件系统动态供给链路如下创建底层文件系统通过 CephFilesystem CRD 创建myfs定义 metadataPool、dataPools 与 MDS 配置示例见 filesystem.yaml等待 MDS 就绪kubectl -n rook-ceph get pod -l approok-ceph-mds确认 mds 实例 Running创建 StorageClass应用 deploy/examples/csi/cephfs/storageclass.yaml指定clusterID、fsName与密钥引用创建 PVC应用 deploy/examples/csi/cephfs/pvc.yaml声明访问模式与容量应用消费 PVCPod 中通过persistentVolumeClaim.claimName引用 PVC即可完成挂载。这套链路正是设计文档愿景的最终实现用户层面只面对PVC StorageClass两个抽象底层 CephFS 的 pool、MDS、monitor 等细节全部由 Rook operator 与 CSI 驱动透明处理。小结dynamic-provision-filesystem.md是一份典型的体验驱动设计文档先指出手工 CephFS 卷的痛点再给出 PVC 化的目标体验最后落到 external-provisioner 的实现草图。它提出的PVC 消费 StorageClass 配置 供给/回收自动化框架最终在 Rook 中以 Ceph CSI 驱动的形式完整落地并延续了fsName等核心参数的语义。对于希望理解 Rook 文件系统存储设计脉络的读者这篇设计文档与当前 filesystem-storage.md、ceph-filesystem-crd.md 及 cephfs 示例目录 互为补充构成从设计到实践的全景视图。赞分享云原生存储容器编排运维【免费下载链接】rookStorage Orchestration for Kubernetes项目地址https://gitcode.com/gh_mirrors/roo/rook点击查看免费下载相关推荐Kubespray 如何启用 AWS EBS CSI Driver 并验证 StorageClass 与 PVC 动态供给Kubespray 如何启用 AWS EBS CSI Driver 并验证 StorageClass 与 PVC 动态供给 如果你的 Kubernetes 集云原生容器编排DevOps运维终极免费离线绘图工具draw.io桌面版完全使用指南终极免费离线绘图工具draw.io桌面版完全使用指南 还在为网络不稳定而无法绘制专业图表烦恼吗draw.io桌面版为你提供了完美的离线绘图解决方案。这款基于桌面应用图形学Parselmouth核心功能解析Praat算法的Pythonic实现Parselmouth核心功能解析Praat算法的Pythonic实现 Parselmouth是一个将Praat算法以Pythonic方式实现的强大工具库它创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

condition 条件步骤:在 Grafast 中构建布尔条件与流程控制
condition 条件步骤:在 Grafast 中构建布尔条件与流程控制

后端API网关 【免费下载链接】crystal 🔮 Graphiles Crystal Monorepo; home to Grafast, PostGraphile, pg-introspection, pg-sql2 and much more! 项目地址: https://gitcode.com/gh_mirrors/cry/crystal 点击查看 免费下载 摘要 condition 是 Graf… · 2026/9/23 3:19:12

掌阅阅读技术栈对比图解原理与避坑指南
掌阅阅读技术栈对比图解原理与避坑指南

掌阅阅读技术栈对比图解原理与避坑指南 配置环境就卡半天,是不是觉得掌阅阅读的文档像天书?别急,咱们直接上 图解原理 ,把那些晦涩的配置逻辑拆解成大白话。很多开发者在集成掌阅SDK时,第一步就栽在环境依赖上,明明照着官方文档抄,还是报错,其实… · 2026/9/23 3:19:12

3步搞定ccfl背光调试,附完整示例代码
3步搞定ccfl背光调试,附完整示例代码

3步搞定ccfl背光调试,附完整示例代码 面试被问ccfl背光驱动原理,答不上来?别慌。很多工程师只知其形不知其神,导致在硬件联调时手忙脚乱。今天直接上干货,通过一个完整的Python控制脚本,带你从零搭建一套ccfl背光测试环境,彻底搞懂… · 2026/9/23 3:18:53

Markdown写博客实战手册:语法、工具与高效工作流
Markdown写博客实战手册:语法、工具与高效工作流

写博客这件事,我摸索了挺多年才彻底稳定下来。早期用过各种在线编辑器,后来折腾过本地 Word,再后来转到 Markdown 这套流程里,就再也没回去过。Markdown 吸引我的核心点特别简单:它让写作重新聚焦在“内容”上&#xf… · 2026/9/23 4:09:39

C++类模板从入门到实战:语法、实例化与常见错误详解
C++类模板从入门到实战:语法、实例化与常见错误详解

最近在带一个内部培训项目,有个学员突然问我:“类模板到底该怎么写?我看了一堆文章,要么讲太浅,要么全是语法表格,实在看不下去。”这个问题其实挺有代表性。我写了这么多年模板代码,发现很多人… · 2026/9/23 4:09:39

GitHub开源项目精选:从AI编程到嵌入式与数据可视化
GitHub开源项目精选:从AI编程到嵌入式与数据可视化

Github开源分享第6期:从AI编程工具到嵌入式音视频,一些值得上手的项目老规矩,这一期还是从热搜和社区讨论里挑项目来聊。整理的时候我明显感觉到一个变化:大家已经不满足于"这个项目能不能跑通",而是更关心&… · 2026/9/23 4:09:39

AI原生IDE Qoder实战:从SpringBoot调试到全栈网站开发
AI原生IDE Qoder实战:从SpringBoot调试到全栈网站开发

1. 从"AI辅助"到"AI原生":真实工程开发里的痛感与转机1.1 传统AI助手为什么在真实工程里"失灵"我先说说自己的背景。过去一年多里,我一直在各种AI编程工具之间来回切换,Github Copilot、ChatGPT写代码、各类插… · 2026/9/23 4:09:39

UE5编译太慢?从底层原理到实战提速的全方位优化指南
UE5编译太慢?从底层原理到实战提速的全方位优化指南

讲个真实的场景。项目组来了个新人,第一次拉取UE5工程,准备做第一个C类,结果从早上十点开始编译,午饭回来还没编完。这种事在UE5项目里太常见了,尤其是当你用的还是默认的Development Editor配置、默认的编译工具、默认… · 2026/9/23 4:09:32

M6与M5 Ultra跑分对比:单核7.9%与多核2.3倍差距背后的芯片设计逻辑
M6与M5 Ultra跑分对比:单核7.9%与多核2.3倍差距背后的芯片设计逻辑

1. 跑分数据背后的芯片设计逻辑1.1 单核7.9%与多核2.3倍的真实含义Geekbench数据库里出现M6和M5 Ultra的跑分记录,单核差距7.9%,多核差距2.3倍。这两个数字放在一起看,其实透露了很多信息。单核差距小,说明两代芯片在单核架构上的… · 2026/9/23 4:09:32

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码