news 2026/9/23 1:53:07

Rook 中的 CephRBDMirror CRD 完全指南:在 Kubernetes 中部署与配置 RBD 异步镜像守护进程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rook 中的 CephRBDMirror CRD 完全指南:在 Kubernetes 中部署与配置 RBD 异步镜像守护进程
  • 云原生
  • 存储
  • 容器编排
  • 运维

【免费下载链接】rook

Storage Orchestration for Kubernetes

项目地址:https://gitcode.com/gh_mirrors/roo/rook
点击查看免费下载

Rook 通过自定义资源定义(CRD)CephRBDMirror允许用户以声明式方式创建和更新 rbd-mirror 守护进程,从而在两个 Ceph 集群之间实现 RBD(块设备)镜像的异步复制。本文基于仓库中的 ceph-rbd-mirror-crd.md 展开,并结合 Rook 操作器源码与部署示例,系统讲解CephRBDMirror的字段含义、最小部署、完整配置示例、镜像对等体的配置方法以及底层控制器的工作机制,帮助你快速上手基于 Rook 的 RBD 跨集群灾备方案。

背景:什么是 RBD 镜像,为什么要用 CephRBDMirror

RBD 镜像是 Ceph 提供的一种块级异步复制机制:主集群(primary)中写入的 RBD 镜像数据会被持续、异步地复制到对端集群(secondary/peer),实现跨集群的数据冗余与灾难恢复。在 Kubernetes 环境中,Rook 将这一能力封装为CephRBDMirror自定义资源,操作器(rook-ceph operator)负责在集群中创建并维护 rbd-mirror 守护进程的 Deployment、Service、ConfigMap 等相关资源。

从 API 定义看,CephRBDMirror属于ceph.rook.io/v1组,并注册了短名cephrbdm,同时支持.status.phase列输出(见 pkg/apis/ceph.rook.io/v1/types.go):

// +kubebuilder:printcolumn:name="Phase",type=string,JSONPath=`.status.phase` // +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp` // +kubebuilder:subresource:status // +kubebuilder:resource:shortName=cephrbdm type CephRBDMirror struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata"` Spec RBDMirroringSpec `json:"spec"` Status *RBDMirrorStatus `json:"status,omitempty"` }

关于 RBD 镜像的用户管理、能力(capabilities)与 Ceph 层面的概念细节,请参考 Ceph 官方关于 rbd-mirroring 的文档(本文聚焦 Rook 的 CRD 用法)。

快速开始:创建一个最小 CephRBDMirror

以下是一个最简单的示例,部署 1 个 rbd-mirror 守护进程:

apiVersion: ceph.rook.io/v1 kind: CephRBDMirror metadata: name: my-rbd-mirror namespace: rook-ceph spec: count: 1

应用后,操作器会在rook-ceph命名空间内创建对应的 Deployment,副本数即count的值。仓库自带的示例文件 deploy/examples/rbdmirror.yaml 给出了可kubectl create -f直接使用的完整版本。

前置条件

  • 已按官方 Quickstart guide 创建好一个可用的 Rook Ceph 集群;
  • 集群中已安装ceph.rook.io/v1的 CRD(由 Rook operator 安装,示例见 deploy/examples/crds.yaml);
  • 两个集群之间的网络可达,并且已互相交换镜像对等信息(peer token,见下文"配置镜像对等体")。

CephRBDMirror 完整配置字段解析

如果某个字段未指定,Rook 会自动使用合适的默认值。完整的可用字段定义在 pkg/apis/ceph.rook.io/v1/types.go 的RBDMirroringSpec中,同时 deploy/examples/rbdmirror.yaml 提供了带注释的实战样例。

metadata:名称与命名空间

  • name:CephRBDMirror 资源的名称,用于标识该 rbd-mirror 守护进程组,也是生成下属资源名称的依据。
  • namespace:Rook 集群所在的 Kubernetes 命名空间。操作器创建的服务、Pod 及其他资源都会放入该命名空间,通常与CephCluster同命名空间(如rook-ceph)。

spec:RBDMirror 设置

spec下各字段含义如下:

字段类型说明默认行为
countint要运行的 rbd-mirror 实例数量必填,最小值 1(CRD 校验Minimum=1
peersobject对等体配置,见下文"配置镜像对等体"可选
placementobject标准 Kubernetes 调度约束:nodeAffinitytolerationspodAffinitypodAntiAffinity,用法与 CephCluster CRD 中 daemon 的 placement 一致默认放置到任意可用节点
annotationsmap要添加到 Pod 相关对象上的键值对注解可选
labelsmap要添加到 Pod 相关对象上的键值对标签可选
resourcesobjectrbd-mirror Pod 的资源请求与限制(requests/limits)可选
priorityClassNamestring设置到 rbd-mirror Pod 上的 PriorityClass 名称可选

完整示例(取自 deploy/examples/rbdmirror.yaml):

apiVersion: ceph.rook.io/v1 kind: CephRBDMirror metadata: name: my-rbd-mirror namespace: rook-ceph # namespace:cluster spec: # 要部署的 rbd-mirror 守护进程数量 count: 1 # 存放 peer token 的 Kubernetes Secret 名称列表 # 关于 bootstrap peers 的更多细节见 Ceph 官方文档 #peers: # secretNames: # - secondary-cluster-peer # 应用到 rbd-mirror Deployment 的亲和性规则 placement: # nodeAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # nodeSelectorTerms: # - matchExpressions: # - key: role # operator: In # values: # - rbd-mirror-node # tolerations: # - key: rbd-mirror-node # operator: Exists # podAffinity: # podAntiAffinity: # 键值对形式的注解列表 annotations: # key: value resources: # requests 与 limits,例如允许 rbd-mirror Pod 使用半个 CPU 核心和 1GiB 内存 limits: memory: "1Gi" requests: cpu: "500m" memory: "1Gi" # priorityClassName: my-priority-class

字段的实际生效路径(源码视角)

从控制器实现看,spec中各个字段会直接映射到底层 Deployment 的构建过程。在 pkg/operator/ceph/cluster/rbd/spec.go 的makeDeployment中:

  • count被转换为 Deployment 的Replicasreplicas := int32(rbdMirror.Spec.Count));
  • placement通过rbdMirror.Spec.Placement.ApplyToPodSpec(&podSpec.Spec)应用到 Pod 模板;
  • annotations/labels分别应用到 Pod 模板对象元数据与 Deployment 对象元数据;
  • priorityClassName直接写入 Pod 模板的PriorityClassName
  • 同时还会自动追加不可达节点容忍(AddUnreachableNodeToleration),若集群开启了日志采集(LogCollector.Enabled)则会注入日志收集 sidecar 容器,镜像守护进程的日志文件过滤规则为*-client.rbd-mirror*

配置镜像对等体(Mirroring Peers)

rbd-mirror 守护进程本身并不直接决定"镜像哪些数据、镜像到哪里"——真正的镜像策略(peer 关系、镜像模式)是在存储池级别配置的。Rook 将 peer 配置分别挂载到两类资源上:

  • CephBlockPool:为每个块存储池单独配置镜像对等体,详见 CephBlockPool 文档 中的 mirroring 小节;
  • CephBlockPoolRadosNamespace:为池内每个 RADOS 命名空间单独配置镜像对等体,详见 CephBlockPoolRadosNamespace 文档 中的 mirroring 小节。

在 CephRBDMirror 中引用 peer Secret

CephRBDMirrorspec.peers.secretNames中列出包含 peer token 的 Kubernetes Secret 名称,操作器便会尝试将这些 Secret 中的对等信息引导(bootstrap)到守护进程。MirroringPeerSpec的定义如下(见 types.go):

// MirroringPeerSpec represents the specification of a mirror peer type MirroringPeerSpec struct { // SecretNames represents the Kubernetes Secret names to add rbd-mirror or cephfs-mirror peers SecretNames []string `json:"secretNames,omitempty"` }

对应的辅助方法HasPeers()(见 pkg/apis/ceph.rook.io/v1/mirror.go)通过检查SecretNames是否非空来判断是否存在需要连接的 peer:

// HasPeers returns whether the RBD mirror daemon has peer and should connect to it func (m *MirroringPeerSpec) HasPeers() bool { return len(m.SecretNames) != 0 }

在控制器协调流程中(见 pkg/operator/ceph/cluster/rbd/controller.go),操作器会先调用reconcileAddBootstrapPeer完成 peer 引导,再创建守护进程 Deployment。因此,如果使用池级镜像(pool mode),必须先通过CephBlockPool/CephBlockPoolRadosNamespace配置好 peer 与镜像模式,再部署或更新CephRBDMirror使守护进程接入对端集群。

在存储池上启用镜像(配套操作)

虽然CephRBDMirror只负责守护进程本身,但完整的镜像方案离不开池侧配置。在 deploy/examples/pool.yaml 中可以看到CephBlockPool的镜像与健康检查配置:

mirroring: enabled: false # 镜像模式:pool(池级)或 image(每镜像) # 更多细节见 Ceph 官方 rbd-mirroring 文档 mode: image # 指定快照的调度计划 # snapshotSchedules: # - interval: 24h # 每日快照 # startTime: 14:00:00-05:00 # 开启时上报池镜像状态 statusCheck: mirror: disabled: false interval: 60s

对应 API 类型MirroringSpec(见 types.go)支持:

  • enabled:是否启用池镜像;
  • mode:镜像模式,合法值为poolimageinit-only(CRD 枚举校验);
  • snapshotSchedules:镜像快照调度计划,SnapshotScheduleSpec包含interval(周期,如24h)、startTime(起始时间,含时区偏移,如14:00:00-05:00)、path(仅 CephFS 有效);
  • peers:池级 peer 配置。

snapshotSchedules非空时,SnapshotSchedulesEnabled()返回 true(见 pool.go),操作器会据此创建对应的快照调度。

控制器工作原理:从 CR 到运行中的守护进程

CephRBDMirror由名为ceph-rbd-mirror-controller的 controller-runtime 控制器驱动(见 pkg/operator/ceph/cluster/rbd/controller.go)。它 watch 以下对象:

  • CephRBDMirrorCR 本身(变化触发协调);
  • 由该 CR 拥有的ServiceConfigMapDeployment(owned 资源变化时通过TypedEnqueueRequestForOwner触发父对象重新协调)。

每次Reconcile的核心步骤(见 controller.go):

  1. 获取并初始化状态:拉取CephRBDMirror对象;若Status为空则初始化Cephx状态字段。
  2. 校验 spec:调用validateSpec,不合法则立即重试并上报失败状态。
  3. 等待 CephCluster 就绪:如果同命名空间的CephCluster尚未就绪,则延迟重试。
  4. 加载集群信息与版本检测:读取ClusterInfo,对比运行中与期望的 Ceph 版本;若集群正处于升级过程中(mon 版本与期望版本不一致),则等待升级完成再继续,避免在升级窗口创建守护进程(外部集群模式除外)。
  5. 引导 peerreconcileAddBootstrapPeerpeers.secretNames指向的 Secret 中的对端 token 引导进守护进程。
  6. cephx 密钥轮换检查:根据CephCluster的安全配置判断是否需要对守护进程密钥进行轮换。
  7. 创建/更新 DeploymentreconcileCreateCephRBDMirrorstartmakeDeployment,生成最终 Deployment 并应用到集群。
  8. 更新状态:将Status.Phase置为 Ready,写入ObservedGeneration与 cephx 状态。

这一流程保证了 CR 声明与集群实际状态的一致性:修改countplacementresources等字段后,操作器会自动滚动更新对应 Deployment,无需人工干预。

验证与运维建议

  • 使用kubectl -n rook-ceph get cephrbdm(或完整名cephrbdmirror)查看 CR 状态,其中Phase列反映协调结果;
  • 使用kubectl -n rook-ceph get deployment -l app=rook-ceph-rbd-mirror检查守护进程副本是否就绪;
  • 池级镜像的健康状态可通过CephBlockPoolstatusCheck.mirror(默认每 60s 上报一次)配合 Ceph 监控体系 观察;
  • 排障时可借助 Ceph toolbox 执行rbd mirror pool status <pool>查看对端状态与延迟。

小结

CephRBDMirror是 Rook 承载 RBD 跨集群异步镜像能力的核心 CRD:它以count声明守护进程规模,以placement/resources/annotations/labels/priorityClassName控制调度与资源,并通过peers.secretNames接入对端集群;而具体的镜像策略(模式、快照调度、peer 关系)由CephBlockPoolCephBlockPoolRadosNamespace在池级别配置。两者配合,即可在 Kubernetes 上构建一套声明式、可版本控制的 RBD 灾备复制方案。

  • 云原生
  • 存储
  • 容器编排
  • 运维

【免费下载链接】rook

Storage Orchestration for Kubernetes

项目地址:https://gitcode.com/gh_mirrors/roo/rook
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 1:53:04

情葬泪痕碗攻略新手避坑指南

情葬泪痕碗攻略新手避坑指南 复制来的代码跑不通,报错信息满屏红字,你盯着屏幕发呆,脑子里全是“我哪里写错了”。这种抓狂时刻,很多初学者都经历过。其实,问题往往不在逻辑,而在环境、依赖或配置细节。今天这篇 情葬泪痕碗攻略 ,就是帮你快速定位并解决这类“玄学”问题,专门写给刚入行的新人,主打一个…

作者头像 李华
网站建设 2026/9/23 1:52:52

gvim实战选型:告别教程党,直击高频面试题

gvim实战选型:告别教程党,直击高频面试题 看了一堆gvim教程还是不会写项目?别急,问题不在你笨,在于没人把 高频面试题 背后的逻辑掰碎了喂给你。很多转岗的朋友卡在配置环节,以为学了快捷键就能飞升,结果一遇到多文件编辑、代码重构就原形毕露。…

作者头像 李华
网站建设 2026/9/23 1:52:28

2026最新精细化管理总结实战项目,3步搞定代码报错

2026最新精细化管理总结实战项目,3步搞定代码报错 复制来的代码跑不通,满屏红色报错却不知从何调起?这是无数开发者在接手旧项目或参考网络教程时的噩梦。2026最新的技术生态对代码质量要求更高,传统的“试错法”调试效率极低,往往导致项目延期。…

作者头像 李华
网站建设 2026/9/23 1:52:20

3个坑让你RF下载白费功夫 一文搞懂实战真解

3个坑让你RF下载白费功夫 一文搞懂实战真解 别再说看了一堆教程还是不会写项目。 我见过太多后端同学,对着文档抄代码,结果RF下载功能上线就崩。 今天咱们不整虚的, 一文搞懂 RF下载的核心逻辑与避坑指南。 考点梳理:面试官到底在考什么 很多候选人把RF下载当成普通的文件传输,这是大误区。…

作者头像 李华
网站建设 2026/9/23 1:52:11

手写实现中国外汇交易模块,这5个坑让你少走三年弯路

手写实现中国外汇交易模块,这5个坑让你少走三年弯路 刚学会 Python 或 Java 语法,盯着屏幕发呆,心里就一个念头:语法我都背下来了,为什么还是搭不起一个像样的项目?很多刚入行的开发者,在 CSDN 等社区翻遍了教程,却依然卡在“从 Hello World…

作者头像 李华