更新或替换使用 OpenShift Data Foundation 的 VPC 工作程序节点

虚拟私有云

对于使用 OpenShift Data Foundation 等存储解决方案的 VPC 群集,您必须按顺序对每个工作节点进行封锁、排空和更新。 对于裸机工作节点,现在可以使用 worker reload 命令来代替 worker replace。 如果您将 OpenShift Data Foundation 部署到群集中的工作节点子集,那么在更新工作节点后,您必须编辑 ocscluster 资源以包含新的工作节点。

下面的教程包括主要更新、次要更新和工作节点更新。

重大更新
完成带有此标签的步骤以应用主要更新; 例如,如果要将工作程序节点更新到新的主要版本 (例如,从 4.114.12 以及从 4.114.12 的 OpenShift Data Foundation)。
小幅更新
完成带有此标签的步骤以应用补丁更新,例如,如果要在保持 OpenShift Data Foundation 为 V 4.12 的情况下从 4.12.15_1542_openshift 更新到 4.12.16_1544_openshift。 对于每个需要更新的节点,您都必须重复这些步骤。
工人替换
如果要更换同一补丁版本的工作程序节点,请使用此标签步骤完成这些步骤。 对于每个需要替换的节点,您都必须重复这些步骤。

升级过程中跳过版本(例如从 4.8 升级到 ) 4.12 不被支持。

请登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。

在更新工作程序节点之前,请确保备份应用程序数据。 此外,计划一次完成一个工作程序节点的以下步骤。 对每个需要更新的工作节点,请重复上述步骤。

检查存储集群的状态

重大更新 次要更新 工人替换

  1. 运行以下命令列出 Pod。 验证 openshift-storage 命名空间中的所有 pod 是否处于良好状态。 处理任何未处于“运行”或“已完成”状态的 pod。

    	oc get pods -n openshift-storage
    
  2. 运行以下命令并验证 ocs-storageclusterPhaseReady

    	oc get storagecluster -n openshift-storage
    

    示例输出

    	NAME                 AGE     PHASE   EXTERNAL   CREATED AT             VERSION
    	ocs-storagecluster   3m49s   Ready              2025-04-06T09:37:49Z   4.16.9
    
  3. 运行以下命令检查 Ceph 存储的状态。 验证健康状况为 HEALTH_OK,所有 OSD 均为 upIN,所有 pgs 均为 active+clean。 如果任何检查失败,请打开 支持案例。 在案件详情中,请确保包含任何相关日志文件、错误信息或命令输出。 解决任何问题后再继续。

    	oc rsh -n openshift-storage $(oc get pods -n openshift-storage -o name -l app=rook-ceph-operator) ceph status -c /var/lib/rook/openshift-storage/openshift-storage.config
    

    示例输出

    	health: HEALTH_OK  # Verify health is HEALTH_OK
    	services:
    		mon: 3 daemons, quorum a,b,c (age 3h)
    		mgr: a(active, since 6h)
    		mds: ocs-storagecluster-cephfilesystem:1 {0=ocs-storagecluster-cephfilesystem-b=up:active} 1 up:standby-replay
    		osd: 27 osds: 27 up (since 2h), 27 in (since 111m) # Verify OSDs are “up” and “in”
    		rgw: 2 daemons active (ocs.storagecluster.cephobjectstore.a, ocs.storagecluster.cephobjectstore.b)
    	data:
    		pools:   10 pools, 1136 pgs
    		objects: 5.50M objects, 3.3 TiB
    		usage:   9.9 TiB used, 43 TiB / 53 TiB avail
    		pgs:     1136 active+clean   # Verify psgs are active+clean
    	io:
    		client:   93 KiB/s rd, 2.0 MiB/s wr, 5 op/s rd, 29 op/s wr
    

在对其他节点重复更新程序之前,请重复这些健康检查。 同时关闭多个 OSD pod 可能会危及用户数据。

更新集群主节点

重大更新

  1. 如果要将工作程序节点更新到新的主版本 (例如,从 4.114.12),请首先更新集群主节点。

    	ibmcloud oc cluster master update --cluster CLUSTER [--version MAJOR.MINOR.PATCH] [--force-update] [-f] [-q]
    

    示例命令:

    	ibmcloud oc cluster master update --cluster mycluster --version 4.21.27 --force-update
    
  2. 等待主更新完成。

决定要更新或替换哪些存储节点

重大更新 次要更新 工人替换

  1. 使用 oc get nodes 列出工作程序节点,并确定要更新的存储节点。

    	oc get nodes
    

    示例输出

    	NAME           STATUS   ROLES           AGE    VERSION
    	10.241.0.4     Ready    master,worker   106s   v1.21.6+4b61f94
    	10.241.128.4   Ready    master,worker   22d    v1.21.6+bb8d50a
    	10.241.64.4    Ready    master,worker   22d    v1.21.6+bb8d50a
    

确保存储集群运行正常

重大更新 次要更新 工人替换

运行以下命令检查存储群集的健康状况。

oc get storagecluster -n openshift-storage
oc get cephcluster -n openshift-storage

继续之前,请确保存储群集是健康的。

缩减 OpenShift Data Foundation

重大更新 次要更新 工人替换

  1. 对于在上一步中找到的每个工作程序节点,查找 rook-ceph-monrook-ceph-osd 部署。

    oc get pods -n openshift-storage -o wide | grep -i <node_name>
    

    如果 Noobaa 容器在排水过程中卡住,您可以手动删除这些 NooBaa 容器,以便它们被调度到其他节点上。

  2. 按以下顺序删除剩余的 Noobaa 豆荚。

       noobaa-db
       noobaa-core
       noobaa-endpoint
       noobaa-operator
    
  3. 缩减在上一步中找到的部署。

    	oc scale deployment rook-ceph-mon-c --replicas=0 -n openshift-storage
    
    	oc scale deployment rook-ceph-osd-2 --replicas=0 -n openshift-storage
    
    	oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=NODE-NAME --replicas=0 -n openshift-storage
    

封锁并排出工作程序节点

重大更新 次要更新 工人替换

  1. 节点上的警戒线。 封锁节点将阻止在此节点上调度任何 Pod。

    oc adm cordon NODE_NAME
    

    示例输出

    node/10.241.0.4 cordoned
    
  2. 清空节点以除去所有 pod。 在排出工作程序节点时,pod 会移至其他工作程序节点,以确保没有停机时间。 排水还可确保不会中断 pod 中断预算。

    	oc adm drain NODE_NAME --force --delete-emptydir-data --ignore-daemonsets
    

    示例输出

    	evicting pod "managed-storage-validation-webhooks-7fd79bc9f7-pdpv6"
    	evicting pod "calico-kube-controllers-647dbbd685-fmrp9"
    	evicting pod "certified-operators-2v852"
    	evicting pod "csi-snapshot-controller-77fbf474df-47ddt"
    	evicting pod "calico-typha-8574d89b8c-7f2cc"
    	evicting pod "dns-operator-6d48cbff67-vrrsw"
    	evicting pod "router-default-6fc798b98b-9m6kh"
    	evicting pod "prometheus-adapter-5b77ffdd5f-hzqrp"
    	evicting pod "alertmanager-main-1"
    	evicting pod "prometheus-k8s-0"
    	evicting pod "network-check-source-66c7fbb86-2r78z"
    
  3. 等待排水完成,然后完成以下步骤更新工作节点。

清理裸机工作节点的持久卷

重大更新 次要更新 工人替换

仅限裸机工作节点:如果您正在更新或替换裸机工作节点,请完成以下步骤以清理持久卷,并为新部署做好节点准备。 如果您使用的是虚拟服务器实例(VSI)工作节点,请跳过本节,直接继续执行 “更新工作节点”操作。

开始之前,请确保您已完成前面的步骤,即对工作节点进行隔离和清空。

  1. 识别正在更新的节点上,处于 Released 状态且与 localblock 存储类关联的任何持久卷(PV)。

    	oc get pv -L kubernetes.io/hostname | grep localblock | grep Released
    

    示例输出

    	local-pv-d6bf175b  1490Gi  RWO  Delete  Released  openshift-storage/ocs-deviceset-0-data-0-6c5pw  localblock  2d22h  compute-1
    
  2. 如果 Released 状态下存在任何PV,请将其删除。 将“<persistent_volume>”替换为上一步中 PV 的名称。

    	oc delete pv <persistent_volume>
    

    示例命令

    	oc delete pv local-pv-d6bf175b
    

    示例输出

    	persistentvolume "local-pv-d6bf175b" deleted
    
  3. 擦除裸机节点上的 ODF 磁盘,为创建新的持久卷做好准备。 在您正在更新的节点上启动一个调试 Pod。 将 替换为您自己的裸机 Worker 节点的名称。

    	kubectl debug node/<node-name> -it --image=registry.access.redhat.com/ubi8/ubi
    

    示例命令

    	kubectl debug node/kube-d8g2ek0l0bd8e4oss13g-bhargavibmu-default-000003b3 -it --image=registry.access.redhat.com/ubi8/ubi
    
  4. 在调试舱内,切换到主机的根目录。

    	chroot /host
    
  5. 擦除 ODF 曾使用过的每块 NVMe 硬盘。 请根据您配置中的磁盘数量调整磁盘范围(nvme{0..7}n1 )。

    	for disk in /dev/nvme{0..7}n1; do
    	  echo "Wiping $disk..."
    	  wipefs -af $disk
    	  dd if=/dev/zero of=$disk bs=1M count=100
    	  sgdisk --zap-all $disk 2>/dev/null || true
    	done
    
  6. 请确认磁盘已清空,且不再包含任何文件系统特征。

    	for disk in /dev/nvme{0..7}n1; do
    	  echo "=== $disk ==="
    	  blkid $disk 2>&1 || echo "Clean"
    	done
    

    输出中每个磁盘都应显示“Clean”,这表明所有文件系统签名均已被移除。

  7. 退出调试 pod。

    	exit
    	exit
    
  8. 列出 localvolumediscoveryresults 资源,以查找要更新的节点的条目。

    	kubectl get localvolumediscoveryresults -n openshift-local-storage
    

    示例输出

    	NAME                                                                      AGE
    	discovery-result-kube-d8g2ek0l0bd8e4oss13g-bhargavibmu-default-000003b3   5d
    	discovery-result-kube-d8g2ek0l0bd8e4oss13g-bhargavibmu-default-000004a1   5d
    
  9. 删除您正在更新的节点的 localvolumediscoveryresults 资源。 将“<discovery-result-name>”替换为上一步中的名称。

    	kubectl delete localvolumediscoveryresults <discovery-result-name> -n openshift-local-storage
    

    示例命令

    	kubectl delete localvolumediscoveryresults discovery-result-kube-d8g2ek0l0bd8e4oss13g-bhargavibmu-default-000003b3 -n openshift-local-storage
    

完成这些步骤后,在裸机节点重新加载后,系统将自动在该节点上创建并调度新的持久卷。 请继续阅读下一节,以更新工作节点。

更新工作节点

重大更新 次要更新 工人替换

  1. 使用 ibmcloud oc worker ls 命令列出工作程序节点,并查找在上一步中封锁和排出的工作程序节点。

    	ibmcloud oc worker ls -c CLUSTER
    

    示例输出

    	ID                                                 Primary IP     Flavor     State    Status   Zone        Version
    	kube-c85ra07w091uv4nid9ug-vpcoc-default-000001c1   10.241.128.4   bx2.4x16   normal   Ready    us-east-3   4.8.29_1544_openshift*
    	kube-c85ra07w091uv4nid9ug-vpcoc-default-00000288   10.241.0.4     bx2.4x16   normal   Ready    us-east-1   4.8.29_1544_openshift*
    	kube-c85ra07w091uv4nid9ug-vpcoc-default-00000352   10.241.64.4    bx2.4x16   normal   Ready    us-east-2   4.8.29_1544_openshift*
    
  2. 更新工作节点 对于裸机工作节点,请使用 worker reload 命令。 对于虚拟服务器实例 (VSI) 工作节点,请使用 worker replace 命令。

裸机工作节点:使用 worker reload 命令重新加载工作节点。 该命令支持 VPC 裸机工作节点。 sh {: pre} ibmcloud oc worker reload --worker kube-*** VSI 工作节点Minor update 更换工作节点并应用最新补丁更新的示例命令。 sh {: pre} ibmcloud oc worker replace -c CLUSTER --worker kube-*** --update VSI 工作节点Worker replace 示例命令,用于在不应用最新补丁更新的情况下替换工作节点。 sh {: pre} ibmcloud oc worker replace -c CLUSTER --worker kube-*** 更换 VSI 工作节点的输出示例: sh {: screen} The replacement worker node is created in the same zone with the same flavor, but gets new public or private IP addresses. During the replacement, all pods might be rescheduled onto other worker nodes and data is deleted if not stored outside the pod. To avoid downtime, ensure that you have enough worker nodes to handle your workload while the selected worker nodes are being replaced. Replace worker node kube-c85ra07w091uv4nid9ug-cluster-default-00000288? [y/N]> y Deleting worker node kube-c85ra07w091uv4nid9ug-cluster-default-00000288 and creating a new worker node in cluster

  1. 等待重新加载或替换工作节点,然后列出工作节点。 请注意,此过程可能需要 20 分钟或更长时间。

    	oc get nodes
    

    示例输出

    	NAME           STATUS   ROLES           AGE   VERSION
    	10.241.0.4     Ready    master,worker   22d   v1.21.6+bb8d50a
    	10.241.128.4   Ready    master,worker   22d   v1.21.6+bb8d50a
    	10.241.64.4    Ready    master,worker   22d   v1.21.6+bb8d50a
    

从旧节点清除资源

重大更新 次要更新 工人替换

  1. 验证 OSD pod 是否以 running 状态出现在被替换的节点上。 如果 pod 正在运行,请继续执行 步骤 7。 如果 pod 出现故障,请执行以下操作 steps.If 多个 OSD pod 未 Running,请停止并联系支持人员。 打开 支持案例。 在案例详细信息中,请务必包含任何相关日志文件、错误信息或命令输出。

  2. 浏览至 openshift-storage 项目。

    	oc project openshift-storage
    
  3. 从集群中除去发生故障的 OSD。 如有需要,您可以指定多个失败的 OSD。

    	oc process -n openshift-storage ocs-osd-removal -p FAILED_OSD_IDS=<failed_osd_id> -p FORCE_OSD_REMOVAL=true | oc create -f -
    

    FAILED_osd_id 值是紧跟在 rook-ceph-osd 前缀之后的 pod 名称中的整数。 在只有三个 OSD 的集群中,必须将 FORCE_OSD_REMOVAL 值更改为 true,或者在除去 OSD 之后,空间不足的集群无法复原所有三个数据副本。

  4. 通过检查 ocs-osd-removal-job pod 的状态,验证是否已成功除去 OSD。

    	oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
    
  5. 验证 OSD 移除是否已完成。

    	oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'
    

    示例输出

    	2023-03-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
    

添加新的存储节点

在添加新的存储节点之前,请确保已为群集中的所有存储节点完成了前面的步骤。

重大更新 次要更新 工人替换

  1. 如果在安装期间通过指定节点名将 ODF 部署限制为一部分工作程序节点,那么必须更新 ocscluster CRD 以包含新名称。

    如果您没有将配置仅限于某些工作节点,则无需更新 ocscluster CRD。

    	oc edit ocscluster
    
    	apiVersion: ocs.ibm.io/v1
    	kind: OcsCluster
    	metadata:
    	name: ocscluster-auto
    	spec:
    	. . .
    	osdSize: 250Gi
    	osdStorageClassName: ibmc-vpc-block-metro-10iops-tier
    	workerNodes:
    	- NODE-NAME # Example 10.248.128.42
    	- NODE-NAME
    	- NODE-NAME
    
  2. 等待 OpenShift Data Foundation pod 部署到新的工作程序。 验证是否已创建新的持久卷,以及所有 pod 是否处于 Running 状态。

    	oc get pv
    	oc get ocscluster
    	oc get pods -n openshift-storage
    
  3. 验证所有其他必需的 OpenShift Data Foundation pod 是否处于“正在运行”状态。

    	oc get pod -n openshift-storage | grep mon
    

    示例输出:

    	rook-ceph-mon-a-cd575c89b-b6k66         2/2     Running
    	0          38m
    	rook-ceph-mon-b-6776bc469b-tzzt8        2/2     Running
    	0          38m
    	rook-ceph-mon-d-5ff5d488b5-7v8xh        2/2     Running
    	0          4m8s
    
  4. 验证新的 OSD pod 是否在替换节点上运行。

    	oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
    

更新 OpenShift Data Foundation 附加组件

重大更新

  1. 请检查现有版本。

    	ibmcloud oc cluster addon ls --cluster CLUSTER
    
  2. 更新附加组件。

    	ibmcloud oc cluster addon update openshift-data-foundation --cluster CLUSTER --version VERSION
    
  3. 验证是否更新了附加组件。

    	ibmcloud oc cluster addon ls --cluster CLUSTER
    

更新集群资源

重大更新

  1. 获取 ocscluster 资源的名称。

    	oc get ocscluster
    

    示例输出

    	NAME             AGE
    	ocscluster-vpc   19d
    
  2. 运行以下命令以编辑您的 ocscluster 资源。

    	oc edit ocscluster OCS-CLUSTER-NAME
    
  3. ocsUpgrade 参数设置为 true

    	...
    	spec:
    		billingType: hourly
    	monSize: 20Gi
    	monStorageClassName: ibmc-vpc-block-10iops-tier
    	numOfOsd: 1
    	ocsUpgrade: true
    	osdSize: 250Gi
    	osdStorageClassName: ibmc-vpc-block-10iops-tier
    	status:
    		storageClusterStatus: Decreasing the capacity not allowed
    
  4. 保存并关闭该文件。

  5. 请等待更新完成。

  6. 验证是否正确部署了 storageclustercephcluster 资源。

    	oc get storagecluster -n openshift-storage
    	NAME                 AGE   PHASE   EXTERNAL   CREATED AT             VERSION
    	ocs-storagecluster   43h   Ready              2023-06-21T09:22:00Z   4.11.0
    
    	oc get cephcluster -n openshift-storage
    	NAME                             DATADIRHOSTPATH   MONCOUNT   AGE   PHASE   MESSAGE                        HEALTH      EXTERNAL
    	ocs-storagecluster-cephcluster   /var/lib/rook     3          43h   Ready   Cluster created successfully   HEALTH_OK   
    
    	oc get csv -n openshift-storage
    	NAME                              DISPLAY                       VERSION   REPLACES                          PHASE
    	mcg-operator.v4.11.8              NooBaa Operator               4.11.8    mcg-operator.v4.11.7              Succeeded
    	ocs-operator.v4.11.8              OpenShift Container Storage   4.11.8    ocs-operator.v4.11.7              Succeeded
    	odf-csi-addons-operator.v4.11.8   CSI Addons                    4.11.8    odf-csi-addons-operator.v4.11.7   Succeeded
    	odf-operator.v4.11.8              OpenShift Data Foundation     4.11.8    odf-operator.v4.11.7              Succeeded