更新或取代使用 OpenShift Data Foundation 的 VPC 工作者節點

Virtual Private Cloud

對於使用 OpenShift Data Foundation 等儲存解決方案的 VPC 群集,您必須依序對每個工作站節點進行警戒、排空和更新。 對於裸機工作節點,現在您可以使用 worker reload 指令,取代原先的 worker replace``。 如果您將 OpenShift Data Foundation 部署到群集中的工作人員節點子集中,則在更新工作人員節點後必須編輯 ocscluster 資源,以包含新的工作人員節點。

以下教程涵蓋主要更新和次要更新,以及 Worker 節點更新。

Major update
使用此標籤完成步驟以套用主要更新; 例如,如果您要將工作者節點更新至新的主要版本,例如從 4.11 更新至 4.12,以及將 OpenShift Data Foundation 從 4.11 更新至 4.12。
Minor update
使用此標籤完成步驟以套用修補程式更新,例如,如果您要從 4.12.15_1542_openshift 更新至 4.12.16_1544_openshift,同時保留 OpenShift Data Foundation 4.12 版。 您必須針對您要更新的每一個節點重複這些步驟。
Worker replace
如果您要更換相同修補程式版本的工作者節點,請使用此標籤步驟來完成步驟。 您必須針對要更換的每一個節點重複這些步驟。

在升級過程中跳過版本(例如從 4.8 升級至 )是不 4.12 被支援的。

請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

在更新工作者節點之前,請確保備份應用程式資料。 此外,計劃一次針對一個工作者節點完成下列步驟。 請針對每個您要更新的工作節點,重複上述步驟。

檢查儲存叢集的狀態

Major update Minor update Worker replace

  1. 執行以下指令以列出 Pod。 驗證 openshift-storage 命名空間中的所有 Pod 是否處於良好狀態。 處理所有未處於「Running」或「Completed」狀態的 Pod。

    	oc get pods -n openshift-storage
    
  2. 執行下列指令,並驗證 ocs-storagecluster 的 Phase 為 Ready。

    	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 Storage 的狀態。 確認健康是 HEALTH_OK,所有 OSD 都是 up 和 IN,所有 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 可能會危及使用者資料。

更新叢集主節點

Major update

  1. 如果您要將工作者節點更新為新的主要版本 (例如從 4.11 到 4.12),請先更新叢集主節點。

    	ibmcloud oc cluster master update --cluster CLUSTER_NAME --version MAJOR.MINOR.PATCH --force-update
    

    範例指令:

    	ibmcloud oc cluster master update --cluster mycluster --version 4.21.31 --force-update
    
  2. 請等待幾分鐘,然後確認主伺服器的更新是否已完成。

    	  ibmcloud oc cluster ls
    

決定您要更新或更換的儲存節點

Major update Minor update Worker replace

使用 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

確定儲存群集是健康的

Major update Minor update Worker replace

執行下列指令以檢查儲存群集的健康狀況。

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

繼續之前,請確定儲存群集是健康的。

對 OpenShift 資料基礎架構進行區隔與縮減規模

Major update Minor update Worker replace

在進行清空操作之前,先縮減「rook-ceph-mon」、「rook-ceph-osd」以及「crashcollector」的部署規模,可確保這些儲存程序能正常關閉,而非被強制終止。 執行 OSD 和監控 Pod 時,必須以正常方式關閉,以便 Ceph 能在節點離線期間安全地停止 I/O 並維持資料完整性。 當更新或更換後的節點重新加入叢集後,Rook-Ceph 操作員會自動將這些部署的副本數量擴展回原始數量。

  1. 封鎖節點。 將節點封鎖可防止在您縮減 ODF 部署規模期間,有任何 Pod 被排程至該節點。

    	oc adm cordon NODE_NAME
    

    輸出範例

    	node/10.241.0.4 cordoned
    
  2. 找出正在您要更新的節點上執行的 rook-ceph-mon 和 rook-ceph-osd 容器。 請注意輸出中的 pod 名稱——您在下一步驟會需要它們。

    	oc get pods -n openshift-storage -o wide | grep NODE_NAME
    

    部署名稱即為 Pod 名稱,不包含末尾的 ReplicaSet 哈希符號及 Pod ID 後綴。 例如,名為 rook-ceph-osd-1-6d9f99c68f-pgvxt 的 Pod 屬於部署 rook-ceph-osd-1,而名為 rook-ceph-mon-e-85fbb8bcc-kttbt 的 Pod 則屬於部署 rook-ceph-mon-e。

  3. 請縮減前一步驟中找到的 Pod 的部署規模。 請將 ROOK_CEPH_MON_DEPLOYMENT 和 ROOK_CEPH_OSD_DEPLOYMENT 替換為您根據 Pod 名稱推導出的部署名稱。 如果前一個指令顯示此節點上沒有任何 rook-ceph-mon 或 rook-ceph-osd pod,請跳過這兩個指令,並繼續執行 crashcollector 指令。

    	oc scale deployment ROOK_CEPH_MON_DEPLOYMENT --replicas=0 -n openshift-storage
    
    	oc scale deployment ROOK_CEPH_OSD_DEPLOYMENT --replicas=0 -n openshift-storage
    
    	oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=NODE_NAME --replicas=0 -n openshift-storage
    

    若該指令執行後回傳 error: no objects passed to scale,請執行 oc get pods -n openshift-storage -o wide | grep NODE_NAME | grep crashcollector,以確認此節點上沒有任何 crashcollector Pod 正在運行。 如果未返回任何 pod,您可以安全地跳過此指令並繼續操作。

釋放工作節點

Major update Minor update Worker replace

  1. 排除節點以移除所有 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"
    
  2. 如果任何 NooBaa 匣在排空過程中卡住,請依照以下順序刪除它們,以便將其重新排程至其他節點。

    	oc delete pod -n openshift-storage -l app=noobaa-db
    
    	oc delete pod -n openshift-storage -l app=noobaa-core
    
    	oc delete pod -n openshift-storage -l app=noobaa-endpoint
    
    	oc delete pod -n openshift-storage -l app=noobaa-operator
    
  3. 等到排水完成後,再完成下列步驟更新 Worker 節點。

清理裸機工作節點的持久性卷

Major update Minor update Worker replace

僅限裸機工作節點:若您正在更新或更換裸機工作節點,請完成以下步驟以清除 ODF 磁碟,並為新部署做好節點準備。 如果您正在使用虛擬伺服器實例 (VSI) 工作節點,請跳過本節,並繼續進行「更新工作節點」的步驟。

開始之前,請確保您已完成先前關於將工作節點隔離並排空的步驟。

  1. 請在裸機節點上清除 ODF 磁碟,以準備建立新的持久性卷。 在您正在更新的節點上啟動一個除錯 Pod。 請將 NODE_NAME 替換為您的裸機 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
    
  2. 在除錯艙內,切換至主機的根目錄。

    	chroot /host
    
  3. 將 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
    
  4. 請確認磁碟已清空,且不再含有任何檔案系統的特徵。

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

    輸出結果中,每個磁碟應顯示「Clean」,這表示所有檔案系統簽名均已移除。

  5. 退出除錯艙。

    	exit
    	exit
    
  6. 列出 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
    
  7. 刪除您正在更新的節點所對應的 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
    

完成這些步驟後,請繼續閱讀下一節以更新工作節點。 裸機節點重新載入後,系統會自動在該節點上建立並排程新的持久性卷。

更新工作站

Major update Minor update Worker replace

  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 節點。 對於裸金屬工作節點,請使用 worker reload 指令。 對於虛擬伺服器實體 (VSI) 工作節點,請使用 worker replace 指令。

裸金屬工作站節點:使用 worker reload 指令重新載入 Worker 節點。 此指令適用於 VPC 裸機工作節點。 sh {: pre} ibmcloud oc worker reload --worker NODE_NAME VSI 工作節點:Major update Minor update 以下為替換工作節點並套用最新修補程式更新的範例指令。 sh {: pre} ibmcloud oc worker replace -c CLUSTER --worker NODE_NAME --update VSI 工作節點:Worker replace 以下為不套用最新修補程式更新的工作節點替換範例指令。 sh {: pre} ibmcloud oc worker replace -c CLUSTER --worker NODE_NAME 更換 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
    

從舊節點清除資源

Major update Minor update Worker replace

當節點重新加入叢集後,Rook-Ceph 操作員會自動將 rook-ceph-mon、rook-ceph-osd 以及 crashcollector 的部署規模恢復至原先狀態。 在繼續之前,請確認 ODF Pod 是否正在運行。

  1. 請確認先前已縮減規模的 rook-ceph-mon 和 rook-ceph-osd Pod 已於更新後的節點上恢復至 Running 狀態。 請將「NODE_NAME」替換為已更新或已替換的節點名稱。

    	oc get pods -n openshift-storage -o wide | grep NODE_NAME
    

    請確認輸出結果顯示有 rook-ceph-mon 及 rook-ceph-osd 兩個 Pod,且狀態為 Running。 如果仍有任何 Pod 尚未出現,或尚未完成「Running」,請等待幾分鐘,並再次執行該指令,然後再繼續。

  2. 請確認 OSD Pod 已在更換後的節點上以「Running」狀態啟動。 請將 NODE_NAME 替換為新節點的名稱。

    	oc get pods -n openshift-storage -o wide | grep NODE_NAME | grep osd
    

    如果 Pod 正在執行中,請繼續將 OcsCluster 資源更新為新的節點。 若 pod 發生故障,請執行以下步驟。 若有超過一個 OSD Pod 未處於「Running」狀態,請停止操作並聯絡技術支援。 提交一則 支援案件。 在案例詳細資訊中,請務必包含任何相關的記錄檔、錯誤訊息或指令輸出。

  3. 導覽至 openshift-storage 專案。

    	oc project openshift-storage
    
  4. 從叢集中移除失敗的 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 值是 Pod 名稱中緊接在 rook-ceph-osd 字首之後的整數。 在只有三個 OSD 的叢集中,或在移除 OSD 之後,空間不足無法還原所有三個資料抄本的叢集中,FORCE_OSD_REMOVAL 值必須變更為 true。

  5. 透過檢查 ocs-osd-removal-job Pod 的狀態,驗證已順利移除 OSD。

    	oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
    
  6. 驗證 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
    
  7. 僅限裸機工作節點:移除 OSD 後,請識別所有處於「Released」狀態且與「localblock」儲存類別相關聯的持久性卷 (PV)。 移除 OSD 會使這些 PV 進入「Released」狀態,因此此步驟必須在移除 OSD 之後才能完成。

    	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
    
  8. 僅限裸機工作節點:若存在任何處於 Released 狀態的 PV,請將其刪除。 請將「PERSISTENT_VOLUME」替換為上一步驟中 PV 的名稱。

    	oc delete pv PERSISTENT_VOLUME
    

    範例指令

    	oc delete pv local-pv-d6bf175b
    

    輸出範例

    	persistentvolume "local-pv-d6bf175b" deleted
    

使用新節點更新 OcsCluster 資源

在繼續執行後續步驟之前,請務必確認您已針對此儲存節點完成前幾個步驟,再轉往叢集中的下一個節點。

Major update Minor update Worker replace

  1. 如果您在安裝期間透過指定節點名稱將 ODF 部署限制為工作者節點子集,則必須更新 ocscluster CRD 以包括新名稱。 若您已將 ODF 套用至所有工作節點,且未將部署範圍限制在部分節點上,請跳過此步驟,並繼續進行 「OpenShift Data Foundation」附加元件的更新。

    如果您沒有將設定僅限制於某些工作站節點,就不需要更新 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 附加程式

Major update

  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
    

更新叢集資源

Major update

  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. 驗證 storagecluster 和 cephcluster 資源都已正確部署。

    	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