11장. OpenShift Data Foundation에서 모니터 Pod 복원
세 가지 모두 중단되고 OpenShift Data Foundation에서 모니터 Pod를 자동으로 복구할 수 없는 경우 모니터 Pod를 복원합니다.
절차
rook-ceph-operator및ocsOperator 배포를 축소합니다.# oc scale deployment rook-ceph-operator --replicas=0 -n openshift-storage# oc scale deployment ocs-operator --replicas=0 -n openshift-storageopenshift-storage네임스페이스에 모든 배포의 백업을 생성합니다.# mkdir backup# cd backup# oc project openshift-storage# for d in $(oc get deployment|awk -F' ' '{print $1}'|grep -v NAME); do echo $d;oc get deployment $d -o yaml > oc_get_deployment.${d}.yaml; doneOSD 배포를 패치하여
livenessProbe매개변수를 제거하고 command 매개변수를sleep로 사용하여 실행합니다.# for i in $(oc get deployment -l app=rook-ceph-osd -oname);do oc patch ${i} -n openshift-storage --type='json' -p '[{"op":"remove", "path":"/spec/template/spec/containers/0/livenessProbe"}]' ; oc patch ${i} -n openshift-storage -p '{"spec": {"template": {"spec": {"containers": [{"name": "osd", "command": ["sleep", "infinity"], "args": []}]}}}}' ; done모든 OSD에서
monstore클러스터 맵을 검색합니다.recover_mon.sh스크립트를 생성합니다.#!/bin/bash ms=/tmp/monstore rm -rf $ms mkdir $ms for osd_pod in $(oc get po -l app=rook-ceph-osd -oname -n openshift-storage); do echo "Starting with pod: $osd_pod" podname=$(echo $osd_pod|sed 's/pod\///g') oc exec $osd_pod -- rm -rf $ms oc cp $ms $podname:$ms rm -rf $ms mkdir $ms echo "pod in loop: $osd_pod ; done deleting local dirs" oc exec $osd_pod -- ceph-objectstore-tool --type bluestore --data-path /var/lib/ceph/osd/ceph-$(oc get $osd_pod -ojsonpath='{ .metadata.labels.ceph_daemon_id }') --op update-mon-db --no-mon-config --mon-store-path $ms echo "Done with COT on pod: $osd_pod" oc cp $podname:$ms $ms echo "Finished pulling COT data from pod: $osd_pod" donerecover_mon.sh스크립트를 실행합니다.# chmod +x recover_mon.sh# ./recover_mon.sh
MON 배포를 패치하고 command 매개변수를
sleep로 사용하여 실행합니다.MON 배포를 편집합니다.
# for i in $(oc get deployment -l app=rook-ceph-mon -oname);do oc patch ${i} -n openshift-storage -p '{"spec": {"template": {"spec": {"containers": [{"name": "mon", "command": ["sleep", "infinity"], "args": []}]}}}}'; doneMON 배포를 패치하여
initialDelaySeconds를 늘립니다.# oc get deployment rook-ceph-mon-a -o yaml | sed "s/initialDelaySeconds: 10/initialDelaySeconds: 2000/g" | oc replace -f -# oc get deployment rook-ceph-mon-b -o yaml | sed "s/initialDelaySeconds: 10/initialDelaySeconds: 2000/g" | oc replace -f -# oc get deployment rook-ceph-mon-c -o yaml | sed "s/initialDelaySeconds: 10/initialDelaySeconds: 2000/g" | oc replace -f -
이전에 검색한
monstore를 mon-a pod에 복사합니다.# oc cp /tmp/monstore/ $(oc get po -l app=rook-ceph-mon,mon=a -oname |sed 's/pod\///g'):/tmp/MON 포드로 이동하여 검색된
monstore의 소유권을 변경합니다.# oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)# chown -R ceph:ceph /tmp/monstoremon db를 다시 빌드하기 전에 키링 템플릿 파일을 복사합니다.# oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)# cp /etc/ceph/keyring-store/keyring /tmp/keyring# cat /tmp/keyring [mon.] key = AQCleqldWqm5IhAAgZQbEzoShkZV42RiQVffnA== caps mon = "allow *" [client.admin] key = AQCmAKld8J05KxAArOWeRAw63gAwwZO5o75ZNQ== auid = 0 caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *”각 시크릿에서 다른 모든 Ceph 데몬(MGR, MDS, RGW, Crash, CSI 프로비저너)의 키를 식별합니다.
# oc get secret rook-ceph-mds-ocs-storagecluster-cephfilesystem-a-keyring -ojson | jq .data.keyring | xargs echo | base64 -d [mds.ocs-storagecluster-cephfilesystem-a] key = AQB3r8VgAtr6OhAAVhhXpNKqRTuEVdRoxG4uRA== caps mon = "allow profile mds" caps osd = "allow *" caps mds = "allow"키링 파일의 예:
/etc/ceph/ceph.client.admin.keyring:[mon.] key = AQDxTF1hNgLTNxAAi51cCojs01b4I5E6v2H8Uw== caps mon = "allow " [client.admin] key = AQDxTF1hpzguOxAA0sS8nN4udoO35OEbt3bqMQ== caps mds = "allow " caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" [mds.ocs-storagecluster-cephfilesystem-a] key = AQCKTV1horgjARAA8aF/BDh/4+eG4RCNBCl+aw== caps mds = "allow" caps mon = "allow profile mds" caps osd = "allow *" [mds.ocs-storagecluster-cephfilesystem-b] key = AQCKTV1hN4gKLBAA5emIVq3ncV7AMEM1c1RmGA== caps mds = "allow" caps mon = "allow profile mds" caps osd = "allow *" [client.rgw.ocs.storagecluster.cephobjectstore.a] key = AQCOkdBixmpiAxAA4X7zjn6SGTI9c1MBflszYA== caps mon = "allow rw" caps osd = "allow rwx" [mgr.a] key = AQBOTV1hGYOEORAA87471+eIZLZtptfkcHvTRg== caps mds = "allow *" caps mon = "allow profile mgr" caps osd = "allow *" [client.crash] key = AQBOTV1htO1aGRAAe2MPYcGdiAT+Oo4CNPSF1g== caps mgr = "allow rw" caps mon = "allow profile crash" [client.csi-cephfs-node] key = AQBOTV1hiAtuBBAAaPPBVgh1AqZJlDeHWdoFLw== caps mds = "allow rw" caps mgr = "allow rw" caps mon = "allow r" caps osd = "allow rw tag cephfs *=" [client.csi-cephfs-provisioner] key = AQBNTV1hHu6wMBAAzNXZv36aZJuE1iz7S7GfeQ== caps mgr = "allow rw" caps mon = "allow r" caps osd = "allow rw tag cephfs metadata=" [client.csi-rbd-node] key = AQBNTV1h+LnkIRAAWnpIN9bUAmSHOvJ0EJXHRw== caps mgr = "allow rw" caps mon = "profile rbd" caps osd = "profile rbd" [client.csi-rbd-provisioner] key = AQBNTV1hMNcsExAAvA3gHB2qaY33LOdWCvHG/A== caps mgr = "allow rw" caps mon = "profile rbd" caps osd = "profile rbd"중요-
client.csi관련 키링은 이전 키링 파일 출력을 참조하여 해당 OpenShift Data Foundation 시크릿에서 키를 가져온 후 기본한도를 추가합니다. - OSD 키는 복구 후 자동으로 추가됩니다.
-
mon-a 포드로 이동하여
monstore에monmap이 있는지 확인합니다.mon-a 포드로 이동합니다.
# oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)monstore에monmap이 있는지 확인합니다.# ceph-monstore-tool /tmp/monstore get monmap -- --out /tmp/monmap# monmaptool /tmp/monmap --print
선택 사항:
monmap이 누락된 경우 새monmap을 만듭니다.# monmaptool --create --add <mon-a-id> <mon-a-ip> --add <mon-b-id> <mon-b-ip> --add <mon-c-id> <mon-c-ip> --enable-all-features --clobber /root/monmap --fsid <fsid><mon-a-id>- 는 mon-a 포드의 ID입니다.
<mon-a-ip>- 는 mon-a 포드의 IP 주소입니다.
<mon-b-id>- 는 mon-b Pod의 ID입니다.
<mon-b-ip>- 은 mon-b 포드의 IP 주소입니다.
<mon-c-id>- 는 mon-c Pod의 ID입니다.
<mon-c-ip>- 는 mon-c 포드의 IP 주소입니다.
<fsid>- 는 파일 시스템 ID입니다.
monmap을 확인합니다.# monmaptool /root/monmap --printmonmap을 가져옵니다.중요이전에 생성한 키 링 파일을 사용합니다.
# ceph-monstore-tool /tmp/monstore rebuild -- --keyring /tmp/keyring --monmap /root/monmap# chown -R ceph:ceph /tmp/monstore이전
store.db파일의 백업을 생성합니다.# mv /var/lib/ceph/mon/ceph-a/store.db /var/lib/ceph/mon/ceph-a/store.db.corrupted# mv /var/lib/ceph/mon/ceph-b/store.db /var/lib/ceph/mon/ceph-b/store.db.corrupted# mv /var/lib/ceph/mon/ceph-c/store.db /var/lib/ceph/mon/ceph-c/store.db.corruptedrebuild
store.db파일을monstore디렉터리에 복사합니다.# mv /tmp/monstore/store.db /var/lib/ceph/mon/ceph-a/store.db# chown -R ceph:ceph /var/lib/ceph/mon/ceph-a/store.dbmonstore디렉터리를 다시 빌드한 후store.db파일을 로컬에서 MON 포드의 나머지 부분으로 복사합니다.# oc cp $(oc get po -l app=rook-ceph-mon,mon=a -oname | sed 's/pod\///g'):/var/lib/ceph/mon/ceph-a/store.db /tmp/store.db# oc cp /tmp/store.db $(oc get po -l app=rook-ceph-mon,mon=<id> -oname | sed 's/pod\///g'):/var/lib/ceph/mon/ceph-<id><id>- MON Pod의 ID입니다.
MON Pod의 나머지 부분으로 이동하여 복사된
monstore의 소유권을 변경합니다.# oc rsh $(oc get po -l app=rook-ceph-mon,mon=<id> -oname)# chown -R ceph:ceph /var/lib/ceph/mon/ceph-<id>/store.db<id>- MON Pod의 ID입니다.
패치된 변경 사항을 되돌립니다.
MON 배포의 경우:
# oc replace --force -f <mon-deployment.yaml><mon-deployment.yaml>- is the MON deployment yaml file
OSD 배포의 경우:
# oc replace --force -f <osd-deployment.yaml><osd-deployment.yaml>- OSD 배포 yaml 파일
MGR 배포의 경우:
# oc replace --force -f <mgr-deployment.yaml><mgr-deployment.yaml>MGR 배포 yaml 파일
중요MON, MGR 및 OSD Pod가 실행 중인지 확인합니다.
rook-ceph-operator및ocs-operator배포를 확장합니다.# oc -n openshift-storage scale deployment ocs-operator --replicas=1
검증 단계
Ceph 상태를 확인하여 CephFS가 실행 중인지 확인합니다.
# ceph -s출력 예:
cluster: id: f111402f-84d1-4e06-9fdb-c27607676e55 health: HEALTH_ERR 1 filesystem is offline 1 filesystem is online with fewer MDS than max_mds 3 daemons have recently crashed services: mon: 3 daemons, quorum b,c,a (age 15m) mgr: a(active, since 14m) mds: ocs-storagecluster-cephfilesystem:0 osd: 3 osds: 3 up (since 15m), 3 in (since 2h) data: pools: 3 pools, 96 pgs objects: 500 objects, 1.1 GiB usage: 5.5 GiB used, 295 GiB / 300 GiB avail pgs: 96 active+cleanMCG(Multicloud Object Gateway) 상태를 확인합니다. 활성 상태여야 하며 backupstore 및 bucketclass는
Ready상태가 되어야 합니다.noobaa status -n openshift-storage중요MCG가 활성 상태가 아니며
Ready상태가 아닌 백업 저장소 및 버킷 클래스의 경우 모든 MCG 관련 Pod를 다시 시작해야 합니다. 자세한 내용은 11.1절. “Multicloud 오브젝트 게이트웨이 복원”의 내용을 참조하십시오.
11.1. Multicloud 오브젝트 게이트웨이 복원 링크 복사링크가 클립보드에 복사되었습니다!
MCG(Multicloud Object Gateway)가 활성 상태가 아니며 백업 저장소 및 버킷 클래스가 Ready 상태가 아닌 경우 모든 MCG 관련 Pod를 다시 시작하고 MCG 상태를 확인하여 MCG 상태를 백업 및 실행 중인지 확인해야 합니다.
절차
MCG와 관련된 모든 Pod를 다시 시작합니다.
# oc delete pods <noobaa-operator> -n openshift-storage# oc delete pods <noobaa-core> -n openshift-storage# oc delete pods <noobaa-endpoint> -n openshift-storage# oc delete pods <noobaa-db> -n openshift-storage<noobaa-operator>- MCG Operator의 이름입니다.
<noobaa-core>- MCG 코어 Pod의 이름입니다.
<noobaa-endpoint>- MCG 끝점의 이름입니다.
<noobaa-db>- MCG db Pod의 이름입니다.
RADOS 오브젝트 게이트웨이(RGW)가 구성된 경우 Pod를 다시 시작합니다.
# oc delete pods <rgw-pod> -n openshift-storage<rgw-pod>- RGW Pod의 이름입니다.
OpenShift Container Platform 4.11에서 복구 후 RBD PVC가 애플리케이션 pod에 마운트되지 않습니다. 따라서 애플리케이션 Pod를 호스팅하는 노드를 다시 시작해야 합니다. 애플리케이션 Pod를 호스팅하는 노드 이름을 가져오려면 다음 명령을 실행합니다.
# oc get pods <application-pod> -n <namespace> -o yaml | grep nodeName
nodeName: node_name