第 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注入一个新的
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打开 YAML 文件,并从
mon容器复制命令和参数(请参见以下示例中的容器列表)。这是monmap更改所需要的。[...] containers: - args: - --fsid=41a537f2-f282-428e-989f-a9e07be32e47 - --keyring=/etc/ceph/keyring-store/keyring - --log-to-stderr=true - --err-to-stderr=true - --mon-cluster-log-to-stderr=true - '--log-stderr-prefix=debug ' - --default-log-to-file=false - --default-mon-cluster-log-to-file=false - --mon-host=$(ROOK_CEPH_MON_HOST) - --mon-initial-members=$(ROOK_CEPH_MON_INITIAL_MEMBERS) - --id=b - --setuser=ceph - --setgroup=ceph - --foreground - --public-addr=10.100.13.242 - --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db - --public-bind-addr=$(ROOK_POD_IP) command: - ceph-mon [...]清理复制的
command和args字段以形成过去的命令,如下所示:# ceph-mon \ --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \ --keyring=/etc/ceph/keyring-store/keyring \ --log-to-stderr=true \ --err-to-stderr=true \ --mon-cluster-log-to-stderr=true \ --log-stderr-prefix=debug \ --default-log-to-file=false \ --default-mon-cluster-log-to-file=false \ --mon-host=$ROOK_CEPH_MON_HOST \ --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \ --id=b \ --setuser=ceph \ --setgroup=ceph \ --foreground \ --public-addr=10.100.13.242 \ --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \ --public-bind-addr=$ROOK_POD_IP注意确保删除括起了
--log-stderr-prefix标记的单引号,以及包括ROOK_CEPH_MON_MON_MON_MON_HOST、ROOK_CEPH_MON_MON_CEPH_MON_INITIAL_MEMBERS和ROOK_POD_IP变量的括号。修补
rook-ceph-mon-b部署,在不删除mon的情况下停止这个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": []}]}}}}'在
mon-bpod 上执行以下步骤:连接到健康
mon的 pod 并运行以下命令:# oc -n openshift-storage exec -it <mon-pod> bash设置变量。
# monmap_path=/tmp/monmap将
monmap提取到一个文件,从健康的mon部署中粘贴 cephmon命令并添加--extract-monmap=${monmap_path}标记。# ceph-mon \ --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \ --keyring=/etc/ceph/keyring-store/keyring \ --log-to-stderr=true \ --err-to-stderr=true \ --mon-cluster-log-to-stderr=true \ --log-stderr-prefix=debug \ --default-log-to-file=false \ --default-mon-cluster-log-to-file=false \ --mon-host=$ROOK_CEPH_MON_HOST \ --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \ --id=b \ --setuser=ceph \ --setgroup=ceph \ --foreground \ --public-addr=10.100.13.242 \ --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \ --public-bind-addr=$ROOK_POD_IP \ --extract-monmap=${monmap_path}检查
monmap的内容。# monmaptool --print /tmp/monmap从
monmap中删除错误的mons。# monmaptool ${monmap_path} --rm <bad_mon>在本例中,我们移除了
mon0和mon2:# monmaptool ${monmap_path} --rm a # monmaptool ${monmap_path} --rm c把修改过的
monmap注入到健康的mon中,粘贴 cephmon命令并添加--inject-monmap=${monmap_path}标记:# ceph-mon \ --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \ --keyring=/etc/ceph/keyring-store/keyring \ --log-to-stderr=true \ --err-to-stderr=true \ --mon-cluster-log-to-stderr=true \ --log-stderr-prefix=debug \ --default-log-to-file=false \ --default-mon-cluster-log-to-file=false \ --mon-host=$ROOK_CEPH_MON_HOST \ --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \ --id=b \ --setuser=ceph \ --setgroup=ceph \ --foreground \ --public-addr=10.100.13.242 \ --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \ --public-bind-addr=$ROOK_POD_IP \ --inject-monmap=${monmap_path}- 退出 shell 以继续。
编辑 Rook
configmaps。编辑 operator 用来跟踪
mons的configmap。# oc -n openshift-storage edit configmap rook-ceph-mon-endpoints验证在数据元素中,您可以看到如下三个
mon(具体取决于您的moncount,可能会更多):data: a=10.100.35.200:6789;b=10.100.13.242:6789;c=10.100.35.12:6789从列表中删除有问题的
mons,以使用一个好的mon结束。例如:data: b=10.100.13.242:6789- 保存文件并退出。
现在,您需要使用用于
mons和其他组件的Secret。为变量
good_mon_id设置一个值。例如:
# good_mon_id=b您可以使用
oc patch命令来修补rook-ceph-configsecret,并更新两个键/值对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}"'"}}'注意如果使用
hostNetwork: true,则需要将mon_host变量替换为代表mon固定到的节点 IP(nodeSelector)。这是因为在那个 "mode" 中不存在rook-ceph-mon-* 服务。
重新启动
mon。您需要使用原始
ceph-mon命令重启好的monpod,以获取这些更改。在
mon部署 YAML 文件的备份中使用oc replace命令:# oc replace --force -f rook-ceph-mon-b-deployment.yaml注意选项
--force删除部署并创建新部署。验证集群的状态。
状态应该在仲裁中显示
mon。如果状态正常,您的集群应该再次处于健康状态。
删除不再预期在仲裁中的两个 mon 部署。
例如:
# oc delete deploy <rook-ceph-mon-1> # oc delete deploy <rook-ceph-mon-2>在本例中,要删除的部署有
rook-ceph-mon-a和rook-ceph-mon-c。重启 Operator。
再次启动 rook 运算符,以恢复监控集群的健康状况。
注意忽略多个资源已存在的错误是安全的。
# oc -n openshift-storage scale deployment rook-ceph-operator --replicas=1根据
mon数量,Operator 会自动添加更多mons来再次增加仲裁大小。