3. Rook Operator 架构:核心组件、CRD 资源与 OSD 管理

Rook Operator 是 Rook 控制面的核心,它通过 Kubernetes 原生的 Operator 模式,将 Ceph 集群的部署、配置、扩缩容和故障恢复等运维操作自动化。理解 Operator 的架构是掌握 OSD 替换与数据迁移的基础。

3.1 Rook Operator 核心组件

Rook Operator 由一组协同工作的控制器和组件构成,它们运行在 Kubernetes 集群中,共同管理 Ceph 集群的生命周期。

组件名称 功能描述 关键职责
Rook Operator 主控制器 Pod,负责协调所有 CRD 资源 监听 CRD 变更、创建/更新/删除子资源、驱动集群达到期望状态
Rook Agent 运行在每个 Kubernetes 节点上的 DaemonSet 管理节点本地存储设备(磁盘发现、分区、挂载),为 OSD 提供底层存储
Rook Discover 可选的 DaemonSet,用于自动发现节点上的可用存储设备 扫描节点磁盘,将设备信息上报给 Operator,辅助自动化 OSD 部署
Ceph Daemon 控制器 Operator 内部的子控制器,管理各类 Ceph 守护进程 分别管理 MON、MGR、OSD、MDS、RGW 等组件的 Deployment/StatefulSet
配置映射与 Secret 控制器 管理 Ceph 集群的配置和认证信息 生成并同步 ceph.conf、keyring、dashboard 证书等敏感配置
架构要点: Rook Operator 遵循“声明式 API + 调谐循环”模式。用户通过修改 CRD 资源声明期望状态,Operator 持续对比当前状态与期望状态,并执行必要的操作(如创建 Pod、更新配置、触发数据迁移)来消除差异。

3.2 核心 CRD 资源:CephCluster 与 CephOSD

Rook 通过自定义资源定义(CRD)扩展 Kubernetes API。以下两个 CRD 是管理 Ceph 存储集群和 OSD 生命周期的核心。

3.2.1 CephCluster

CephCluster 是集群级别的顶级资源,定义了整个 Ceph 存储集群的配置。Operator 根据此 CRD 创建 MON、MGR、OSD 等所有组件。

apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  dataDirHostPath: /var/lib/rook
  mon:
    count: 3
    allowMultiplePerNode: false
  mgr:
    count: 2
  storage:
    useAllNodes: true
    useAllDevices: false
    config:
      databaseSizeMB: "1024"
      journalSizeMB: "1024"
    nodes:
    - name: "worker-1"
      devices:
      - name: "sdb"
      - name: "sdc"
    - name: "worker-2"
      devices:
      - name: "sdb"
      - name: "sdc"
  network:
    provider: host
  dashboard:
    enabled: true
    ssl: true

3.2.2 CephOSD

CephOSD 是 OSD 级别的资源,代表一个具体的 OSD 守护进程及其关联的存储设备。Operator 通过管理 CephOSD 资源来实现 OSD 的创建、删除、替换和迁移。

apiVersion: ceph.rook.io/v1
kind: CephOSD
metadata:
  name: osd-0
  namespace: rook-ceph
spec:
  # OSD 所属的 CephCluster 引用
  clusterName: rook-ceph
  # 节点名称
  nodeName: worker-1
  # 设备路径
  devicePath: /dev/sdb
  # OSD 配置
  config:
    osdJournalSize: "1024"
    osdMemoryTarget: "4GB"
  # 状态管理
  status:
    phase: Active
CRD 关系: CephCluster 是父资源,CephOSD 是子资源。当 CephCluster 中定义了存储节点和设备后,Operator 会自动创建对应的 CephOSD 资源。在 OSD 替换场景中,通常直接操作 CephOSD 资源或通过 CephCluster 的存储配置变更来触发。

3.3 Operator 如何管理 OSD

OSD 管理是 Rook Operator 最核心的职责之一,涉及从设备发现到数据迁移的完整生命周期。下图展示了 Operator 管理 OSD 的核心流程。

Rook Operator OSD 管理核心流程 用户/管理员 CRD 资源层 CephCluster / CephOSD / CephBlockPool Rook Operator 调谐循环 监听 CRD 变更 → 对比当前状态 → 执行操作 子控制器组 OSD 控制器 MON 控制器 MGR 控制器 MDS 控制器 OSD 创建/删除 设备准备、Pod 调度 OSD 替换/迁移 数据回填、权重调整 配置更新 ceph.conf、密钥轮换 OSD 控制器是替换流程的核心:它负责调用 Ceph 工具执行数据迁移,并更新 CRD 状态

3.4 OSD 管理的关键操作流程

Operator 管理 OSD 的过程可以分解为以下几个关键步骤,这些步骤构成了自动化 OSD 替换与数据迁移的基础。

  1. 设备发现与准备:Rook Agent 或 Discover 组件扫描节点磁盘,将可用设备信息上报。Operator 根据 CephCluster 中的 storage 配置,决定哪些设备用于 OSD。
  2. OSD 资源创建:Operator 为每个选中的设备创建一个 CephOSD CRD 资源,并设置初始状态为 Provisioning。
  3. OSD 守护进程启动:OSD 控制器监听到新的 CephOSD 资源后,执行以下操作:
    • 在目标节点上准备设备(分区、格式化、挂载)。
    • 创建 OSD 的 Deployment 或 DaemonSet,启动 ceph-osd 守护进程。
    • 将 OSD 加入 Ceph 集群的 CRUSH Map。
    • 更新 CephOSD 状态为 Active。
  4. OSD 状态监控与故障检测:Operator 持续监控 OSD Pod 的运行状态和 Ceph 集群的健康指标。当检测到 OSD 故障(如磁盘损坏、Pod 崩溃)时,触发自动修复流程。
  5. OSD 替换与数据迁移:在替换场景中,Operator 执行以下步骤:
    • 将故障 OSD 标记为 out,触发 Ceph 集群自动数据回填。
    • 等待数据迁移完成后,销毁旧的 OSD Pod 和 CephOSD 资源。
    • 根据新的设备信息,创建新的 CephOSD 资源,启动新的 OSD 守护进程。
    • 将新 OSD 加入 CRUSH Map,并调整权重以平衡数据分布。
关键注意事项: OSD 替换过程中,数据迁移的进度和集群性能会相互影响。Operator 默认使用 Ceph 的 osd_max_backfills 和 osd_recovery_max_active 参数控制回填速度。在生产环境中,建议在变更门禁中设置合理的限速策略,避免因数据迁移导致集群性能抖动。

3.5 CRD 资源状态机

每个 CephOSD 资源都遵循一个明确的状态机,Operator 根据当前状态决定下一步操作。理解这个状态机有助于诊断 OSD 管理问题。

状态 说明 Operator 行为
Provisioning OSD 正在准备中 执行设备准备、创建 Pod
Active OSD 正常运行 监控健康状态,执行常规维护
Updating OSD 正在更新配置或镜像 执行滚动更新,确保服务不中断
Deleting OSD 正在被移除 触发数据迁移,等待完成后销毁资源
Failed OSD 出现不可恢复的错误 触发告警,等待人工介入或自动替换
运维建议: 在自动化 OSD 替换门禁中,应重点监控 Deleting 和 Provisioning 状态的持续时间。如果某个 OSD 长时间处于 Deleting 状态,说明数据迁移可能受阻,需要检查集群健康状态或调整回填参数。