Upgrade Ceph from Squid (v19) to Tentacle (v20)

Each Ceph major version is delivered in its own Operator channel of the rook-operator package:

ChannelRookCeph
alpha1.1919.2 Squid
stable-1.201.2020.2 Tentacle

An existing cluster stays on its current channel. Publishing the Tentacle package to the catalog does not move it. You choose when to upgrade by switching the Subscription channel. If you do not switch the channel, the cluster keeps running Ceph Squid.

WARNING

The upgrade from Squid to Tentacle cannot be rolled back. After Ceph daemons run Tentacle, do not switch the Subscription back to alpha, and do not set CephCluster.spec.cephVersion.image to a Squid image.

Requirements

Platform

  • The cluster runs 4.5 or later. Rook 1.20 requires Kubernetes 1.31 or later, so upgrade the platform before you upgrade Alauda Storage.
  • The rook-operator package that contains the stable-1.20 channel is uploaded to the catalog. See Upload Packages.

Node kernel

All nodes that run Ceph daemons or mount Ceph volumes must run Linux kernel 5.11 or later.

Check the kernel version of every node:

kubectl get nodes -o custom-columns=NODE:.metadata.name,KERNEL:.status.nodeInfo.kernelVersion,OS:.status.nodeInfo.osImage
NOTE

This upgrade was validated on Red Hat Enterprise Linux 9.6 with kernel 5.14.0-570.12.1.el9_6 for both RBD and CephFS kernel clients.

Cluster state

  • CephCluster is Ready and status.ceph.health is HEALTH_OK.
  • All PVCs that use Ceph storage classes are Bound.
  • The rook-operator Subscription uses Manual approval. See Confirm Manual approval.

Procedure

1. Check the current state

kubectl -n rook-ceph get subscription rook-operator \
  -o jsonpath='channel={.spec.channel} approval={.spec.installPlanApproval} installed={.status.installedCSV}{"\n"}'
kubectl -n rook-ceph get cephcluster <cephcluster-name> \
  -o jsonpath='phase={.status.phase} health={.status.ceph.health} version={.status.version.version}{"\n"}'

Expected: channel=alpha, approval=Manual, phase=Ready, health=HEALTH_OK, and a 19.2.x version.

Confirm that the catalog offers the stable-1.20 channel:

kubectl -n cpaas-system get packagemanifest rook-operator \
  -o jsonpath='{range .status.channels[*]}{.name}={.currentCSV}{"\n"}{end}'

2. Switch the Subscription channel

kubectl -n rook-ceph patch subscription rook-operator --type merge \
  -p '{"spec":{"channel":"stable-1.20"}}'

OLM creates an InstallPlan for the latest CSV in stable-1.20. Intermediate versions are skipped.

3. Approve the InstallPlan

Approve the pending plan from the Ceph details page or with kubectl, as described in Approve the Operator package. Approving the plan starts the Ceph major version upgrade.

PLAN="$(kubectl -n rook-ceph get subscription rook-operator -o jsonpath='{.status.installPlanRef.name}')"
kubectl -n rook-ceph get installplan "$PLAN" \
  -o jsonpath='{.spec.clusterServiceVersionNames}{"\n"}'
kubectl -n rook-ceph patch installplan "$PLAN" --type merge \
  -p '{"spec":{"approved":true}}'

Confirm that the plan targets a stable-1.20 CSV before you approve it.

4. Wait for the upgrade to finish

Watch the daemon versions until every daemon reports 20.2.x:

kubectl -n rook-ceph get deployments -l rook_cluster=rook-ceph \
  -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels.ceph-version}{"\n"}{end}'

In validation on a three-node cluster with six OSDs, the upgrade finished in about 7 minutes. The time grows with the number of OSDs.

5. Verify

kubectl -n rook-ceph get csv
kubectl -n rook-ceph get cephcluster <cephcluster-name> \
  -o jsonpath='phase={.status.phase} health={.status.ceph.health} version={.status.version.version}{"\n"}'
kubectl get pvc -A | grep -v Bound
  • The new CSV is Succeeded.
  • phase=Ready, health=HEALTH_OK, and the version is 20.2.x.
  • No Ceph-backed PVC is in a state other than Bound.
  • Existing workloads can read their data, and new PVCs can be created and mounted.

If the toolbox is available, confirm that all daemons run Tentacle:

kubectl -n rook-ceph exec deploy/rook-ceph-tools -- ceph versions

If the upgrade does not progress

  • No InstallPlan after switching the channel: confirm that the stable-1.20 channel exists in the PackageManifest and that the Subscription has no startingCSV that pins an older version.
  • The Operator is upgraded but Ceph daemons do not roll: confirm that the new CSV is Succeeded and that its relatedImages contains exactly one entry named ceph.
  • Health stays at HEALTH_WARN or HEALTH_ERR after all daemons restart: run ceph health detail from the toolbox and resolve the reported checks before you continue.

Do not delete the CephCluster, Rook Operator, or PV objects to recover an upgrade.

Ceph is a trademark or registered trademark of Red Hat, Inc. or its subsidiaries in the United States and other countries. Rook® is a registered trademark of The Linux Foundation. Alauda is an independent vendor. This product is not affiliated with, endorsed by, or sponsored by LF Projects, LLC or The Linux Foundation. All trademarks are the property of their respective owners and are used here for identification purposes only.