4. Rook Operator 架构:Operator、CRD 与 StorageClass 自动创建机制
Rook Operator 是 Rook Ceph 在 Kubernetes 中的控制核心,它通过自定义资源定义(CRD)将 Ceph 的复杂配置抽象为 Kubernetes 原生的声明式对象。理解 Operator、Cluster CRD、Pool CRD 以及 StorageClass 的自动创建机制,是掌握存储组件拓扑的关键。
4.1 Rook Operator 核心组件与职责
Rook Operator 以 Deployment 形式运行在 rook-ceph 命名空间中,负责监听、调和所有 Rook 相关的 CRD 资源。其核心职责包括:
- 生命周期管理:自动部署、配置、升级 Ceph 守护进程(MON、OSD、MGR、MDS、RGW)。
- 健康监控:持续检测 Ceph 集群状态,自动替换故障组件。
- 资源调和:将用户定义的 CRD 状态(如 Pool 副本数、存储类参数)同步为 Ceph 底层配置。
- 存储类代理:根据 Pool CRD 自动生成对应的 StorageClass,实现 PVC 动态供给。
4.2 核心 CRD 体系:Cluster、Pool 与 StorageClass
Rook 定义了多个 CRD,其中 CephCluster、CephBlockPool 与自动生成的 StorageClass 构成了存储供给的主链路。下表对比了三个核心 CRD 的定位与作用域:
| CRD 名称 | API 版本 (示例) | 作用域 | 核心字段 | 自动生成行为 |
|---|---|---|---|---|
| CephCluster | ceph.rook.io/v1 |
集群级 | spec.storage, spec.mon, spec.network |
部署 MON、OSD、MGR 等基础组件 |
| CephBlockPool | ceph.rook.io/v1 |
命名空间级 | spec.replicated.size, spec.erasureCoded, spec.parameters |
在 Ceph 中创建 RADOS Pool |
| StorageClass (自动) | storage.k8s.io/v1 |
集群级 | provisioner, parameters.pool, reclaimPolicy |
由 Rook Operator 根据 Pool CRD 自动创建或同步 |
4.3 自动创建机制:从 Pool CRD 到 StorageClass
Rook Operator 实现了“声明式存储类供给”。当用户创建 CephBlockPool 资源时,Operator 的调和循环会自动执行以下步骤:
- 检测 Pool CRD 变更:Operator 监听
CephBlockPool的创建/更新事件。 - 创建 RADOS Pool:通过 Ceph 管理套件在集群内创建对应的数据池,设置副本数、PG 数等参数。
- 生成 StorageClass:Operator 根据 Pool 的名称、命名空间及
spec.parameters,自动生成一个同名的StorageClass对象。 - 绑定 Provisioner:自动生成的 StorageClass 的
provisioner固定为rook-ceph.rbd.csi.ceph.com(块存储)或rook-ceph.cephfs.csi.ceph.com(文件存储)。 - 同步参数:将 Pool 的
spec.parameters(如imageFeatures、csi.storage.k8s.io/fstype)映射到 StorageClass 的parameters字段。
4.4 架构关系图:Operator、CRD 与自动供给链路
下图展示了 Rook Operator 如何通过调和 Cluster CRD 与 Pool CRD,最终自动生成 StorageClass 并供给给 PVC 的完整链路:
4.5 典型 Pool CRD 与 StorageClass 映射示例
以下是一个生产环境中常用的 CephBlockPool 定义,以及 Operator 自动生成的对应 StorageClass:
# ceph-block-pool.yaml
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
name: replicapool
namespace: rook-ceph
spec:
replicated:
size: 3
parameters:
imageFormat: "2"
imageFeatures: "layering,fast-diff,object-map,deep-flatten,exclusive-lock"
csi.storage.k8s.io/fstype: ext4
Operator 自动生成的 StorageClass 等效 YAML 如下(无需手动创建):
# 由 Rook Operator 自动生成,无需手动编写
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block
annotations:
rook.io/operator-created: "true"
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
pool: replicapool
imageFormat: "2"
imageFeatures: layering,fast-diff,object-map,deep-flatten,exclusive-lock
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
spec.parameters,Operator 会使用默认参数生成 StorageClass。对于生产环境,建议显式指定 imageFeatures 和 fstype,避免因默认值不匹配导致 PVC 挂载失败。
4.6 多 Pool 与多 StorageClass 管理策略
在实际运维中,通常需要为不同性能或可靠性需求的业务创建多个 Pool。Rook 支持通过多个 CephBlockPool CRD 实现差异化供给:
| Pool 名称 | 副本数 | 存储介质 | 自动生成的 StorageClass 名称 | 适用场景 |
|---|---|---|---|---|
ssd-pool |
3 | SSD | rook-ceph-ssd |
高 IOPS 数据库 |
hdd-pool |
2 | HDD | rook-ceph-hdd |
日志、归档 |
ec-pool |
纠删码 (4+2) | 混合 | rook-ceph-ec |
冷数据、大文件 |
每个 Pool CRD 创建后,Operator 都会自动生成一个同名的 StorageClass。业务团队只需在 PVC 中指定对应的 StorageClass 名称,即可自动获取匹配性能的存储后端。
4.7 调和机制与故障恢复
Rook Operator 的调和循环保证了 CRD 状态与 Ceph 实际配置的最终一致性。当出现以下场景时,Operator 会自动介入:
- Pool 参数变更:修改 Pool CRD 的
spec.parameters后,Operator 会更新 Ceph Pool 配置并同步 StorageClass。 - StorageClass 被误删:如果自动生成的 StorageClass 被删除,Operator 会在下一轮调和周期(通常 30-60 秒)内重新创建。
- Ceph 集群故障:当 MON 或 OSD 宕机时,Operator 会尝试重启或替换故障组件,并更新集群状态。
spec.parameters 中的 csi.storage.k8s.io/fstype 设置为业务实际需要的文件系统类型(如 ext4、xfs),避免 PVC 创建后因文件系统不匹配而需要重建。