TT Lab
Blog

한국어 English 日本語 中文

Get started
Blog

Blog

Rook-Ceph Guide 3: Reading the values of rook-ceph and rook-ceph-cluster charts 1.21.1

Status: Draft (2026-10-29), based on chart originals, unmeasured. All values are from Rook v1.21.1 tag pointing commit 09d2f0d8d883b70b30de796c4390371be725ff3b of deploy/charts/rook-ceph/values.yaml and deploy/charts/rook-ceph-cluster/values.yaml read directly, and the line numbers in the table are the lines of that file. Total resources and capacity are calculated valuesusing defaults from values and Ceph documentation and were not measured. Actual pods and capacity running in the TT Lab cluster (3 VMs, each with a 17GiB empty disk) will be covered in Part 4. Writing convention: Measured data is the default, unmeasured items are marked as "Unmeasured", and items not found in the original text are marked as "Unconfirmed".

Table of Contents

1. There are three charts, and there is an order

The Rook documentation (Helm Charts Overview) introduces three charts for v1.21. It is commonly known that "you just need to install rook-ceph and rook-ceph-cluster two charts," but starting from v1.20, another one has been added in the middle.

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 드라이버가 실패한다 업그레이드도 같은 순서: ① → ② → ③
Figure: Helm chart set of v1.21 and what each creates
Order Chart Where What it creates
1 rook-ceph Rook repository Rook operator Deployment, CRD, RBAC, subchart ceph-csi-operator 1.1.0
2 ceph-csi-drivers Helm repository for ceph-csi-operator, with values tailored by Rook OperatorConfig, RBD and CephFS Driver CRs, driver pods RBAC
3 rook-ceph-cluster Rook repository CephCluster, block pool / filesystem / object store CRs, their StorageClasses, toolbox (disabled by default)

If you omit step 2, PVCs will remain stuck in pending. The upgrade documentation notes that without this chart, the CSI drivers will enter a failed state due to missing service accounts, and the installation procedure in the operator chart documentation also follows the order: ‐operator chart → CSI driver chart → cluster‐ (Ceph Operator Helm Chart, Rook Upgrades). ceph-csi-drivers , because installing with default values alone causes the driver to fail, the documentation emphasizes that you must also include the Rook repository's deploy/charts/ceph-csi-drivers/values.yaml. That file adjusts the driver name to match the operator namespace, such as rook-ceph.rbd.csi.ceph.com .

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

The command is copied directly from the documentation example. The cluster chart documentation recommends not copying the entire values file, but rather creating a file containing only the values you want to change. For reference, the tag Chart.yaml in both charts specifies version: 0.0.1 , suggesting that the chart version numbers are appended during the release process (unconfirmed). Starting from v1.21, OCI chart tags do not include v .

2. Important values in rook-ceph (operator chart)

The entire file is short, around 245 lines (values.yaml).

Key Default Meaning and Notes Line
image.tag v1.21.1 Operator image docker.io/rook/ceph L10
crds.enabled true The chart creates and updates CRDs. Set this only upon initial installationWarning: Disabling this later may destroy the cluster L21
resources Requests CPU 200m, memory 128Mi; Memory limit 512Mi Operator Pod Resources L24
unreachableNodeTolerationSeconds 5 Moving the operator pod when a node becomes unreachable. 5 seconds instead of Kubernetes default 5 minutes L42
currentNamespaceOnly false Whether to watch only the CephCluster in its own namespace L45
logLevel INFO ERROR·WARNING·INFO·DEBUG L58
containerSecurityContext runAsNonRoot, UID 2016, remove all capabilities Operator container security context L71
allowLoopDevices false Whether to use loop devices as OSDs on test clusters L78
monRunAsRoot false Whether to run mon pods as root L81
deleteUnusedCrushRules true Delete unused auto-generated CRUSH rules after mgr starts L84
csi.installCsiOperator true Install the ceph-csi-operator subchart L95
csi.cephcsi , and 7 other images All empty values Leave blank to use ceph-csi-operator's built-in images. Specify repository and tag only when changing L102
csi.serviceMonitor.enabled false(5-second interval when enabled) ServiceMonitor for CSI metrics L144
enableDiscoveryDaemon false(Interval 60m) Daemon that periodically discovers new disks on nodes L156
cephCommandsTimeoutSeconds "15" Timeout (in seconds) for ceph commands called by the operator L161
scaleDownOperator false A switch to scale the operator to 0 for manual maintenance when deploying via GitOps L169
enforceHostNetwork false Place all Rook pods on the host network (for environments without CNI) L213
disableDeviceHotplug false Whether to disable the behavior of automatically creating OSDs when new devices appear L216
enableOBCWatchOperatorNamespace true Whether the OBC provisioner watches the operator namespace L229
obcAllowAdditionalConfigFields "maxObjects,maxSize" Additional fields that OBC users can specify. Comments warn that the rest (bucket policies, lifecycle, owner, etc.) are dangerous L240
monitoring.enabled false When enabled, the operator gets RBAC to create ServiceMonitor. Prometheus must be present first L245

Most CSI configurations have moved away from this chart. Previously, values like provisioner replica count, kubelet path, and per-driver resources were set under csi in this chart, but upgrade documentation now instructs to find such values in the ceph-csi-drivers chart configuration. What remains in this chart for csi are whether to install subcharts, image overrides, and ServiceMonitor. Configurations for the ceph-csi-operator subchart itself are written in the values ceph-csi-operator section (L86).

3. Outer values of rook-ceph-cluster

From here on is the 844-line cluster chart (values.yaml). cephClusterSpec ). We start by looking at values outside of it.

Key Default Value Meaning and Notes Line
operatorNamespace rook-ceph Namespace where the operator resides. Becomes the prefix of the StorageClass provisioner name L6
configOverride None Content to append to ceph.conf L16
toolbox.enabled false rook-ceph-tools Deployment. Image is the same as the Ceph image. Requests 128Mi, limit 1Gi L26
monitoring.enabled false Prometheus integration. metricsDisabled: false , so mgr's prometheus module and exporter are enabled by default L72
monitoring.createPrometheusRules false Whether to create Ceph alert rules (PrometheusRule) L76
cephImage quay.io/ceph/ceph:v20.2.4, allowUnsupported: false Ceph Tentacle. The comment recommends pinning to a tag with a date like v20.2.4-20260818 for production L124
ingress.dashboard, route.dashboard empty When exposing the dashboard via an Ingress or HTTPRoute L475
cephFileSystemVolumeSnapshotClass, cephBlockPoolsVolumeSnapshotClass enabled: false Snapshot class. Enable if you want to use it L642
csiDriverNamePrefix empty If left empty, the operator namespace is prefixed to the driver name L844

4. cephClusterSpec: The CephCluster itself

cephClusterSpec goes directly into the spec of the CephCluster CR. The cluster chart documentation notes that this default value is "just an example and unlikely to fit your cluster."

Key Default Value Meaning and Notes Line
dataDirHostPath /var/lib/rook Host path for mon data and configuration. If you do not delete this directory upon reinstalling, mons will not start in the new cluster L150
skipUpgradeChecks false Whether to skip pre-upgrade checks L156
continueUpgradeAfterChecksEvenIfNotHealthy false Whether to continue even if PGs are not clean L159
waitTimeoutForHealthyOSDInMinutes 10 Wait time for the state to become safe to stop an OSD L166
upgradeOSDRequiresHealthyPGs false Whether PGs must be healthy to start OSD upgrades L171
security.cephx.csi.keyType aes Comment: Required if node kernel is less than 7.0 L176
mon.count 3 Number of mons. Documentation suggests 1 to 9, odd numbers recommended L181
mon.allowMultiplePerNode false Multiple mons on a single node. For test environments only, at the cost of data loss L184
mgr.count 2 One active, one standby. If set to 2, a mgr sidecar is also attached L190
mgr.modules rook module disabled Comments state that the rook mgr module is not recommended L196
dashboard.enabled·ssl true·true Dashboard enabled; self-signed certificate if none provided L201
network.connections.encryption false Encryption in transit. Requires kernel 5.11 or higher to enable L223
network.connections.compression false Compression in transit L227
network.connections.requireMsgr2 true Close msgr v1 port (6789) and use v2 (3300) only. Requires kernel 5.11 or higher L231
crashCollector.disable false Daemon crash dump collector (one pod per node) L253
logCollector Enabled, daily, up to 500M Log file rotation sidecar per daemon L260
cleanupPolicy.confirmation "" Part 2, Section 7. Only when deleting yes-really-destroy-data L271
cleanupPolicy.sanitizeDisks quick·zero· Once Disk wiping method L277
removeOSDsIfOutAndSafeToRemove false Whether to automatically remove OSDs that are out and safe to delete L409
priorityClassNames mon·osd system-node-critical, mgr system-cluster-critical Prevent premature eviction when resources are scarce L412
storage.useAllNodes true All nodes as storage nodes L418
storage.useAllDevices true All usable devices as OSDs L419
storage.deviceFilter·nodes Commented out Device name regex, per-node device list L420
disruptionManagement.managePodBudgets true PodDisruptionBudget for OSD·mon·RGW·MDS managed by the operator L446
disruptionManagement.osdMaintenanceTimeout 30 Time (minutes) to hold fault domains draining with noout L449
healthCheck.daemonHealth mon 45s, osd 60s, status 60s Check interval. Since mon's timeout is not specified, the code default of 10 minutes (Part 2) is used L453

Resource requests (resources)

cephClusterSpec.resourcesis the default value of (L340). Rook documentation states that "if too low, it only logs a warning and starts anyway," and also lists the recommended minimum thresholds corresponding to it(CephCluster CRD). Looking at the source code, this check is based on the limit , and considers it an error if the limit is smaller than the request (spec.go#L486-L520).

Target Request CPU Request Memory Limit Memory Rook Recommended Min Line
mgr 500m 512Mi 1Gi 512MB L341
mon 1000m 1Gi 2Gi 1024MB L347
osd 1000m 4Gi 4Gi 2048MB L353
prepareosd 500m 50Mi None (recommended not to set) No limit L359
mgr-sidecar 100m 40Mi 100Mi Limit 100MB, Request 40MB L371
crashcollector 100m 60Mi 60Mi 60MB L377
logcollector 100m 100Mi 1Gi Unverified L383
cleanup 500m 100Mi 1Gi Unverified L389
exporter 50m 50Mi 128Mi Limit 128MB, Request 50MB L395
cmd-reporter 500m 100Mi 1Gi Unverified L401

The documentation states that if you lower the OSD memory, Rook adjusts osd_memory_target of Ceph to match. As seen in Part 1, the Ceph default for this value is 4Gi, so the chart default (4Gi) is equal to the Ceph default. The resources for MDS and RGW are located in their respective sections rather than here (Section 5).

5. Defaults for Block Pools, Filesystems, and Object Stores

By default, the cluster chart creates one of each of these three types and attaches a StorageClass to each. These StorageClasses are created by the chart template, not the operator (Part 2, Section 9).

cephBlockPools: ceph-blockpool and StorageClass ceph-block

Key Default Notes Line
spec.failureDomain host Different host per replica L520
spec.replicated.size 3 Three copies L522
storageClass.isDefault true Becomes the cluster's default StorageClass L531
storageClass.reclaimPolicy Delete Deletes the RBD image when the PVC is deleted L532
storageClass.allowVolumeExpansion true Allow volume expansion L533
storageClass.volumeBindingMode Immediate Create PVC immediately upon creation L534
parameters.imageFormat "2" RBD image format L559
parameters.imageFeatures layering Note: Kernel RBD supports full features starting from 5.4, but defaults to layering only L565
parameters Six Secret pairs for rook-csi-rbd-provisioner, rook-csi-rbd-node cephx keys to be used for provisioner, expand, publish, node-stage, modify, and node-publish. Created by the operator (Part 2). L568
parameters."csi.storage.k8s.io/fstype" ext4 Note: In configurations where volumes are mounted on the same node as OSDs, XFS may deadlock and is not recommended. L585

The template (cephblockpool.yaml) appends provisioner: <operatorNamespace>.rbd.csi.ceph.com and pool·clusterID(cluster namespace).

cephFileSystems: ceph-filesystem and StorageClass ceph-filesystem

Key Default Notes Line
metadataPool.replicated.size 3 Metadata pool L595
dataPools[0] Name data0, host, size 3 Data pool L597
metadataServer.activeCount 1 One active MDS, Rook spins up twice that amount (two) L603
metadataServer.activeStandby true Standby MDS keeps cache warm L604
metadataServer.resources CPU request 1000m, memory 4Gi, limit 4Gi Rook recommends MDS memory of 4096MB or more, matching mds_cache_memory_limit as the limit L605
storageClass.isDefault false L614
storageClass.pool data0 L617
storageClass.reclaimPolicy Delete L618

Since the preserveFilesystemOnDelete of CephFilesystem is not in the chart, the CRD default false is used. This means that deleting the CR also deletes the filesystem (CephFilesystem CRD).

cephObjectStores: ceph-objectstore and StorageClass ceph-bucket

Key Default Notes Line
metadataPool host, replication size 3 Bucket index, etc. L670
dataPool.erasureCoded K=2, M=1, host Data pool uses erasure coding L674
dataPool.parameters.bulk "true" PG autoscaler assigns many PGs from the start (Part 1) L680
preservePoolsOnDelete true Pools are preserved even if the CR is deleted L681
gateway.port 80 HTTP. securePortCertificates commented out L683
gateway.instances 1 Single RGW pod L692
gateway.resources CPU request 1000m, memory 1Gi, limit 2Gi L684
storageClass ceph-bucket, Delete, region: us-east-1 Provisioner is <클러스터 네임스페이스>.ceph.rook.io/bucket L701
ingress.enabled·route.enabled false When exporting outside the cluster L712

Multi-site (realm, zonegroup, zone), object store users, and EC block pools are only included as comments in values and are not created by default (starting from L743).

6. Areas Dangerous to Use with Default Settings

Warning 1. useAllNodes: true + useAllDevices: true(L418, L419). All available devices on all nodes become OSDs and are formatted. As seen in Part 2, devices that are mounted or have filesystem/OSD signatures are skipped, but empty disks with no signatures are claimed without asking. This targets disks attached for other purposes or those not yet formatted. The CephCluster documentation states that useAllDevices is "not recommended unless in a highly controlled environment with no risk of destroying devices," and recommends specifying nodes using useAllNodes: false in production. At a minimum, specify deviceFilter(e.g., a regex matching only empty disk names in a practice VM) or node-specific devices .

Warning 2. ceph-block of isDefault: true(L531). The moment you install it, ceph-block becomes the default StorageClass for the entire Kubernetes cluster. If another default StorageClass already exists, there will be two defaults, and Kubernetes will use storageClassName the most recently created default StorageClass for PVCs without (Kubernetes: Default StorageClass). New PVCs from other apps will silently go to Ceph. When mounting onto an existing cluster, leave it as false .

Warning 3. Object store data pool EC 2+1 (L674). The Ceph documentation notes that the M=1 profile is "strongly discouraged for production data." Data becomes unavailable during maintenance and can be lost if failures overlap. Also, since K+M=3, host failure domains must include at least three hosts, and if you set min_size to K+1=3 as recommended, a single host going down will cause that pool to stop accepting writes (actual min_size value to be verified in Part 4, unmeasured). For production, consider replication 3 or K=4, M=2.

Warning 4. Things that disappear when deleted. The reclaimPolicy of all three StorageClasses is Delete , so deleting a PVC also deletes the data. For filesystems, preserveFilesystemOnDelete defaults to false , so deleting the CR also deletes the filesystem. Conversely, for object stores, preservePoolsOnDelete: true means the pools are retained. Keep in mind that the defaults differ among the three.

Warning 5. crds.enabled(operator chart L21). Comments warn that changing the value set during initial installation to false later may destroy the cluster. The same comment points to the "Restore CRDs after deletion" section of the disaster recovery documentation in case the CRD is deleted. Determine this value once during installation and do not change it.

Warning 6. requireMsgr2: true and keyType: aes(L231, L176). msgr2 requires kernel 5.11 or higher, and upgrade documentation instructs disabling it with requireMsgr2: false if using an older kernel. keyType: aes is noted in comments as required if the node kernel is below 7.0. Check your node's kernel version first. mon.allowMultiplePerNode(L184) and requireSafeReplicaSize: false(pool CRD, size 1 allowed) should not be enabled outside of test environments.

7. Reducing Memory and CPU in a Practice Cluster

The TT Lab practice cluster consists of three VMs, each with a single empty disk (17GiB). Calculating the resources requestedby Ceph pods with default installation values yields the following via values. Counts assume a set of nodes, a set of disks, and one default pool, filesystem, and object store each.

Pod Count Total CPU Request Total Memory Request
osd 3 3000m 12Gi
mds 2 (1 active + 1 standby) 2000m 8Gi
mon 3 3000m 3Gi
mgr + sidecar 2 + 2 1200m 1104Mi
rgw 1 1000m 1Gi
logcollector sidecar Assumed one per daemon, 11 1100m 1100Mi
crashcollector, exporter 3 + 3 (one per node) 450m 330Mi
operator 1 200m 128Mi
Total ~12 cores ~26.6Gi

CSI pods (ctrlplugin, nodeplugin) and ceph-csi-operator requests are excluded as they use chart defaults (unverified). If pods get stuck in Pending , first compare this total with the VM's CPU and memory. Actual scheduled values will be verified in Part 4.

These are the values to tweak when reducing resource usage. The below is a proposaland has not been launched with this combination (unmeasured).

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}

Since list values (cephFileSystems, cephObjectStores) are completely replaced by Helm, the actual file must include the remaining fields of the defaults (pools, StorageClass) together. The snippet above was shortened to show only modified fields. If RWX volumes or S3 are not needed, removing them entirely with cephFileSystems: [], cephObjectStores: [] yields the greatest reduction. activeStandby: false merely changes the standby MDS to a cold standby while keeping the MDS count at 2 (Part 2, Section 2).

Calculating the request total for the above combination in the same way yields approximately 10.8Gi of memory (osd 6Gi, mds 2Gi, mon 1.5Gi, mgr 512Mi, rgw 512Mi, exporter 150Mi, operator 128Mi) and about 3.6 cores of CPU. In exchange, the OSD memory target drops from 4Gi to 2Gi, shrinking the BlueStore cache (performance impact unmeasured), and the MDS is lower than Rook's recommendation. The performance impact will be covered in a separate performance post after measurements are complete.

An official example in the same direction is Rook storage's deploy/examples/cluster-test.yaml. This configuration omits resource requests entirely, sets mon and mgr to one each, osd_memory_target to 1GiB, and pool size to 1. The header comment introduces it as a "small test cluster where a single node is enough." Since there is only one replica, there is no data protection.

Capacity Calculation

The raw capacity of the disk set is 51GiB. Ceph warns when OSD utilization exceeds mon_osd_nearfull_ratio(0.85), and halts writes when it reaches mon_osd_full_ratio(0.95) (Monitor Config Reference).

Pool Type Space Multiplier Raw Data Usable Until full (0.95) Up to nearfull (0.85) Warning
Replication size 3 (Block, Filesystem) 3.0 ~16.2GiB ~14.5GiB
EC 2+1 (Object Data) 1.5 ~32.3GiB ~28.9GiB

Since all pools share the same raw capacity, the rows cannot be simply added. Fixed overhead for BlueStore and RocksDB, and PG unevenness are excluded (unmeasured). Usable capacity can be verified with ceph df in Part 4.

8. Summary

TT's Word. values.yaml is a letter saying, "I'll set things up like this by default." However, this letter mixes in quite bold statements like "I'll use all empty disks" and "I'll be the default StorageClass." Please be sure to re-read those few lines before clicking install!

References

Both values and documentation were accessed on 2026-10-29 at the above commits.

Sign in to like

Comments

No comments yet.

Sign in to leave a comment