Rook CephObjectZone 深度解析在 Kubernetes 中原生管理 Ceph Multisite Zone 的完整指南【免费下载链接】rookStorage Orchestration for Kubernetes项目地址: https://gitcode.com/gh_mirrors/roo/rook本指南以 Rook 仓库中的 zone 设计文档 为核心系统讲解 CephObjectZone 自定义资源CRD如何将 Ceph Multisite 数据模型中的 zone 抽象为 Kubernetes 原生对象涵盖 zone 的创建、跨集群同步pull realm、删除与主 zone 切换以及元数据池/数据池与 RADOS namespace 的配置。读完本文你将能够独立完成 Rook Ceph 集群上 multisite zone 的规划、部署与故障处理并理解 operator 在底层执行radosgw-admin命令的完整调用链。前置条件与数据模型定位在创建 CephObjectZone 之前需要满足以下前提一个已经运行正常的 Rook Ceph 集群参见 quickstart理想情况下应已预先创建好 ceph-object-realm 和 ceph-object-zone-group 两个资源。从设计层面看本文描述的 CephObjectZone 资源对应的是 Ceph Multisite 数据模型 中的zone实体。在 Ceph 的层级结构中realm 包含多个 zone group每个 zone group 包含多个 zone而 zone 是实际承载 RGW 数据元数据池与数据池与复制流量的单元。Rook 通过 CephObjectZone 这个 CRD让存储管理员可以像使用kubectl管理其他 Kubernetes 资源一样管理 Ceph 中的 zone。版本说明设计文档中的示例使用ceph.rook.io/v1alpha1API 版本而当前仓库中正式发布的 CRD 示例使用ceph.rook.io/v1见 ceph-object-zone-crd.md 与 object-multisite.yaml下文统一采用v1。创建 Ceph Object Zone配置要点当存储管理员准备为对象存储创建 multisite zone 时需要在配置文件的metadata中为 zone 命名——资源名就是 zone 名在spec.zoneGroup中指定该 zone 所属的 zone group为 zone 配置元数据池metadataPool与数据池dataPool。关于 zone 的端点endpoint与主 zone有以下关键规则主 zone 自动确定在同一个 zone group 中创建的第一个 zone 会被自动指定为 Ceph 集群中的 master zone端点默认值如果没有指定customEndpointszone 的端点会被设置为与 CephObjectStore 对应的 Kubernetes Service 的 DNS 地址和端口端点覆盖如果指定了customEndpoints这些自定义端点将成为该 zone 的唯一端点来源替换掉 CephObjectStore 自动添加的任何 Service 端点。完整示例以下ceph-object-zone.yaml与设计文档示例一致创建了一个名为zone-a的 zone它属于zone-group-b元数据池采用 3 副本复制、故障域为 host数据池采用 62 纠删码、故障域为 deviceapiVersion: ceph.rook.io/v1 kind: CephObjectZone metadata: name: zone-a namespace: rook-ceph spec: zoneGroup: zone-group-b metadataPool: failureDomain: host replicated: size: 3 dataPool: failureDomain: device erasureCoded: dataChunks: 6 codingChunks: 2 customEndpoints: - http://zone-a.fqdn preservePoolsOnDelete: true应用该配置kubectl create -f ceph-object-zone.yamlOperator 的执行步骤Rook operator 通过 zone 控制器 监听到新的 CephObjectZone 资源后开始执行协调reconcile逻辑先为资源添加 finalizer、初始化状态字段随后校验 zone 配置validateZoneCR再查找同命名空间下的 CephObjectZoneGroup 资源以获取其所属 realm 名称在 Ceph 集群侧确认 zone group 已存在后operator 会先为 zone 创建元数据池与数据池再通过radosgw-admin zone create创建 zone最后提交配置变更period update --commit协调完成后zone 的status.phase会被置为 ReadyobservedGeneration同步更新。创建 CephObjectZone 后管理员还应当按需启动以下配套资源三者之间创建顺序无关紧要一个引用该 zone 的 ceph-object-store一个与zoneGroup字段同名的 ceph-object-zone-group如果尚未创建一个与 zone group 配置中realm字段同名的 ceph-object-realm如果尚未创建。只有当上述资源全部就绪后operator 才会在 Rook Ceph 集群上真正创建 zoneCephObjectZone 资源随即进入运行状态。仓库中现成的多资源示例可直接使用object-multisite.yaml 依次定义了 realm-a、zonegroup-a、zone-a 与 multisite-store一条命令即可全部创建kubectl create -f object-multisite.yaml注意事项spec.zoneGroup中填写的 zone group 名称必须与该 zone 所属的 ceph-object-zone-group 资源名称一致删除 CephObjectZone 资源并不会删除 Ceph 集群中的 zonezone 的删除必须通过 toolbox 手工执行详见下文一个 ceph-object-zone 下可以挂载任意数量的 ceph-object-store。从另一个 Ceph 集群同步数据时创建 Zone当存储管理员希望把另一个已配置 multisite 的 Ceph 集群主集群的数据同步到 Rook Ceph 集群拉取集群时拉取集群会在主集群的 zone group 中拥有一个新建的 zone。完整流程如下首先必须创建 ceph-object-pull-realm 资源从主集群拉取 realm 信息需要主集群 master zone 的端点以及系统用户的 access key / secret key详见 ceph-object-multisite.md配置好 pull realm 之后创建 CephObjectZone最后创建一个引用该 zone 的 ceph-object-store。当 ceph-object-store 配置到该 zone 后所有 Ceph multisite 资源都处于运行状态两个集群之间的数据便开始自动同步。删除与重配置 Ceph Object Zone重配置的限制目前创建 CephObjectZone 资源时不处理 zone 的配置更新。也就是说对已创建 zone 的 CR 进行字段修改不会自动反映到 Ceph 集群后端这与 multisite 指南中关于 zone group、realm 的行为一致Changes made to the resources configuration or deletion of the resource are not reflected on the Ceph cluster见 ceph-object-multisite.md。如果确实需要修改 zone 配置应通过 toolbox 中的radosgw-admin完成。删除行为与 preservePoolsOnDelete默认情况下CephObjectZone 被删除时支撑该 zone 的池不会从 Ceph 集群中删除如果显式将preservePoolsOnDelete设为false则池会随 zone 一起从 Ceph 集群删除只有当引用该 zone 的所有 CephObjectStore 都被删除后CephObjectZone 才会被移除。从源码看删除协调逻辑位于 deleteCephObjectZone删除前会通过 CephObjectZoneDependentStores 遍历同命名空间下所有 CephObjectStore凡是spec.zone.name等于本 zone 名的 store 都会被记为依赖项只要依赖非空删除就会被 finalizer 阻塞并持续重试ReportDeletionBlockedDueToDependents。只有当依赖清空后才会执行zonegroup remove、按需删除池、再执行zone delete并移除 finalizer。删除 multisite 配置中的 CephObjectStore当删除一个处于 multisite 配置中的 CephObjectStore 时根据其角色不同Rook 的行为如下store 属于没有其他对等节点的 master zone这种情况与在非 multisite 配置下删除 store 基本一致Rook 会在删除前检查依赖项store 属于还有其他对等节点的 master zoneRook 会直接报错并提示用户先手工将另一个 zone 设为 master zone前提是该 zone 已备份完所有数据store 是非 master 对等节点Rook 不检查依赖项因为假定 master zone 中已有一份全部用户数据的副本。通过 Toolbox 删除 ZoneRook toolbox 可以通过radosgw-admin命令修改 Ceph Multisite 状态toolbox 的启动方式参见 ceph-toolbox.md 与 toolbox.yaml。场景一zone group 中只有一个 zone直接删除 zone 并提交 period# radosgw-admin zone rm --rgw-zonezone-z # radosgw-admin period update --commit场景二zone group 中有多个 zone。此时必须谨慎处理 master zone 的变更先阅读 Ceph 官方关于修改元数据主 zone的文档multisite 章节的 Changing the Metadata Master Zone 小节再依次把 zone 从 zone group 中移除、删除 zone# radosgw-admin zonegroup rm --rgw-zonezone-z # radosgw-admin period update --commit # radosgw-admin zone rm --rgw-zonezone-z # radosgw-admin period update --commit通过 Toolbox 修改 Master Zone与删除 zone 类似Rook toolbox 也可以修改 zone group 中的 master zone# radosgw-admin zone modify --rgw-zonezone-z --master # radosgw-admin zonegroup modify --rgw-zonegroupzone-group-b --master # radosgw-admin period update --commitCephObjectZone CRD 详解ceph-object-zone 的配置通过自定义资源定义CRD暴露给 RookCRD 是 operator 监听新资源的 Kubernetes 原生机制。metadata中提供的资源名称即 zone 的名称。可配置字段CephObjectZone.spec的 Go 类型定义见 pkg/apis/ceph.rook.io/v1/types.go核心字段如下zoneGroup该 zone 所属的 zone group 名称必须与 zone group CRD 资源的名称一致ObjectZoneSpec.ZoneGroup类型string必填customEndpoints指定接受该 zone multisite 复制流量的端点列表[]string必要时可包含端口例如https://my-object-store.my-domain.net:443。需要注意如果某个 CephObjectStore 的端点未列入该列表该 store 的 gateway 将不会收到 multisite 复制数据。多数 multisite 部署跨越多个 Kubernetes 集群默认的 ClusterIP Service 端点通常不可用此时需要为该 zone 创建自定义 Ingress 资源并把 Ingress 端点加入此列表若多个 store或单个 store 多个端点只把用于复制流量的端点加入列表即可。若将customEndpoints更新为空列表Rook operator 会自动把 CephObjectStore 的 Service 端点加回 Ceph 内部配置preservePoolsOnDelete为true时CephObjectZone 被删除后支撑它的池依然保留这是防止数据意外丢失的安全措施。默认值为truekubebuilder 注解kubebuilder:defaulttrue即使不指定也视为true。第二个完整示例设计文档中的zone-bapiVersion: ceph.rook.io/v1 kind: CephObjectZone metadata: name: zone-b namespace: rook-ceph spec: zoneGroup: zone-group-b metadataPool: failureDomain: host replicated: size: 3 dataPool: failureDomain: device erasureCoded: dataChunks: 6 codingChunks: 2 customEndpoints: - http://rgw-a.fqdn preservePoolsOnDelete: true池Pools配置池是 zone 内对象存储的后端数据存储Rook 会以对 zone 私有的特定命名创建它们池名形如$ZONE_NAME.rgw.control、$ZONE_NAME.rgw.meta、$ZONE_NAME.rgw.log、$ZONE_NAME.rgw.buckets.index、$ZONE_NAME.rgw.buckets.non-ec、$ZONE_NAME.rgw.buckets.data参见 ceph-object-multisite.md。只要在 object-store 的配置中指定了zone配置项该 store 就会使用 ceph-zone 配置中定义的池。池配置的规则池可以使用 Pool CRD 支持的全部设置其底层 schema 与 object store CRD 中metadataPool/dataPool下的 schema 相同所有元数据池使用相同设置而数据池可以使用独立设置元数据池必须使用复制replicated模式数据池可以使用复制或纠删码erasure coded模式——这也与 ceph-object-zone-crd.md 中的描述一致示例中的配置要求集群至少有三个主机size: 3和至少三个设备6 data 2 coding chunks 所在设备。metadataPool: failureDomain: host replicated: size: 3 dataPool: failureDomain: device erasureCoded: dataChunks: 6 codingChunks: 2当 ceph-object-zone 被删除时支撑该 zone 的池会像 zone 本身一样保留下来同样是防数据丢失的安全措施。与删除 zone 一样池的移除也必须通过 toolbox 手工完成。手工删除数据池的命令示例池名必须重复两次ceph osd pool rm zone-a.rgw.buckets.data zone-a.rgw.buckets.data --yes-i-really-really-mean-itRADOS Namespace 支持radosNamespaces 特性同样适用于 ceph-object-zone CRD。当多个 store/zone 需要共享底层池时可以通过sharedPools段引用已有的元数据池与数据池并指定 RADOS namespace。设计文档中的示例如下apiVersion: ceph.rook.io/v1 kind: CephObjectZone metadata: name: zone-b namespace: rook-ceph spec: zoneGroup: zone-group-b sharedPools: metadataPoolName: rgw-meta-pool dataPoolName: rgw-data-pool preserveRadosNamespaceDataOnDelete: true注设计文档中该示例写作radosNamespaces字段而当前仓库ObjectZoneSpec中的实际字段名为sharedPoolsObjectSharedPoolsSpec见 types.go使用时以仓库实际 schema 为准。从源码看zone 控制器在创建 zone 之后会调用ConfigureSharedPoolsForZone为 zone 配置 RADOS namespace并在创建池之前通过IsNeedToCreateObjectStorePools判断是否确实需要新建池当配置了共享池时跳过池的创建相关逻辑见 zone/controller.go 与 shared_pools.go。底层实现Operator 的 Zone 协调链路理解源码有助于排查 multisite 部署问题以下是 zone 控制器ceph-object-zone-controller的关键实现细节主 zone 判定创建 zone 前控制器先执行radosgw-admin zonegroup get并解析 JSON若 zone group 的master_zone字段为空说明该 zone 将是第一个 zone随后在radosgw-admin zone create命令中追加--master参数见 createZoneIfNotExists幂等创建若radosgw-admin zone get返回成功zone 已存在控制器不会重复创建但会比较 zone group JSON 中的端点列表与spec.customEndpoints若端点有变更则通过JoinMultisite更新--endpoints依赖与安全删除删除路径会先检查依赖 store、判断 zone 是否为 mastermaster zone 无法从 zone group 中移除zonegroup remove仅对非 master zone 执行删除池会先从 zone JSON 中解析domain_root提取池前缀decodePoolPrefixfromZone再按前缀批量删除测试保障仓库在 controller_test.go 与 dependents_test.go 中分别覆盖了 zone 协调流程与依赖 store 检测可作为理解行为边界的参考。实战小结创建顺序灵活zone 与 store、zone group、realm 的创建顺序无关但 zone group 与 realm 必须先就绪operator 才会真正在 Ceph 侧创建 zone主 zone 是第一个 zone主 zone 的删除与变更需要格外谨慎跨集群同步时 master zone 的端点必须可被拉取集群解析删除是两段式的CR 删除 ≠ Ceph 侧 zone 删除池默认保留真正的 zone/池清理必须通过 toolbox 的radosgw-admin完成端点决定复制流量跨集群场景务必通过 Ingress 暴露 RGW 端点并写入customEndpoints否则对等集群无法向该 zone 推送复制数据。如需进一步了解 realm 与 zone group 的配置可参阅 ceph-object-realm-crd.md、ceph-object-zonegroup-crd.md 以及完整的 ceph-object-multisite.md 操作指南。【免费下载链接】rookStorage Orchestration for Kubernetes项目地址: https://gitcode.com/gh_mirrors/roo/rook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考