将 Ceph 从 Squid (v19) 升级到 Tentacle (v20)

每个 Ceph 主版本都通过 rook-operator 软件包中各自的 Operator channel 发布:

ChannelRookCeph
alpha1.1919.2 Squid
stable-1.201.2020.2 Tentacle

现有集群会继续使用当前的 channel。将 Tentacle 软件包发布到 catalog 不会使集群迁移到该版本。您可以通过切换 Subscription channel 来选择升级时间。如果不切换 channel,集群将继续运行 Ceph Squid。

WARNING

从 Squid 升级到 Tentacle 后无法回滚。Ceph daemon 运行 Tentacle 后,请勿将 Subscription 切换回 alpha,也不要将 CephCluster.spec.cephVersion.image 设置为 Squid 镜像。

要求

平台

  • 集群运行的是 4.5 或更高版本。Rook 1.20 要求 Kubernetes 1.31 或更高版本,因此请在升级 Alauda Storage 前先升级平台。
  • 包含 stable-1.20 channel 的 rook-operator 软件包已上架到 catalog。请参阅上架软件包。

节点内核

运行 Ceph daemon 或挂载 Ceph 卷的所有节点都必须运行 Linux 内核 5.11 或更高版本。

检查每个节点的内核版本:

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

此升级已在 Red Hat Enterprise Linux 9.6、内核版本为 5.14.0-570.12.1.el9_6 的环境中,对 RBD 和 CephFS 内核客户端进行了验证。

集群状态

  • CephCluster 为 Ready,且 status.ceph.health 为 HEALTH_OK。
  • 所有使用 Ceph storage class 的 PVC 均为 Bound。
  • rook-operator Subscription 使用 Manual 审批。请参阅确认 Manual 审批。

操作步骤

1. 检查当前状态

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"}'

预期结果为:channel=alpha、approval=Manual、phase=Ready、health=HEALTH_OK,以及一个 19.2.x 版本。

确认 catalog 提供 stable-1.20 channel:

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

2. 切换 Subscription channel

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

OLM 会为 stable-1.20 中最新的 CSV 创建一个 InstallPlan。中间版本会被跳过。

3. 批准 InstallPlan

按照批准 Operator 软件包中的说明,从 Ceph 详情页面或使用 kubectl 批准待处理的计划。批准该计划后,Ceph 主版本升级将开始。

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}}'

批准前,确认该计划的目标为 stable-1.20 CSV。

4. 等待升级完成

监视 daemon 版本,直到每个 daemon 都报告 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}'

在包含三个节点和六个 OSD 的集群上进行验证时,升级约在 7 分钟内完成。OSD 数量越多,所需时间越长。

5. 验证

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
  • 新 CSV 为 Succeeded。
  • phase=Ready、health=HEALTH_OK 以及该版本为 20.2.x。
  • 没有 Ceph 支持的 PVC 处于 Bound 以外的状态。
  • 现有工作负载可以读取其数据,并且可以创建和挂载新的 PVC。

如果 toolbox 可用,请确认所有 daemon 都运行 Tentacle:

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

如果升级未取得进展

  • 切换 channel 后没有 InstallPlan:确认 PackageManifest 中存在 stable-1.20 channel,并且 Subscription 没有用于固定旧版本的 startingCSV。
  • Operator 已升级,但 Ceph daemon 未滚动升级:确认新 CSV 为 Succeeded,并且其 relatedImages 恰好包含一个名为 ceph 的条目。
  • 所有 daemon 重启后,健康状态仍为 HEALTH_WARN 或 HEALTH_ERR:从 toolbox 运行 ceph health detail,并在继续操作前解决报告的问题。

请勿删除 CephCluster、Rook Operator 或 PV 对象来恢复升级。

相关主题

Ceph 是 Red Hat, Inc. 或其子公司在美国和其他国家/地区的商标或注册商标。 Rook® 是 The Linux Foundation 的注册商标。 Alauda 是一家独立供应商。本产品与 LF Projects, LLC 或 The Linux Foundation 无关联,也未获得其认可或赞助。所有商标均为其各自所有者的财产,此处仅用于识别目的。