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 动态供给。
关键设计原则: Rook Operator 遵循“Operator 模式”,所有配置变更均通过修改 CRD YAML 触发,无需手动登录 Ceph 节点执行命令。

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 的调和循环会自动执行以下步骤:

  1. 检测 Pool CRD 变更:Operator 监听 CephBlockPool 的创建/更新事件。
  2. 创建 RADOS Pool:通过 Ceph 管理套件在集群内创建对应的数据池,设置副本数、PG 数等参数。
  3. 生成 StorageClass:Operator 根据 Pool 的名称、命名空间及 spec.parameters,自动生成一个同名的 StorageClass 对象。
  4. 绑定 Provisioner:自动生成的 StorageClass 的 provisioner 固定为 rook-ceph.rbd.csi.ceph.com(块存储)或 rook-ceph.cephfs.csi.ceph.com(文件存储)。
  5. 同步参数:将 Pool 的 spec.parameters(如 imageFeatures、csi.storage.k8s.io/fstype)映射到 StorageClass 的 parameters 字段。
运维提示: 如果手动修改了自动生成的 StorageClass,Operator 会在下一次调和时将其覆盖回与 Pool CRD 一致的状态。建议始终通过修改 Pool CRD 来调整存储类参数。

4.4 架构关系图:Operator、CRD 与自动供给链路

下图展示了 Rook Operator 如何通过调和 Cluster CRD 与 Pool CRD,最终自动生成 StorageClass 并供给给 PVC 的完整链路:

Rook Operator 架构与自动供给链路 Rook Operator 架构与 StorageClass 自动供给链路 用户 / 管理员 CephCluster CRD Rook Operator (调和循环 / 监听 CRD) Ceph 存储集群 MON / OSD / MGR / MDS RADOS Pool (数据池) CephBlockPool CRD StorageClass (自动生成) PVC → PV (动态供给) 自动供给流程说明: 1. 用户创建 CephBlockPool CRD 2. Operator 在 Ceph 中创建 RADOS Pool 3. Operator 自动生成同名的 StorageClass 4. PVC 引用该 StorageClass 完成动态供给

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
避坑指南: 如果 Pool CRD 中未设置 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 会尝试重启或替换故障组件,并更新集群状态。
最佳实践: 建议将 Pool CRD 的 spec.parameters 中的 csi.storage.k8s.io/fstype 设置为业务实际需要的文件系统类型(如 ext4、xfs),避免 PVC 创建后因文件系统不匹配而需要重建。