TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

Rook-Ceph 解说 3: rook-ceph 与 rook-ceph-cluster 1.21.1 Chart 的 values 解读

状态:草稿(2026-10-29),基于 Chart 原文,未进行实际测量。 所有值均直接从 Rook v1.21.1 标签指向的提交 09d2f0d8d883b70b30de796c4390371be725ff3b 的 deploy/charts/rook-ceph/values.yaml 与 deploy/charts/rook-ceph-cluster/values.yaml 中 读取,表格中的行号即为该文件中的行数。资源总和与容量是根据 values 和 Ceph 文档的默认值 计算得出的,未经实际测量。 TT Lab 实训集群(3 台 VM,每台 VM 拥有 17GiB 空盘)中实际运行的 Pod 和容量将在第 4 篇中确认。 编写规则:以实测数据为准,未能测量的标记为「未实测」,在原文中未找到的标记为「未确认」。

目录

1. Chart 有三个,且有安装顺序

Rook 文档(Helm Charts Overview) 介绍了 v1.21 的三个 Chart。大家通常以为「只要部署 rook-ceph 和 rook-ceph-cluster 这两个就行了」,但从 v1.20 开始,中间多了一个。

v1.21 의 Helm 차트 셋, 이 순서로 ① rook-ceph Rook 저장소 operator Deployment·CRD·RBAC ceph-csi-operator 1.1.0 (하위 차트) ② ceph-csi-drivers ceph-csi-operator 저장소 OperatorConfig Driver: rbd·cephfs 켜짐 RBAC·서비스 계정 ③ rook-ceph-cluster Rook 저장소 CephCluster 풀·파일시스템·오브젝트 스토어 StorageClass 셋(ceph-block 기본) toolbox(기본 꺼짐) ②를 빠뜨리면 서비스 계정이 없어 CSI 드라이버가 실패한다 업그레이드도 같은 순서: ① → ② → ③
图:v1.21 的 Helm Chart 三件套及各自创建的内容
顺序 Chart 来源 创建的内容
1 rook-ceph Rook 仓库 Rook operator Deployment、CRD、RBAC、子 Chart ceph-csi-operator 1.1.0
2 ceph-csi-drivers ceph-csi-operator 的 Helm 仓库,使用 Rook 调整过的 values OperatorConfig、RBD 与 CephFS Driver CR、驱动 Pod 的 RBAC
3 rook-ceph-cluster Rook 仓库 CephCluster、块池·文件系统·对象存储 CR、对应的 StorageClass、toolbox(默认关闭)

如果漏掉第 2 个,PVC 将无法绑定。 升级文档中提到,如果没有这个 Chart,就会因为缺少服务账户而导致 CSI 驱动进入失败状态, operator Chart 文档中的安装步骤也是「operator Chart → CSI 驱动 Chart → 集群」的顺序 (Ceph Operator Helm Chart, Rook Upgrades). ceph-csi-drivers 指出,如果仅使用默认值进行安装,驱动将会失败,因此文档强调必须同时加入 Rook 仓库的 deploy/charts/ceph-csi-drivers/values.yaml。该文件将驱动名称 rook-ceph.rbd.csi.ceph.com 匹配到 operator 命名空间。

helm repo add rook-release https://charts.rook.io/release
helm install --create-namespace -n rook-ceph rook-ceph rook-release/rook-ceph -f operator-values.yaml

helm repo add ceph-csi-operator https://ceph.github.io/ceph-csi-operator
helm install -n rook-ceph ceph-csi-drivers ceph-csi-operator/ceph-csi-drivers \
  -f https://raw.githubusercontent.com/rook/rook/v1.21.1/deploy/charts/ceph-csi-drivers/values.yaml

helm install -n rook-ceph rook-ceph-cluster rook-release/rook-ceph-cluster \
  --set operatorNamespace=rook-ceph -f cluster-values.yaml

命令直接复制了文档中的示例。集群 Chart 文档建议不要复制整个 values,而是创建一个 只包含需要更改的值的文件。 顺便一提,标签的 Chart.yaml 中两个 Chart 都写着 version: 0.0.1 ,因此分发时的 Chart 版本号似乎是在发布过程中附加的(未确认)。从 v1.21 开始,OCI Chart 标签中不再带有 v 。

2. rook-ceph(operator Chart)的重要参数

整个文件很短,共 245 行 (values.yaml).

键 默认值 含义与备注 行号
image.tag v1.21.1 operator 镜像 docker.io/rook/ceph L10
crds.enabled true Chart 创建并更新 CRD。 仅在首次安装时确定的警告:以后关闭可能会破坏集群 L21
resources 请求 CPU 200m、内存 128Mi,内存上限 512Mi operator Pod 资源 L24
unreachableNodeTolerationSeconds 5 当节点无法访问时,迁移 operator Pod 的等待时间。将 Kubernetes 默认的 5 分钟缩短为 5 秒 L42
currentNamespaceOnly false 是否仅监视自身命名空间的 CephCluster L45
logLevel INFO ERROR·WARNING·INFO·DEBUG L58
containerSecurityContext runAsNonRoot、UID 2016、移除所有 capability operator 容器的安全上下文 L71
allowLoopDevices false 是否在测试集群中将 loop 设备用作 OSD L78
monRunAsRoot false 是否以 root 运行 mon Pod L81
deleteUnusedCrushRules true 删除 mgr 启动后不再使用的自动生成的 CRUSH 规则 L84
csi.installCsiOperator true 安装 ceph-csi-operator 子 Chart L95
csi.cephcsi 等 7 种镜像 全部为空值 留空则使用 ceph-csi-operator 内置的镜像。仅在需要更改时填写仓库和标签 L102
csi.serviceMonitor.enabled false(开启时为 5 秒间隔) 用于 CSI 指标的 ServiceMonitor L144
enableDiscoveryDaemon false(间隔 60m) 定期查找节点上新磁盘的守护进程 L156
cephCommandsTimeoutSeconds "15" operator 调用的 ceph 命令的超时时间(秒) L161
scaleDownOperator false 当通过 GitOps 部署时,将 operator 缩减为 0 以便人工维护的开关 L169
enforceHostNetwork false 将所有 Rook Pod 置于主机网络(适用于无 CNI 环境) L213
disableDeviceHotplug false 是否关闭发现新设备时自动将其配为 OSD 的行为 L216
enableOBCWatchOperatorNamespace true OBC Provisioner 是否监视 operator 命名空间 L229
obcAllowAdditionalConfigFields "maxObjects,maxSize" OBC 用户可定义的附加字段。其余字段(桶策略、生命周期、所有者等)注释警告称具有危险性 L240
monitoring.enabled false 开启后,operator 将获得创建 ServiceMonitor 的 RBAC。前提是必须先安装 Prometheus L245

CSI 配置大部分已移出该 Chart。 过去曾在该 Chart 的 csi 下设置 provisioner 副本数、kubelet 路径、各驱动资源等 参数,但升级文档现在建议在 ceph-csi-drivers Chart 设置中查找这些参数。该 Chart 中保留的 csi 主要是关于是否安装子 Chart、镜像覆盖以及 ServiceMonitor。ceph-csi-operator 子 Chart 自身的设置写在 values 的 ceph-csi-operator 章节(L86)中。

3. rook-ceph-cluster 的外层参数

接下来是 844 行的集群 Chart (values.yaml). cephClusterSpec ),首先看外层的参数。

键 默认值 含义与备注 行号
operatorNamespace rook-ceph operator 所在的命名空间。将成为 StorageClass 的 provisioner 名称前缀 L6
configOverride 无 要追加到 ceph.conf 的内容 L16
toolbox.enabled false rook-ceph-tools Deployment。镜像与 Ceph 镜像相同。请求 128Mi、上限 1Gi L26
monitoring.enabled false Prometheus 集成。 metricsDisabled: false ,因此 mgr 的 prometheus 模块和 exporter 默认开启 L72
monitoring.createPrometheusRules false 是否创建 Ceph 告警规则(PrometheusRule) L76
cephImage quay.io/ceph/ceph:v20.2.4, allowUnsupported: false Ceph Tentacle。注释建议在生产环境中应使用形如 v20.2.4-20260818 带有日期的标签进行固定 L124
ingress.dashboard, route.dashboard 为空 通过 Ingress 或 HTTPRoute 导出仪表盘时使用 L475
cephFileSystemVolumeSnapshotClass, cephBlockPoolsVolumeSnapshotClass enabled: false 快照类。如需使用则开启 L642
csiDriverNamePrefix 为空 若留空,则以 operator 命名空间作为驱动名称前缀 L844

4. cephClusterSpec:CephCluster 本体

cephClusterSpec 直接进入 CephCluster CR 的 spec 中。集群 Chart 文档指出,该默认值「仅作示例,不太可能适合您的集群」。

键 默认值 含义与备注 行号
dataDirHostPath /var/lib/rook 存放 mon 数据和配置的主机路径。 若重新安装时未清除此目录,新集群中的 mon 将无法启动 L150
skipUpgradeChecks false 是否跳过升级前检查 L156
continueUpgradeAfterChecksEvenIfNotHealthy false 即使 PG 不健康是否也继续操作 L159
waitTimeoutForHealthyOSDInMinutes 10 等待单个 OSD 停止后达到安全状态所需的时间 L166
upgradeOSDRequiresHealthyPGs false 是否在 PG 健康时才开始升级 OSD L171
security.cephx.csi.keyType aes 注释:若节点内核低于 7.0 则需要此项 L176
mon.count 3 mon 数量。文档建议为 1 到 9 之间的奇数 L181
mon.allowMultiplePerNode false 单节点上的多个 mon。 仅限可承担数据丢失风险的测试环境 L184
mgr.count 2 一个 active,一个 standby。若为 2 则还会附加 mgr sidecar L190
mgr.modules rook 模块已关闭 注释中写明不推荐使用 rook mgr 模块 L196
dashboard.enabled·ssl true·true 仪表盘已开启,若未提供证书则使用自签证书 L201
network.connections.encryption false 传输加密。如需开启需内核 5.11 以上 L223
network.connections.compression false 传输压缩 L227
network.connections.requireMsgr2 true 关闭 msgr v1 端口(6789),仅保留 v2(3300)。需要内核 5.11 以上 L231
crashCollector.disable false 守护进程崩溃转储收集器(每个节点一个 Pod) L253
logCollector 开启,每天,最大 500M 每个守护进程的日志文件轮转 sidecar L260
cleanupPolicy.confirmation "" 见第 2 篇第 7 节。仅在删除时使用 yes-really-destroy-data L271
cleanupPolicy.sanitizeDisks quick·zero·一次性 清理磁盘的方式 L277
removeOSDsIfOutAndSafeToRemove false 是否自动移除状态为 out 且删除安全的 OSD L409
priorityClassNames mon·osd system-node-critical,mgr system-cluster-critical 当资源不足时防止被优先驱逐 L412
storage.useAllNodes true 将所有节点作为存储节点 L418
storage.useAllDevices true 将所有可用设备配为 OSD L419
storage.deviceFilter·nodes 已注释 设备名称正则表达式、按节点的设备列表 L420
disruptionManagement.managePodBudgets true 由 operator 管理 OSD·mon·RGW·MDS 的 PodDisruptionBudget L446
disruptionManagement.osdMaintenanceTimeout 30 在隔离(drain)期间通过 noout 保持故障域的时间(分钟) L449
healthCheck.daemonHealth mon 45s、osd 60s、status 60s 检查间隔。未记录 mon 的 timeout ,将使用代码默认值 10 分钟(见第 2 篇) L453

资源请求(resources)

cephClusterSpec.resources(L340)的默认值。Rook 文档指出「如果过低则只会打印警告并照常启动」,并记录了作为标准的建议 最低值(CephCluster CRD)。 从源码来看,此检查以 上限(limit) 为准,如果上限小于请求则会视为错误 (spec.go#L486-L520).

对象 请求 CPU 请求内存 内存上限 Rook 建议最小值 行号
mgr 500m 512Mi 1Gi 512MB L341
mon 1000m 1Gi 2Gi 1024MB L347
osd 1000m 4Gi 4Gi 2048MB L353
prepareosd 500m 50Mi 无(建议不设置) 无上限 L359
mgr-sidecar 100m 40Mi 100Mi 上限 100MB·请求 40MB L371
crashcollector 100m 60Mi 60Mi 60MB L377
logcollector 100m 100Mi 1Gi 未确认 L383
cleanup 500m 100Mi 1Gi 未确认 L389
exporter 50m 50Mi 128Mi 上限 128MB·请求 50MB L395
cmd-reporter 500m 100Mi 1Gi 未确认 L401

文档中指出,如果为 OSD 设置较小的内存,Rook 会将 Ceph 的 osd_memory_target 设置为相同的值。正如我们在第 1 篇中所看到的,此值的 Ceph 默认值为 4Gi,因此 Helm Chart 默认值(4Gi)与 Ceph 默认值相同。MDS 和 RGW 的资源不在这里,而是在各自的章节中(第 5 节)。

5. 块池、文件系统和对象存储的默认值

集群 Chart 默认会 分别创建这三种资源 并为每种资源附加一个 StorageClass。这个 StorageClass 不是由 Operator 创建的,而是由 Chart 模板创建的(第 2 篇第 9 节)。

cephBlockPools: ceph-blockpool 与 StorageClass ceph-block

键 默认值 备注 行
spec.failureDomain host 每个副本位于不同主机 L520
spec.replicated.size 3 三份 L522
storageClass.isDefault true 成为集群的默认 StorageClass L531
storageClass.reclaimPolicy Delete 删除 PVC 时也会删除 RBD 镜像 L532
storageClass.allowVolumeExpansion true 允许卷扩容 L533
storageClass.volumeBindingMode Immediate PVC 一创建就立即生成 L534
parameters.imageFormat "2" RBD 镜像格式 L559
parameters.imageFeatures layering 注:内核 RBD 从 5.4 版本开始支持完整功能,但默认仅为 layering L565
parameters 的六对 Secret rook-csi-rbd-provisioner, rook-csi-rbd-node 用于 provisioner·expand·publish·node-stage·modify·node-publish 的 cephx 密钥。由 Operator 创建(第 2 篇) L568
parameters."csi.storage.k8s.io/fstype" ext4 注:在将卷挂载到与 OSD 相同节点的配置中,XFS 可能会陷入死锁,因此不建议这样做 L585

模板(cephblockpool.yaml)会附加 provisioner: <operatorNamespace>.rbd.csi.ceph.com 和 pool·clusterID(集群命名空间)。

cephFileSystems: ceph-filesystem 与 StorageClass ceph-filesystem

键 默认值 备注 行
metadataPool.replicated.size 3 元数据池 L595
dataPools[0] 名称 data0, host,size 3 数据池 L597
metadataServer.activeCount 1 一个活跃的 MDS,Rook 会启动两倍数量(2个) L603
metadataServer.activeStandby true 备用 MDS 保持缓存预热状态 L604
metadataServer.resources 请求 CPU 1000m·内存 4Gi,上限 4Gi Rook 建议 MDS 内存为 4096MB 以上,并将上限设置为 mds_cache_memory_limit 相同的值 L605
storageClass.isDefault false L614
storageClass.pool data0 L617
storageClass.reclaimPolicy Delete L618

CephFilesystem 的 preserveFilesystemOnDelete 在 Chart 中不存在,因此将使用 CRD 默认值 false 。这意味着删除 CR 时也会一并删除文件系统(CephFilesystem CRD).

cephObjectStores: ceph-objectstore 与 StorageClass ceph-bucket

键 默认值 备注 行
metadataPool host,副本 size 3 桶索引等 L670
dataPool.erasureCoded K=2, M=1, host 数据池采用纠删码(Erasure Coding) L674
dataPool.parameters.bulk "true" PG 自动缩放器从一开始就分配较多的 PG(第 1 篇) L680
preservePoolsOnDelete true 即使删除 CR 也保留数据池 L681
gateway.port 80 HTTP. securePort·证书已被注释掉 L683
gateway.instances 1 一个 RGW Pod L692
gateway.resources 请求 CPU 1000m·内存 1Gi,上限 2Gi L684
storageClass ceph-bucket, Delete, region: us-east-1 provisioner 为 <클러스터 네임스페이스>.ceph.rook.io/bucket L701
ingress.enabled·route.enabled false 导出到集群外部时 L712

多站点(realm·zonegroup·zone)、对象存储用户和 EC 块池仅作为注释包含在 values 中,默认不创建(从 L743 开始)。

6. 使用默认值存在风险的地方

警告 1. useAllNodes: true + useAllDevices: true(L418, L419). 所有节点上所有可用设备都将成为 OSD 并被格式化。正如我们在第 2 篇中所看到的,虽然已挂载或带有文件系统·OSD 签名的设备会被跳过,但 没有任何签名的空磁盘会被直接拿来使用,不会进行任何询问。 目标包括为了其他用途 随意连接的磁盘以及尚未格式化的磁盘。CephCluster 文档指出 useAllDevices 「除非是在没有擦除设备风险的极其受控的环境中,否则不建议使用」,并建议在生产环境中 使用 useAllNodes: false 来明确指定节点。请至少填写 deviceFilter(例如: 仅匹配实训虚拟机空磁盘名称的正则表达式)或每个节点的 devices 。

警告 2. ceph-block 的 isDefault: true(L531). 在安装的瞬间, ceph-block 将成为整个 Kubernetes 的默认 StorageClass。如果已经存在其他默认 StorageClass,则会出现两个默认值,此时 Kubernetes 会将没有 storageClassName 的 PVC 分配给 最近创建的 默认 StorageClass (Kubernetes: Default StorageClass)。 其他应用的新 PVC 将悄悄流向 Ceph。当将其部署到现有集群时,请务必将 false 设为 false。

警告 3. 对象存储数据池的 EC 2+1 (L674)。 Ceph 文档指出 M=1 配置「强烈不建议用于生产数据」。 在维护期间数据将无法访问,如果发生重叠故障则会导致数据丢失。此外,由于 K+M=3, host 故障域中必须正好有三个或更多主机,并且如果按照建议将 min_size 设置为 K+1=3,那么只要有一个主机宕机,该池就会停止写入(实际的 min_size 值将在第 4 篇中确认,未实际测量)。 如果是生产环境,请考虑使用副本 3 或 K=4、M=2。

警告 4. 删除时会消失的资源。 三个 StorageClass 的 reclaimPolicy 都是 Delete ,因此删除 PVC 也会删除数据。文件系统的 preserveFilesystemOnDelete 默认是 false ,所以删除 CR 也会删除文件系统。相反,对象存储的 preservePoolsOnDelete: true 会保留数据池。请记住这三者的默认值各不相同。

警告 5. crds.enabled(Operator Chart L21)。 注释警告称,如果在初次安装后将初始设置的值更改为 false ,可能会破坏集群。同样的注释针对 CRD 被删除的情况,指向了灾难恢复文档中的「删除后恢复 CRD」一节。这个值在安装时只需设置一次,请勿更改。

警告 6. requireMsgr2: true 与 keyType: aes(L231, L176)。 msgr2 需要内核 5.11 或更高版本,升级文档指导如果在更旧的内核上则通过 requireMsgr2: false 将其关闭。注释中写道,如果节点内核低于 7.0,则需要 keyType: aes 。请首先检查节点的内核版本。切勿在测试环境之外开启 mon.allowMultiplePerNode(L184) 和 requireSafeReplicaSize: false(允许池 CRD size 1)。

7. 在实训集群中减少内存和 CPU 占用

TT Lab 实训集群的配置包含三个虚拟机,每个虚拟机挂载一个空磁盘(17GiB)。如果使用默认值安装,Ceph Pod 请求的资源 通过 values 计算如下。数量假设为节点数、磁盘数、默认池、文件系统和对象存储各一个。

Pod 数量 请求 CPU 总计 请求内存总计
osd 3 3000m 12Gi
mds 2 (1 个活跃 + 1 个备用) 2000m 8Gi
mon 3 3000m 3Gi
mgr + Sidecar 2 + 2 1200m 1104Mi
rgw 1 1000m 1Gi
logcollector Sidecar 假设每个守护进程一个,共 11 个 1100m 1100Mi
crashcollector, exporter 每个节点一个,共 3 + 3 450m 330Mi
operator 1 200m 128Mi
总计 约 12 核 约 26.6Gi

CSI Pod(ctrlplugin·nodeplugin)和 ceph-csi-operator 的请求由于是对应 Chart 的默认值,因此未包含在内(未确认)。如果 Pod 停留在 Pending 状态,请首先将此总和与虚拟机的 CPU·内存进行对比。实际调度值将在第 4 篇中确认。

这是缩减大小时需要调整的值。以下是 建议配置,但从未以该组合启动过(未实际测量)。

cephClusterSpec:
  mgr:
    count: 1                # mgr 하나와 사이드카 둘이 빠진다
  dashboard:
    enabled: false
  crashCollector:
    disable: true           # cluster-test.yaml 도 끈다
  logCollector:
    enabled: false          # 데몬마다 붙는 로그 사이드카가 빠진다
  resources:
    mon:
      requests: {cpu: 250m, memory: 512Mi}
      limits: {memory: 1Gi}       # 권장 최소 1024MB 와 같다
    mgr:
      requests: {cpu: 250m, memory: 512Mi}
      limits: {memory: 512Mi}     # 권장 최소 512MB
    osd:
      requests: {cpu: 500m, memory: 2Gi}
      limits: {memory: 2Gi}       # 권장 최소 2048MB, osd_memory_target 도 2Gi 가 된다
cephFileSystems:
  - name: ceph-filesystem
    spec:
      metadataServer:
        activeCount: 1
        activeStandby: false
        resources:
          requests: {cpu: 250m, memory: 1Gi}
          limits: {memory: 1Gi}   # 권장 4096MB 보다 낮아 operator 가 경고를 찍는다
cephObjectStores:
  - name: ceph-objectstore
    spec:
      gateway:
        instances: 1
        resources:
          requests: {cpu: 250m, memory: 512Mi}
          limits: {memory: 1Gi}

由于列表值(cephFileSystems, cephObjectStores)会被 Helm 完全替换,因此在实际文件中必须同时编写默认值的其余字段(池、StorageClass)。在上面的代码片段中,为了只展示更改的字段进行了简化。如果不需要 RWX 卷或 S3,使用 cephFileSystems: [], cephObjectStores: [] 将其完全剔除是缩减幅度最大的方式。 activeStandby: false 只是将备用 MDS 改为冷备,MDS 的数量(2)保持不变(第 2 篇第 2 节)。

如果以相同方式计算上述组合的请求总和,内存约为 10.8Gi(osd 6Gi, mds 2Gi, mon 1.5Gi, mgr 512Mi, rgw 512Mi, exporter 150Mi, operator 128Mi),CPU 约为 3.6 核。相应地,OSD 的内存目标从 4Gi 降至 2Gi,导致 BlueStore 缓存变小(对性能的影响未实际测量),MDS 低于 Rook 的建议值。 对性能的影响将在测量结束后单独撰写的性能篇中讨论。

作为同方向的官方示例,Rook 仓库中提供了 deploy/examples/cluster-test.yaml。这是一种完全不设置资源请求、仅保留一个 mon 和 mgr、将 osd_memory_target 设置为 1GiB、并将池大小设为 1 的配置。文件头部注释将其介绍为「单节点即可满足的小型测试集群」。由于只有一个副本,因此没有数据保护。

容量计算

磁盘集的原始容量为 51GiB。当 OSD 使用率超过 mon_osd_nearfull_ratio(0.85) 时,Ceph 会发出警告,当达到 mon_osd_full_ratio(0.95) 时,则会阻止写入(Monitor Config Reference).

池类型 空间倍数 达到 full (0.95) 之前可容纳的原始数据 直到 nearfull (0.85) 警告
副本 size 3(块、文件系统) 3.0 约 16.2GiB 约 14.5GiB
EC 2+1(对象数据) 1.5 约 32.3GiB 约 28.9GiB

由于所有池共享相同的原始容量,因此这两行不能直接相加。计算中剔除了 BlueStore 和 RocksDB 的固定开销以及 PG 分布不均的情况(未实际测量)。实际可用量可通过第 4 篇的 ceph df 进行确认。

8. 总结

Titi 的小贴士。 values.yaml 就像是一封写着「我默认会这样处理哦」的信。然而,这封信里夹杂了一些相当大胆的语句,比如「我会用光所有的空磁盘」、「我要当默认的 StorageClass」。在点击安装按钮之前,请务必重新阅读这几行内容!

参考

values 和文档均于 2026-10-29 从上述 commit 中查阅。

登录后即可点赞

评论

还没有评论。

登录后即可发表评论