第 13 章 在 OpenShift Data Foundation 中恢复 ceph-monitor 仲裁
在某些情况下,ceph-mons
可能会丢失仲裁。如果 mons
无法再次形成仲裁,则需要一个手动过程来再次执行仲裁。唯一的要求是至少有一个 mon
必须健康。以下步骤从仲裁中删除不健康的 mons
,并可让您使用单个 mon
重新组成仲裁,然后将仲裁恢复为原始大小。
例如,如果您有三个 mons
并失去仲裁,您需要从仲裁中删除两个有问题的 mons
,通知良好 mon
它是仲裁中唯一的 mon
,然后重启这个可以正常工作的 mon
。
流程
停止
rook-ceph-operator
,以便在修改monmap
时不通过mons
失败。oc -n openshift-storage scale deployment rook-ceph-operator --replicas=0
# oc -n openshift-storage scale deployment rook-ceph-operator --replicas=0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注入一个新的
monmap
。警告您必须非常仔细注入
monmap
。如果运行不正确,您的集群可以被永久销毁。Cephmonmap
来跟踪mon
仲裁。monmap
被更新为仅包含健康的 mon。在本例中,健康的 mon 是rook-ceph-mon-b
,而不健康的mons
为rook-ceph-mon-a
和rook-ceph-mon-c
。备份当前的
rook-ceph-mon-b
部署:oc -n openshift-storage get deployment rook-ceph-mon-b -o yaml > rook-ceph-mon-b-deployment.yaml
# oc -n openshift-storage get deployment rook-ceph-mon-b -o yaml > rook-ceph-mon-b-deployment.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 打开 YAML 文件,并从
mon
容器复制 命令和参数 (请参阅以下示例中的容器列表)。这是monmap
更改所需要的。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 清理复制的
command
和args
字段,以形成过去的命令,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意确保删除位于 the
-log-stderr-prefix
标记的单引号,以及有关正在传递ROOK_CEPH_MON_HOST
、ROOK_CEPH_MON_HOST、ROOK_CEPH_MON_INITIAL_MEMBERS
和ROOK_POD_IP
变量的父括号。修补
rook-ceph-mon-b
部署,在不删除mon
pod 的情况下停止这个mon
工作。oc -n openshift-storage patch deployment rook-ceph-mon-b --type='json' -p '[{"op":"remove", "path":"/spec/template/spec/containers/0/livenessProbe"}]' oc -n openshift-storage patch deployment rook-ceph-mon-b -p '{"spec": {"template": {"spec": {"containers": [{"name": "mon", "command": ["sleep", "infinity"], "args": []}]}}}}'
# oc -n openshift-storage patch deployment rook-ceph-mon-b --type='json' -p '[{"op":"remove", "path":"/spec/template/spec/containers/0/livenessProbe"}]' # oc -n openshift-storage patch deployment rook-ceph-mon-b -p '{"spec": {"template": {"spec": {"containers": [{"name": "mon", "command": ["sleep", "infinity"], "args": []}]}}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
mon-b
pod 上执行以下步骤:连接到健康
mon
的 pod 并运行以下命令:oc -n openshift-storage exec -it <mon-pod> bash
# oc -n openshift-storage exec -it <mon-pod> bash
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置变量。
monmap_path=/tmp/monmap
# monmap_path=/tmp/monmap
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
monmap
提取到文件,从良好mon
部署中粘贴 cephmon
命令并添加--extract-monmap=${monmap_path}
标志。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
monmap
的内容。monmaptool --print /tmp/monmap
# monmaptool --print /tmp/monmap
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从
monmap
中删除错误的mons
。monmaptool ${monmap_path} --rm <bad_mon>
# monmaptool ${monmap_path} --rm <bad_mon>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在这个示例中,我们删除
mon0
和mon2
:monmaptool ${monmap_path} --rm a monmaptool ${monmap_path} --rm c
# monmaptool ${monmap_path} --rm a # monmaptool ${monmap_path} --rm c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将修改后的
monmap
注入到正常的mon
中,粘贴 cephmon
命令并添加--inject-monmap=${monmap_path}
标志:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 退出 shell 以继续。
编辑 Rook
configmaps
。编辑 operator 用来跟踪
mons
的configmap
。oc -n openshift-storage edit configmap rook-ceph-mon-endpoints
# oc -n openshift-storage edit configmap rook-ceph-mon-endpoints
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证在数据元素中,您可以看到如下三个 mon (或者根据您的
moncount
),如下所示:data: a=10.100.35.200:6789;b=10.100.13.242:6789;c=10.100.35.12:6789
data: a=10.100.35.200:6789;b=10.100.13.242:6789;c=10.100.35.12:6789
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从列表中选择错误的
mons
,以使用一个好的mon
结束。例如:data: b=10.100.13.242:6789
data: b=10.100.13.242:6789
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存文件并退出。
现在,您需要调整用于
mons
和其他组件的Secret
。为变量
good_mon_id
设置一个值。例如:
good_mon_id=b
# good_mon_id=b
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以使用
oc patch
命令来修补rook-ceph-config
secret,并更新两个键/值对mon_host
和mon_initial_members
。mon_host=$(oc -n openshift-storage get svc rook-ceph-mon-b -o jsonpath='{.spec.clusterIP}') oc -n openshift-storage patch secret rook-ceph-config -p '{"stringData": {"mon_host": "[v2:'"${mon_host}"':3300,v1:'"${mon_host}"':6789]", "mon_initial_members": "'"${good_mon_id}"'"}}'
# mon_host=$(oc -n openshift-storage get svc rook-ceph-mon-b -o jsonpath='{.spec.clusterIP}') # oc -n openshift-storage patch secret rook-ceph-config -p '{"stringData": {"mon_host": "[v2:'"${mon_host}"':3300,v1:'"${mon_host}"':6789]", "mon_initial_members": "'"${good_mon_id}"'"}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果使用
hostNetwork: true
,则需要将mon_host
var 替换为mon
固定到的节点 IP (nodeSelector
)。这是因为在那个 "mode" 中没有创建rook-ceph-mon
Escalation 服务。
重新启动
mon
。您需要使用原始
ceph-
命令重启良好的 mon pod,以获取这些更改。mon
在
mon
部署 YAML 文件的备份中使用oc replace
命令:oc replace --force -f rook-ceph-mon-b-deployment.yaml
# oc replace --force -f rook-ceph-mon-b-deployment.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意option-force
删除部署并创建一个新部署。验证集群的状态。
状态应该在仲裁中显示
mon
。如果状态正常,您的集群应该再次处于健康状态。
删除不再预期在仲裁中的两个 mon 部署。
例如:
oc delete deploy <rook-ceph-mon-1> oc delete deploy <rook-ceph-mon-2>
# oc delete deploy <rook-ceph-mon-1> # oc delete deploy <rook-ceph-mon-2>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,要删除的部署有
rook-ceph-mon-a
和rook-ceph-mon-c
。重启 Operator。
再次启动 rook 运算符,以恢复监控集群的健康状况。
注意忽略多个资源已存在的错误是安全的。
oc -n openshift-storage scale deployment rook-ceph-operator --replicas=1
# oc -n openshift-storage scale deployment rook-ceph-operator --replicas=1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据
mon
数量,Operator 会自动添加更多mons
来再次增加仲裁大小。