云原生存储容器编排运维【免费下载链接】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),仅供参考
