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

Rook Ceph 对象存储 Zone Group 设计解读:基于 CephObjectZoneGroup CRD 的多站点编排

发布时间:2026/9/23 21:41:55 来源:云帆数科 栏目:资讯中心
Rook Ceph 对象存储 Zone Group 设计解读:基于 CephObjectZoneGroup CRD 的多站点编排
云原生存储容器编排运维【免费下载链接】rookStorage Orchestration for Kubernetes项目地址https://gitcode.com/gh_mirrors/roo/rook点击查看免费下载本篇技术指南围绕 Rook 项目设计文档design/ceph/object/zone-group.md展开深入讲解CephObjectZoneGroup自定义资源CRD在 Ceph Multisite 数据模型中的定位、创建流程、底层控制器实现以及删除/重配置等 Day 2 操作边界。读完本文你将掌握如何在 Rook Ceph 集群中通过 Kubernetes 原生声明式方式编排 zone group理解 zone group 与 realm、zone、object store 的依赖关系并能借助 Rook toolbox 手工完成 zone group 的删除与管理。Ceph Multisite 数据模型中的 Zone GroupZone Group 是 Ceph Multisite多站点数据模型中的二级抽象。根据 Rook 的 Ceph Multisite Overview 文档其数据模型可归纳为一个集群拥有一个或多个realm领域realm 横跨一个或多个集群一个 realm 拥有一个或多个zone group且必须有一个 master zone group一个 zone group 拥有一个或多个zone且必须有一个 master zone一个 zone group 横跨一个或多个集群为各 zone 的对象 ID 定义命名空间zone group 的元数据会复制到 realm 内的其他 zone groupzone 属于单个集群zone 数据与元数据复制到 zone group 内其他 zone。从 Rook 的视角看CephObjectZoneGroup资源正是对上述数据模型中 zone group 实体的 Kubernetes 化映射。在 Ceph 多站点体系中zone group 承担着隔离与同步边界的双重职责它既是 realm 内部进行元数据复制的单元也是对象 ID 命名空间的划分者。前置条件创建CephObjectZoneGroup前需要满足已经部署好一个运行正常的 Rook Ceph 集群理想情况下集群中已经存在一个CephObjectRealm资源zone group 必须归属于某个 realm。创建 Ceph Object Zone Group配置清单存储管理员在准备为对象存储创建多站点 zone group 时需要在配置文件的metadata部分为 zone group 命名并在spec中指定该 zone group 所属的 realm。设计文档中的示例ceph-object-zone-group.yaml定义了一个名为zone-group-a的 zone groupapiVersion: ceph.rook.io/v1 kind: CephObjectZoneGroup metadata: name: zone-group-a namespace: rook-ceph spec: realm: my-realmAPI 版本说明设计文档原始示例使用ceph.rook.io/v1alpha1但当前仓库已将其提升为稳定的ceph.rook.io/v1deploy/examples/object-multisite.yaml与deploy/examples/crds.yaml中的 CRD 定义均以v1为准实际部署时请使用v1。创建该资源kubectl create -f ceph-object-zone-group.yaml创建流程StepsRook operator 监听到新的CephObjectZoneGroup资源后开始编排该资源管理员随后需要启动以下配套资源创建顺序无关紧要一个 CephObjectZone 资源其zoneGroup字段指向本 zone group 的名称一个 CephObjectStore 资源指向上述新创建的 zone 资源一个 CephObjectRealm 资源其名称与 zone group 的realm字段一致若尚未创建。当第 2 步中的资源全部就绪后operator 会在 Rook Ceph 集群中真正创建 zone group此时CephObjectZoneGroup资源进入运行状态。注意事项spec.realm中指定的 realm 名称必须与 zone group 所属的CephObjectRealm资源名称完全一致资源删除不回删集群实体当CephObjectZoneGroup资源被删除时Ceph 集群中的 zone group 并不会被自动删除必须通过 toolbox 手工清理。生产环境完整资源链示例仓库中的 deploy/examples/object-multisite.yaml 给出了一个可直接部署的多站点生产示例展示了 realm → zone group → zone → object store 的完整依赖链该示例要求至少 3 台带 OSD 的主机apiVersion: ceph.rook.io/v1 kind: CephObjectRealm metadata: name: realm-a namespace: rook-ceph # namespace:cluster --- apiVersion: ceph.rook.io/v1 kind: CephObjectZoneGroup metadata: name: zonegroup-a namespace: rook-ceph # namespace:cluster spec: realm: realm-a --- apiVersion: ceph.rook.io/v1 kind: CephObjectZone metadata: name: zone-a namespace: rook-ceph # namespace:cluster spec: zoneGroup: zonegroup-a metadataPool: failureDomain: host replicated: size: 3 requireSafeReplicaSize: true dataPool: failureDomain: host replicated: size: 3 requireSafeReplicaSize: true parameters: compression_mode: none bulk: true --- apiVersion: ceph.rook.io/v1 kind: CephObjectStore metadata: name: multisite-store namespace: rook-ceph # namespace:cluster spec: gateway: port: 80 instances: 1 zone: name: zone-a整个文件可通过kubectl create -f object-multisite.yaml一次性部署。其中 zone 的zoneGroup字段引用zonegroup-aobject store 的zone.name引用zone-a形成完整的引用闭环。master zone group 的自动指定设计文档指出在某个 realm 中第一个创建的CephObjectZoneGroup资源会被指定为 master zone group。这一逻辑在源码中得到了印证详见下文控制器分析operator 在创建 zone group 时会先查询 Ceph 的 period 信息如果当前 realm 尚不存在 master zone group则会在创建命令中追加--master参数。删除与重新配置 Ceph Object Zone GroupDay 2 操作边界当前CephObjectZoneGroup资源只处理 Day 1 的初始配置对资源配置的修改不会同步反映到 Ceph 集群删除资源不会删除 Ceph 集群中的 zone group。也就是说zone group 的删除或修改必须绕过 CRD直接通过 toolbox 在 Ceph 侧完成。这一限制同样适用于 realm、zone 等 multisite 资源是当前设计有意为之的边界相关说明见 Ceph Multisite Overview 的未来设计路线。通过 Toolbox 删除 Zone GroupRook toolbox 可以通过radosgw-admin命令修改 Ceph Multisite 状态。在 toolbox 中执行以下命令删除 zone group# radosgw-admin zonegroup delete --rgw-zonegroupzone-group-b # radosgw-admin period update --commit注意--rgw-zonegroup参数值需替换为实际要删除的 zone group 名称删除 zone group 后必须执行period update --commit提交周期更新删除操作才会真正生效。CephObjectZoneGroup CRD 详解CephObjectZoneGroup的设置以自定义资源定义CRD形式暴露给 Rook。CRD 是 Kubernetes 原生的扩展机制Rook operator 通过 watch 该 CRD 来感知新的 zone group 资源。资源命名规则metadata.name直接成为 Ceph 集群中 zone group 的名称同时它也是--rgw-zonegroup参数的值。可配置字段CephObjectZoneGroup资源目前仅有一个核心配置字段字段类型必填说明spec.realmstring是zone group 所属 realm 的名称必须与CephObjectRealm资源的名称一致对应的 Go 类型定义位于 pkg/apis/ceph.rook.io/v1/types.go// ObjectZoneGroupSpec represents the spec of a CephObjectZoneGroup type ObjectZoneGroupSpec struct { // The name of the realm the zone group is a member of. Realm string json:realm }realm字段不带omitempty且在 CRD OpenAPI schema 中被标记为required与 deploy/examples/crds.yaml 中cephobjectzonegroups.ceph.rook.io的定义一致——缺少realm字段的资源根本无法通过 API 校验。CRD 资源特征从 deploy/examples/crds.yaml 中cephobjectzonegroups.ceph.rook.io的定义可以看到资源组ceph.rook.io作用域NamespacedkindCephObjectZoneGroup复数形式cephobjectzonegroups短名shortNamescephozg可用kubectl get cephozg快捷查询提供status子资源kubectl默认输出Phase取自.status.phase与Age两列status支持phase、observedGeneration、conditions等字段供控制器回报协调进度。控制器工作流与源码级原理zone group 的编排逻辑由pkg/operator/ceph/object/zonegroup/目录下的控制器实现从源码结构看其 reconcile 流程是一个典型的依赖就绪检查 → 幂等创建模式。资源校验pkg/operator/ceph/object/zonegroup/zonegroup.go中的validateZoneGroup对资源做前置校验任何一项缺失都会导致协调失败并进入ReconcileFailed状态func validateZoneGroup(u *cephv1.CephObjectZoneGroup) error { if u.Name { return errors.New(missing name) } if u.Namespace { return errors.New(missing namespace) } if u.Spec.Realm { return errors.New(missing realm) } return nil }Reconcile 主流程pkg/operator/ceph/object/zonegroup/controller.go 中的reconcile方法按以下顺序执行拉取资源从 Kubernetes API 读取CephObjectZoneGroup实例若已带删除时间戳则直接返回删除 CR 不触发任何 Ceph 侧操作集群就绪检查通过IsReadyToReconcile确认存在且健康的CephCluster否则等待重入队校验 spec调用validateZoneGroup确认 ObjectRealm 资源存在reconcileObjectRealm如果spec.realm对应的CephObjectRealm不存在控制器会以10 秒间隔重新入队waitForRequeueIfObjectRealmNotReady等待 realm 资源先就绪确认 Ceph 集群中 realm 已创建reconcileCephRealm执行radosgw-admin realm get --rgw-realmrealm若返回 ENOENT 同样等待重入队创建 Ceph zone groupcreateCephZoneGroup成功后更新 status 为Ready并写入observedGeneration。master zone group 的判定逻辑createCephZoneGroup通过以下步骤实现首个 zone group 自动成为 master的设计执行radosgw-admin period get --rgw-realmrealm解析输出中的master_zonegroup字段对应decodeMasterZoneGroup函数若master_zonegroup为空说明该 realm 尚无 master zone group则本 zone group 标记为 master执行radosgw-admin zonegroup get若 zone group 已存在则幂等返回若不存在执行radosgw-admin zonegroup create并仅在标记为 master 时追加--master参数。这一逻辑保证了同一 realm 内只有一个 master zone group与 multisite 数据模型中一个 realm 有一个 master zone group的约束一致。控制器测试验证pkg/operator/ceph/object/zonegroup/controller_test.go 通过四个阶段的 mock 场景完整覆盖了控制器的行为测试 1无 CephCluster 时协调失败并请求重入队测试 2集群存在但未就绪时请求重入队测试 3集群就绪但缺少CephObjectRealm时返回错误并重入队对应流程第 4 步的依赖检查测试 4集群与 realm 均已就绪时协调成功且不重入队验证了realm → zone group的完整成功路径。测试中使用的realmGetJSON、periodGetJSON、zoneGroupGetJSON等 fixture 还揭示了 Ceph 侧 zone group 的 JSON 结构如is_master、master_zone、zones、placement_targets、default_placement等字段有助于理解radosgw-admin zonegroup get的返回内容。对象存储对 zone group 的引用链当CephObjectStore配置了zone字段时即多站点模式pkg/operator/ceph/object/objectstore.go 会沿着store → zone → zone group → realm的引用链逐级向上查找资源通过CephObjectZoneGroups(namespace).Get(ctx, zone.Spec.ZoneGroup, ...)读取 zone group再通过CephObjectRealms(namespace).Get(ctx, zonegroup.Spec.Realm, ...)读取 realm之后执行radosgw-admin zonegroup get/modify等命令将 object store 的 endpoint 注册到 zone group 中。这意味着即使 zone group 资源先于 store 创建只要在 store 创建前 zone group 已就绪整个引用链就能正确闭合这也解释了设计文档中资源创建顺序无关紧要的结论——因为控制器会以重入队机制等待依赖资源就绪。总结与最佳实践场景推荐做法新建多站点 realm依次创建CephObjectRealm→CephObjectZoneGroup→CephObjectZone→CephObjectStore顺序不强制控制器会自动等待依赖从其他集群拉取 realm创建带pull.endpoint的CephObjectRealm再创建对应的 zone group、zone 与 store详见 CephObjectRealm 设计文档查询 zone group 状态kubectl get cephozg -n rook-ceph使用 CRD 短名或查看.status.phase删除 zone group通过 toolbox 执行radosgw-admin zonegroup delete与period update --commit删除 CR 不会级联删除 Ceph 侧实体修改 zone group 配置当前版本不支持 Day 2 更新需通过 toolbox 手工调整需要特别强调的边界是CRD 删除 ≠ 实体删除。zone group 的删除与修改是安全敏感操作Rook 刻意将其保留给 toolbox避免误删导致数据丢失。在规划多站点拓扑时建议先完整阅读 Ceph Multisite Overview、Zone 设计文档 与 Realm 设计文档再结合本指南操作以形成对 realm / zone group / zone / object store 四层模型的完整认知。赞分享云原生存储容器编排运维【免费下载链接】rookStorage Orchestration for Kubernetes项目地址https://gitcode.com/gh_mirrors/roo/rook点击查看免费下载相关推荐Rook 对象多站点架构之 CephObjectZoneGroup CRD 详解Zone Group 的创建、配置与底层实现Rook 对象多站点架构之 CephObjectZoneGroup CRD 详解Zone Group 的创建、配置与底层实现 本文围绕 Rook 提供的 Ce云原生存储容器编排运维Rook CephObjectZone CRD 完全指南为 Ceph 对象存储多站点复制配置 ZoneRook CephObjectZone CRD 完全指南为 Ceph 对象存储多站点复制配置 Zone CephObjectZone 是 Rook 提供的三类云原生存储容器编排运维Rook CephObjectStore CRD 完全指南在 Kubernetes 上配置 Ceph 对象存储RGWRook CephObjectStore CRD 完全指南在 Kubernetes 上配置 Ceph 对象存储RGW 本篇指南以 Rook 仓库中的 Ce云原生存储容器编排运维上一篇YOLOv8-Face未来 roadmap即将推出的5大新功能预览下一篇wagmi React Hook 深度指南useTransactionReceipt 交易收据查询创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

QUANTAXIS Docker 部署完全指南:从零安装到 qa-service 一键拉起量化环境
QUANTAXIS Docker 部署完全指南:从零安装到 qa-service 一键拉起量化环境

金融科技后端数据分析 【免费下载链接】QUANTAXIS QUANTAXIS 支持任务调度 分布式部署的 股票/期货/期权 数据/回测/模拟/交易/可视化/多账户 纯本地量化解决方案 项目地址: https://gitcode.com/gh_mirrors/qu/QUANTAXIS 点击查看 免费下载 QUANTAXIS 是一个纯本地… · 2026/9/23 21:41:48

PINN物理信息神经网络入门:用PyTorch求解热方程的完整实战
PINN物理信息神经网络入门:用PyTorch求解热方程的完整实战

简介:面向科学计算与深度学习交叉领域的Python实践包,以PINN(物理信息神经网络)为核心,展示如何将物理定律嵌入神经网络损失函数来求解微分方程。资源覆盖Euler Beam、扩散方程、Poisson方程、圆域Laplace方程、Lorenz… · 2026/9/23 21:41:48

Java模拟话单数据并写入billing.txt:字段设计、文件IO与校验技巧
Java模拟话单数据并写入billing.txt:字段设计、文件IO与校验技巧

1. 话单任务拆解:先搞清楚要交付什么这个任务看起来很像大学Java课程里“文件IO”那一章的课后作业:构造出多个话单,每个话单里包含主叫号码、被叫号码、通话时长、通话时间,然后把多个话单持久化到文件里,文件名固定叫… · 2026/9/23 21:41:48

10吨锅炉配多大的脱硫塔?风量、直径、高度怎么算
10吨锅炉配多大的脱硫塔?风量、直径、高度怎么算

开篇结论:脱硫塔选多大,不是看感觉,是看两个数:烟气量定塔径,入口SO₂浓度定塔高和层数。1蒸吨锅炉约2500–3500 m/h烟气,10吨约25000–35000 m/h,参考塔径2.0–2.6米。浓度高就加喷淋层。1. 塔… · 2026/9/23 22:20:29

RedwoodJS 教程实战:从 Prisma 建模到 Service 测试,为博客添加完整评论功能
RedwoodJS 教程实战:从 Prisma 建模到 Service 测试,为博客添加完整评论功能

RedwoodJS 教程实战:从 Prisma 建模到 Service 测试,为博客添加完整评论功能 【免费下载链接】redwood RedwoodGraphQL 项目地址: https://gitcode.com/gh_mirrors/re/redwood 本篇技术指南以 RedwoodJS 官方教程第 6 章为核心,完整演… · 2026/9/23 22:20:17

脱硫塔和洗涤塔有什么区别?六种废气处理塔一张表分清
脱硫塔和洗涤塔有什么区别?六种废气处理塔一张表分清

开篇结论:脱硫塔专治锅炉烟气SO₂,洗涤塔是通用主力;碱洗塔治酸性废气,酸洗塔治碱性废气,水洗塔洗可溶气体,喷淋塔是统称。六种废气塔分不清?一张表帮你选对。1. 六塔对比表名称原理主要处理对象… · 2026/9/23 22:20:04

旅游景点情感分析:细粒度属性级建模与BERT微调实践
旅游景点情感分析:细粒度属性级建模与BERT微调实践

简介:本资源是一套面向计算机专业本科生的毕业设计实战项目,聚焦旅游景点评论的细粒度情感分析任务,适用于Python Web开发、自然语言处理与数据库应用等课程实践或毕设选题参考。项目基于Django框架构建Web系统,集成RNCC情感分析模… · 2026/9/23 22:19:58

117 Kubernetes部署Agent服务
117 Kubernetes部署Agent服务

117 Kubernetes部署Agent服务 那晚的告警到现在还记得,新上线的采集Agent在测试集群里一会儿Running一会儿CrashLoopBackOff,kubectl logs抓出来就一行“Failed to create Kubernetes client: can’t create rest client: dial tcp: lookup kube-apiserver on 10.96.0.10:53… · 2026/9/23 22:19:58

119、Agent的配置管理与动态化
119、Agent的配置管理与动态化

119、Agent的配置管理与动态化 那晚线上告警响得人头皮发麻。一个负责代码审查的Agent,突然开始对每一行 print 都提出“请使用日志框架”的整改意见,连测试文件都不放过。我拉出日志,发现它加载的规则版本号还停留在三天前——可我明明昨天才在配置中心把这条规则下架了。… · 2026/9/23 22:19:52

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

了解更多?预约专属演示

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

企业微信二维码