2.4. 替换 VMware 基础架构上的存储节点
要替换正常运行的节点,请参阅:
要替换失败的节点,请参阅:
2.4.1. 在 VMware 用户置备的基础架构上替换操作节点
先决条件
- 确保将替换节点配置为与您替换的节点类似基础架构、资源和磁盘。
- 您必须登录到 OpenShift Container Platform 集群。
流程
找出该节点,并获取您要替换的节点上的标签:
$ oc get nodes --show-labels | grep <node_name>
<node_name>
- 指定替换的节点的名称。
识别要替换的节点中运行的监控器 pod(若有)和 OSD:
$ oc get pods -n openshift-storage -o wide | grep -i <node_name>
缩减上一步中标识的 pod 的部署:
例如:
$ 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>
排空节点:
$ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
删除节点:
$ oc delete node <node_name>
- 登录到 VMware vSphere 并终止您已识别的虚拟机(VM)。
- 在带有所需基础架构的 VMware vSphere 上创建新虚拟机。请参阅基础架构要求。
- 使用新虚拟机创建新的 OpenShift Container Platform worker 节点。
检查与处于
Pending
状态的 OpenShift Container Platform 相关的证书签名请求(CSR):$ oc get csr
批准新节点所需的所有 OpenShift Container Platform CSR:
$ oc adm certificate approve <certificate_name>
<certificate_name>
- 指定 CSR 的名称。
-
在 OpenShift Web 控制台中,点 Compute
Nodes。确认新节点处于 Ready 状态。 使用以下任一方法之一将 OpenShift Data Foundation 标签应用到新节点:
- 从用户界面
- 对于新节点,点击 Action Menu(⋮)→ Edit Labels。
-
添加
cluster.ocs.openshift.io/openshift-storage
,然后点 Save。
- 使用命令行界面
- 将 OpenShift Data Foundation 标签应用到新节点:
$ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
<new_node_name>
- 指定新节点的名称。
识别安装 OpenShift 本地存储 Operator 的命名空间,并将其分配给
local_storage_project
变量:$ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
例如:
$ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
echo $local_storage_project
输出示例:
openshift-local-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
:# 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 | grep Available
输出示例:
local-pv-551d950 512Gi RWO Delete Available localblock 26s
进入
openshift-storage
项目:$ oc project openshift-storage
从集群移除出现故障的 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 ID,以移除多个 OSD,例如
FAILED_OSD_IDS=0,1,2
。FORCE_OSD_REMOVAL
值必须在有三个 OSD 的集群中更改为true
,或者有足够空间的集群在移除 OSD 后恢复所有这三个数据副本。
通过检查
ocs-osd-removal-job
pod 的状态,验证 OSD 是否已成功移除。状态为
Completed
,确认 OSD 移除作业已成功。# oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
确保 OSD 移除已完成。
$ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'
输出示例:
2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
重要如果
ocs-osd-removal-job
失败,且 pod 处于预期的Completed
状态,请检查 pod 日志以进一步调试:例如:
# oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
识别与持久性卷声明 (PVC) 关联的持久性卷 (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
如果有一个 PV 处于
Released
状态,请删除它:# oc delete pv <persistent_volume>
例如:
# oc delete pv local-pv-d6bf175b
输出示例:
persistentvolume "local-pv-d9c5cbd6" 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-job
:# oc delete -n openshift-storage job ocs-osd-removal-job
输出示例:
job.batch "ocs-osd-removal-job" 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 数据基础容器集是否都处于
Running
状态。确保创建了新的 incremental
mon
,且处于Running
状态:$ 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
OSD 和监控 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.4.2. 在 VMware 安装程序置备的基础架构中替换操作节点
先决条件
- 确保将替换节点配置为与您替换的节点类似基础架构、资源和磁盘。
- 您必须登录到 OpenShift Container Platform 集群。
流程
-
登录 OpenShift Web 控制台,再点 Compute
Nodes。 - 确定需要替换的节点。记录其 Machine Name。
获取节点上的标签:
$ oc get nodes --show-labels | grep <node_name>
<node_name>
- 指定替换的节点的名称。
识别在节点上运行的
mon
(若有)和对象存储设备 (OSD) pod:$ oc get pods -n openshift-storage -o wide | grep -i <node_name>
缩减您在上一步中确定的 pod 的部署:
例如:
$ 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>
排空节点:
$ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
-
点 Compute
Machines。搜索所需的机器。 - 除了所需机器外,点击 Action 菜单(⋮)→ Delete Machine。
- 单击 Delete 以确认删除机器。会自动创建新机器。
等待新计算机启动并过渡到 Running 状态。
重要此活动可能至少需要 5 到 10 分钟或更多。
-
在 OpenShift Web 控制台中,点 Compute
Nodes。确认新节点处于 Ready 状态。 - 向节点物理地添加新设备。
使用以下任一方法之一将 OpenShift Data Foundation 标签应用到新节点:
- 从用户界面
- 对于新节点,点击 Action Menu(⋮)→ Edit Labels。
-
添加
cluster.ocs.openshift.io/openshift-storage
,然后点 Save。
- 使用命令行界面
- 将 OpenShift Data Foundation 标签应用到新节点:
$ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
<new_node_name>
- 指定新节点的名称。
识别安装 OpenShift 本地存储 Operator 的命名空间,并将其分配给
local_storage_project
变量:$ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
例如:
$ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
echo $local_storage_project
输出示例:
openshift-local-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
:# 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 | grep Available
输出示例:
local-pv-551d950 512Gi RWO Delete Available localblock 26s
进入
openshift-storage
项目:$ oc project openshift-storage
从集群移除出现故障的 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 ID,以移除多个 OSD,例如
FAILED_OSD_IDS=0,1,2
。FORCE_OSD_REMOVAL
值必须在有三个 OSD 的集群中更改为true
,或者有足够空间的集群在移除 OSD 后恢复所有这三个数据副本。
通过检查
ocs-osd-removal-job
pod 的状态,验证 OSD 是否已成功移除。状态为
Completed
,确认 OSD 移除作业已成功。# oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
确保 OSD 移除已完成。
$ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'
输出示例:
2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
重要如果
ocs-osd-removal-job
失败并且 pod 不在预期的Completed
状态,请检查 pod 日志来进一步调试。例如:
# oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
识别与持久性卷声明(PVC)关联的 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
如果有一个 PV 处于
Released
状态,请删除它:# oc delete pv <persistent_volume>
例如:
# oc delete pv local-pv-d6bf175b
输出示例:
persistentvolume "local-pv-d9c5cbd6" 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-job
:# oc delete -n openshift-storage job ocs-osd-removal-job
输出示例:
job.batch "ocs-osd-removal-job" 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 数据基础容器集是否都处于
Running
状态。确保创建了新的增量
mon
,并处于Running
状态。$ 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
OSD 和监控 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.4.3. 在 VMware 用户置备的基础架构中替换失败的节点
先决条件
- 确保将替换节点配置为与您替换的节点类似基础架构、资源和磁盘。
- 您必须登录到 OpenShift Container Platform 集群。
流程
找出该节点,并获取您要替换的节点上的标签:
$ oc get nodes --show-labels | grep <node_name>
<node_name>
- 指定替换的节点的名称。
识别要替换的节点中运行的监控器 pod(若有)和 OSD:
$ oc get pods -n openshift-storage -o wide | grep -i <node_name>
缩减上一步中标识的 pod 的部署:
例如:
$ 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>
- 登录到 VMware vSphere 并终止您已识别的虚拟机(VM)。
- 在带有所需基础架构的 VMware vSphere 上创建新虚拟机。请参阅基础架构要求。
- 使用新虚拟机创建新的 OpenShift Container Platform worker 节点。
检查与处于
Pending
状态的 OpenShift Container Platform 相关的证书签名请求(CSR):$ oc get csr
批准新节点所需的所有 OpenShift Container Platform CSR:
$ oc adm certificate approve <certificate_name>
<certificate_name>
- 指定 CSR 的名称。
-
在 OpenShift Web 控制台中,点 Compute
Nodes。确认新节点处于 Ready 状态。 使用以下任一方法之一将 OpenShift Data Foundation 标签应用到新节点:
- 从用户界面
- 对于新节点,点击 Action Menu(⋮)→ Edit Labels。
-
添加
cluster.ocs.openshift.io/openshift-storage
,然后点 Save。
- 使用命令行界面
- 将 OpenShift Data Foundation 标签应用到新节点:
$ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
<new_node_name>
- 指定新节点的名称。
识别安装 OpenShift 本地存储 Operator 的命名空间,并将其分配给
local_storage_project
变量:$ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
例如:
$ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
echo $local_storage_project
输出示例:
openshift-local-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
:# 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 | grep Available
输出示例:
local-pv-551d950 512Gi RWO Delete Available localblock 26s
进入
openshift-storage
项目:$ oc project openshift-storage
从集群移除出现故障的 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 ID,以移除多个 OSD,例如
FAILED_OSD_IDS=0,1,2
。FORCE_OSD_REMOVAL
值必须在有三个 OSD 的集群中更改为true
,或者有足够空间的集群在移除 OSD 后恢复所有这三个数据副本。
通过检查
ocs-osd-removal-job
pod 的状态,验证 OSD 是否已成功移除。状态为
Completed
,确认 OSD 移除作业已成功。# oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
确保 OSD 移除已完成。
$ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'
输出示例:
2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
重要如果
ocs-osd-removal-job
失败,且 pod 处于预期的Completed
状态,请检查 pod 日志以进一步调试:例如:
# oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
识别与持久性卷声明 (PVC) 关联的持久性卷 (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
如果有一个 PV 处于
Released
状态,请删除它:# oc delete pv <persistent_volume>
例如:
# oc delete pv local-pv-d6bf175b
输出示例:
persistentvolume "local-pv-d9c5cbd6" 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-job
:# oc delete -n openshift-storage job ocs-osd-removal-job
输出示例:
job.batch "ocs-osd-removal-job" 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 数据基础容器集是否都处于
Running
状态。确保创建了新的 incremental
mon
,且处于Running
状态:$ 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
OSD 和监控 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.4.4. 在 VMware 安装程序置备的基础架构中替换失败的节点
先决条件
- 确保将替换节点配置为与您替换的节点类似基础架构、资源和磁盘。
- 您必须登录到 OpenShift Container Platform 集群。
流程
-
登录 OpenShift Web 控制台,再点 Compute
Nodes。 - 确定需要替换的节点。记录其 Machine Name。
获取节点上的标签:
$ oc get nodes --show-labels | grep _<node_name>_
<node_name>
- 指定替换的节点的名称。
识别在节点上运行的
mon
(若有)和对象存储设备 (OSD) pod:$ oc get pods -n openshift-storage -o wide | grep -i _<node_name>_
缩减上一步中标识的 pod 的部署:
例如:
$ 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
-
点 Compute
Machines。搜索所需的机器。 - 除了所需机器外,点击 Action 菜单(⋮)→ Delete Machine。
- 点 Delete 以确认机器已被删除。会自动创建新机器。
等待新计算机启动并过渡到 Running 状态。
重要此活动可能至少需要 5 到 10 分钟或更多。
-
在 OpenShift Web 控制台中,点 Compute
Nodes。确认新节点处于 Ready 状态。 - 向节点物理地添加新设备。
使用以下任一方法之一将 OpenShift Data Foundation 标签应用到新节点:
- 从用户界面
- 对于新节点,点击 Action Menu(⋮)→ Edit Labels。
-
添加
cluster.ocs.openshift.io/openshift-storage
,然后点 Save。
- 使用命令行界面
- 将 OpenShift Data Foundation 标签应用到新节点:
$ oc label node _<new_node_name>_ cluster.ocs.openshift.io/openshift-storage=""
<new_node_name>
- 指定新节点的名称。
识别安装 OpenShift 本地存储 Operator 的命名空间,并将其分配给
local_storage_project
变量:$ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
例如:
$ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
echo $local_storage_project
输出示例:
openshift-local-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
。# 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 | grep Available
输出示例:
local-pv-551d950 512Gi RWO Delete Available localblock 26s
进入
openshift-storage
项目:$ oc project openshift-storage
从集群移除出现故障的 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 ID,以移除多个 OSD,例如
FAILED_OSD_IDS=0,1,2
。FORCE_OSD_REMOVAL
值必须在有三个 OSD 的集群中更改为true
,或者有足够空间的集群在移除 OSD 后恢复所有这三个数据副本。
通过检查
ocs-osd-removal-job
pod 的状态,验证 OSD 是否已成功移除。状态为
Completed
,确认 OSD 移除作业已成功。# oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
确保 OSD 移除已完成。
$ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'
输出示例:
2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
重要如果
ocs-osd-removal-job
失败并且 pod 不在预期的Completed
状态,请检查 pod 日志来进一步调试:例如:
# oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
识别与持久性卷声明(PVC)关联的 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
如果有一个 PV 处于
Released
状态,请删除它:# oc delete pv _<persistent_volume>_
例如:
# oc delete pv local-pv-d6bf175b
输出示例:
persistentvolume "local-pv-d9c5cbd6" 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-job
:# oc delete -n openshift-storage job ocs-osd-removal-job
输出示例:
job.batch "ocs-osd-removal-job" 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 数据基础容器集是否都处于
Running
状态。确保创建了新的 incremental
mon
,且处于Running
状态:$ 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
OSD 和监控 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
关键字。
- 如果验证步骤失败,请联系红帽支持团队。