2.2. 替换 IBM Z 或 LinuxONE 基础架构中的存储节点
您可以选择以下步骤之一来替换存储节点:
2.2.1. 替换 IBM Z 或 LinuxONE 基础架构上的操作节点
使用这个流程替换 IBM zSystem 或 LinuxONE 基础架构上的操作节点。
流程
识别节点,并在要替换的节点上获取标签。记录机架标签。
$ oc get nodes --show-labels | grep <node_name>
识别要替换的节点中运行的 mon (如果有)和对象存储设备(OSD)pod。
$ oc get pods -n openshift-storage -o wide | grep -i <node_name>
缩减上一步中确定的容器集部署。
例如:
$ oc scale deployment rook-ceph-mon-c --replicas=0 -n openshift-storage $ oc scale deployment rook-ceph-osd-0 --replicas=0 -n openshift-storage $ oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=<node_name> --replicas=0 -n openshift-storage
将节点标记为不可调度。
$ oc adm cordon <node_name>
删除处于 Terminating 状态的 pod。
$ oc get pods -A -o wide | grep -i <node_name> | awk '{if ($4 == "Terminating") system ("oc -n " $1 " delete pods " $2 " --grace-period=0 " " --force ")}'
排空节点。
$ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
删除节点。
$ oc delete node <node_name>
- 获取一个新的 IBM zSystem 存储节点作为替换。
检查与处于
Pending
状态的 OpenShift Data Foundation 相关的证书签名请求 (CSR):$ oc get csr
批准新节点所需的所有 OpenShift Data Foundation CSR:
$ oc adm certificate approve <Certificate_Name>
-
在 OpenShift Web 控制台中点 Compute
Nodes,确认新节点是否处于 Ready 状态。 使用以下任一方法之一将
openshift-storage
标签应用到新节点:- 从用户界面
-
对于新节点,点击 Action Menu(⋮)
Edit Labels -
添加
cluster.ocs.openshift.io/openshift-storage
并点 Save。
-
对于新节点,点击 Action Menu(⋮)
- 使用命令行界面
- 执行以下命令,将 OpenShift Data Foundation 标签应用到新节点:
$ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
将新的 worker 节点添加到
localVolumeDiscovery
和localVolumeSet
。更新
localVolumeDiscovery
定义,使其包含新节点并删除失败的节点。# oc edit -n local-storage-project localvolumediscovery auto-discover-devices [...] nodeSelector: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - server1.example.com - server2.example.com #- server3.example.com - newnode.example.com [...]
记住在退出编辑器之前进行保存。
在上例中,
server3.example.com
已被删除,newnode.example.com
是新节点。决定要编辑的
localVolumeSet
。在以下命令中,将 local-storage-project 替换为您的本地存储项目的名称。默认项目名称是 OpenShift Data Foundation 4.6 及之后的版本中的
openshift-local-storage
。之前的版本默认使用local-storage
。# oc get -n local-storage-project localvolumeset NAME AGE localblock 25h
更新
localVolumeSet
定义,使其包含新节点并删除失败的节点。# oc edit -n local-storage-project localvolumeset localblock [...] nodeSelector: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - server1.example.com - server2.example.com #- server3.example.com - newnode.example.com [...]
记住在退出编辑器之前进行保存。
在上例中,
server3.example.com
已被删除,newnode.example.com
是新节点。
验证新的
localblock
PV 是否可用。$ oc get pv | grep localblock CAPA- ACCESS RECLAIM STORAGE NAME CITY MODES POLICY STATUS CLAIM CLASS AGE local-pv- 931Gi RWO Delete Bound openshift-storage/ localblock 25h 3e8964d3 ocs-deviceset-2-0 -79j94 local-pv- 931Gi RWO Delete Bound openshift-storage/ localblock 25h 414755e0 ocs-deviceset-1-0 -959rp local-pv- 931Gi RWO Delete Available localblock 3m24s b481410 local-pv- 931Gi RWO Delete Bound openshift-storage/ localblock 25h d9c5cbd6 ocs-deviceset-0-0 -nvs68
更改到
openshift-storage
项目。$ oc project openshift-storage
从集群移除出现故障的 OSD。如果需要,您可以指定多个故障 OSD。
根据需要识别 PVC,我们需要删除与该特定 PVC 关联的 PV。
$ osd_id_to_remove=1 $ oc get -n openshift-storage -o yaml deployment rook-ceph-osd-${osd_id_to_remove} | grep ceph.rook.io/pvc
其中,
osd_id_to_remove
是 pod 名称中紧接在rook-ceph-osd-prefix
后面的整数。在本例中,部署名称为rook-ceph-osd-1
。输出示例:
ceph.rook.io/pvc: ocs-deviceset-localblock-0-data-0-g2mmc ceph.rook.io/pvc: ocs-deviceset-localblock-0-data-0-g2mmc
在本例中,PVC 名称为
ocs-deviceset-localblock-0-data-0-g2mmc
。从集群移除出现故障的 OSD。
$ oc process -n openshift-storage ocs-osd-removal -p FAILED_OSD_IDS=${osd_id_to_remove} |oc create -f -
您可以通过在 命令中添加逗号分隔的 OSD ID 来移除多个 OSD。(例如:FAILED_OSD_IDS=0,1,2)
警告这一步会导致 OSD 完全从集群中移除。确保提供了
osd_id_to_remove
的正确值。
通过检查
ocs-osd-removal
pod 的状态,验证 OSD 是否已成功移除。状态为
Completed
,确认 OSD 移除作业已成功。# oc get pod -l job-name=ocs-osd-removal-osd_id_to_remove -n openshift-storage
注意如果
ocs-osd-removal
失败且 pod 不处于预期的Completed
状态,请检查 pod 日志以进一步调试。例如:# oc logs -l job-name=ocs-osd-removal-osd_id_to_remove -n openshift-storage --tail=-1
可能需要手动清理移除的 OSD,如下所示:
ceph osd crush remove osd.osd_id_to_remove ceph osd rm osd_id_to_remove ceph auth del osd.osd_id_to_remove ceph osd crush rm osd_id_to_remove
删除与故障节点关联的 PV。
标识与 PVC 关联的 PV。
PVC 名称必须与从集群中删除故障 OSD 时获取的名称相同。
# oc get pv -L kubernetes.io/hostname | grep localblock | grep Released local-pv-5c9b8982 500Gi RWO Delete Released openshift-storage/ocs-deviceset-localblock-0-data-0-g2mmc localblock 24h worker-0
如果有一个 PV 处于
Released
状态,请将其删除。# oc delete pv <persistent-volume>
例如:
# oc delete pv local-pv-5c9b8982 persistentvolume "local-pv-5c9b8982" deleted
确定
crashcollector
pod 部署。$ oc get deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage
如果已存在
crashcollector
pod 部署,请将其删除。$ oc delete deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage
删除
ocs-osd-removal
任务。# oc delete job ocs-osd-removal-${osd_id_to_remove}
输出示例:
job.batch "ocs-osd-removal-0" deleted
验证步骤
验证输出中是否存在新节点:
$ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
点击 Workloads
Pods。确认新节点上至少以下 pod 处于 Running 状态: -
csi-cephfsplugin-*
-
csi-rbdplugin-*
-
- 验证所有其他所需的 OpenShift Data Foundation pod 是否处于 Running 状态。
验证新的对象存储设备(OSD)pod 是否在替换节点上运行:
$ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
可选:如果在集群中启用了数据加密,请验证新 OSD 设备是否已加密。
对于上一步中标识的每个新节点,请执行以下操作:
创建 debug pod 并为一个或多个所选主机打开 chroot 环境:
$ oc debug node/<node_name>
$ chroot /host
显示可用块设备列表:
$ lsblk
检查一个或多个
ocs-deviceset
名称旁的crypt
关键字。
- 如果验证步骤失败,请联系红帽支持团队。
2.2.2. 在 IBM Z 或 LinuxONE 基础架构中替换失败的节点
流程
-
登录 OpenShift Web 控制台,再点击 Compute
Nodes。 - 确定有故障的节点,再单击其 Machine Name。
- 点击 Actions → Edit Annotations,然后点 Add More。
-
添加
machine.openshift.io/exclude-node-draining
并点 Save。 -
点 Actions
Delete Machine,然后点 Delete。 会自动创建新机器。等待新机器启动。
重要此活动可能至少需要 5 到 10 分钟或更多。Ceph 周期内生成的 Ceph 错误是临时的,当您标记新节点并且可以正常工作时,会自动解决。
-
点 Compute
Nodes。确认新节点处于 Ready 状态。 使用以下任一方法之一将 OpenShift Data Foundation 标签应用到新节点:
- 从用户界面
-
对于新节点,点击 Action Menu(⋮)
Edit Labels。 -
添加
cluster.ocs.openshift.io/openshift-storage
,然后点 Save。
-
对于新节点,点击 Action Menu(⋮)
- 使用命令行界面
- 将 OpenShift Data Foundation 标签应用到新节点:
$ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
<new_node_name>
- 指定新节点的名称。
验证步骤
验证输出中是否存在新节点:
$ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= | cut -d' ' -f1
点击 Workloads
Pods。确认新节点上至少以下 pod 处于 Running 状态: -
csi-cephfsplugin-*
-
csi-rbdplugin-*
-
- 验证所有其他所需的 OpenShift Data Foundation pod 是否处于 Running 状态。
验证新的对象存储设备(OSD)pod 是否在替换节点上运行:
$ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
可选:如果在集群中启用了数据加密,请验证新 OSD 设备是否已加密。
对于上一步中标识的每个新节点,请执行以下操作:
创建 debug pod 并为一个或多个所选主机打开 chroot 环境:
$ oc debug node/<node_name>
$ chroot /host
显示可用块设备列表:
$ lsblk
检查一个或多个
ocs-deviceset
名称旁的crypt
关键字。
- 如果验证步骤失败,请联系红帽支持团队。