12장. OpenShift Data Foundation에서 모니터 Pod 복원
3개의 모든 포드가 중단되고 OpenShift Data Foundation이 모니터 Pod를 자동으로 복구할 수 없는 경우 모니터 포드를 복원합니다.
이는 재해 복구 절차이며 Red Hat 지원 팀의 지침에 따라 수행해야 합니다. Red Hat 지원 팀에 문의하십시오. https://access.redhat.com/support
프로세스
rook-ceph-operator및ocs operator배포를 축소합니다.oc scale deployment rook-ceph-operator --replicas=0 -n openshift-storage
# oc scale deployment rook-ceph-operator --replicas=0 -n openshift-storageCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc scale deployment ocs-operator --replicas=0 -n openshift-storage
# oc scale deployment ocs-operator --replicas=0 -n openshift-storageCopy to Clipboard Copied! Toggle word wrap Toggle overflow openshift-storage네임스페이스에 모든 배포의 백업을 생성합니다.mkdir backup
# mkdir backupCopy to Clipboard Copied! Toggle word wrap Toggle overflow cd backup
# cd backupCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc project openshift-storage
# oc project openshift-storageCopy to Clipboard Copied! Toggle word wrap Toggle overflow 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; done# 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; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow OSD(오브젝트 스토리지 장치) 배포를 패치하여
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# 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": []}]}}}}' ; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow tar를 OSD에 복사합니다.for i in `oc get pods -l app=rook-ceph-osd -o name | sed -e "s/pod\///g"` ; do cat /usr/bin/tar | oc exec -i ${i} -- bash -c 'cat - >/usr/bin/tar' ; oc exec -i ${i} -- bash -c 'chmod +x /usr/bin/tar' ;donefor i in `oc get pods -l app=rook-ceph-osd -o name | sed -e "s/pod\///g"` ; do cat /usr/bin/tar | oc exec -i ${i} -- bash -c 'cat - >/usr/bin/tar' ; oc exec -i ${i} -- bash -c 'chmod +x /usr/bin/tar' ;doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 참고tar 바이너리를 OSD에 복사하는 동안
tar바이너리가 포드의 컨테이너 이미지 OS와 일치하는지 확인하는 것이 중요합니다. macOS, Ubuntu 등과 같은 다른 OS에서 바이너리를 복사하면 호환성 문제가 발생할 수 있습니다.모든 OSD에서
monstore클러스터 맵을 검색합니다.recover_mon.sh스크립트를 생성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow recover_mon.sh스크립트를 실행합니다.chmod +x recover_mon.sh
# chmod +x recover_mon.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow ./recover_mon.sh
# ./recover_mon.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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": []}]}}}}'; done# 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": []}]}}}}'; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow MON 배포를 패치하여
initialDelaySeconds를 늘립니다.for i in a b c ; do oc get deployment rook-ceph-mon-${i} -o yaml | sed "s/initialDelaySeconds: 10/initialDelaySeconds: 10000/g" | oc replace -f - ; done# for i in a b c ; do oc get deployment rook-ceph-mon-${i} -o yaml | sed "s/initialDelaySeconds: 10/initialDelaySeconds: 10000/g" | oc replace -f - ; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow tar을 MON 포드에 복사합니다.for i in `oc get pods -l app=rook-ceph-mon -o name | sed -e "s/pod\///g"` ; do cat /usr/bin/tar | oc exec -i ${i} -- bash -c 'cat - >/usr/bin/tar' ; oc exec -i ${i} -- bash -c 'chmod +x /usr/bin/tar' ;done# for i in `oc get pods -l app=rook-ceph-mon -o name | sed -e "s/pod\///g"` ; do cat /usr/bin/tar | oc exec -i ${i} -- bash -c 'cat - >/usr/bin/tar' ; oc exec -i ${i} -- bash -c 'chmod +x /usr/bin/tar' ;doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 참고tar 바이너리를 MON에 복사하는 동안
tar바이너리가 포드의 컨테이너 이미지 OS와 일치하는지 확인하는 것이 중요합니다. macOS, Ubuntu 등과 같은 다른 OS에서 바이너리를 복사하면 호환성 문제가 발생할 수 있습니다.
이전에 검색한
monstore를 mon-a Pod에 복사합니다.oc cp /tmp/monstore/ $(oc get po -l app=rook-ceph-mon,mon=a -oname |sed 's/pod\///g'):/tmp/
# oc cp /tmp/monstore/ $(oc get po -l app=rook-ceph-mon,mon=a -oname |sed 's/pod\///g'):/tmp/Copy to Clipboard Copied! Toggle word wrap Toggle overflow MON 포드로 이동하여 검색된
monstore의 소유권을 변경합니다.oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)
# oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)Copy to Clipboard Copied! Toggle word wrap Toggle overflow chown -R ceph:ceph /tmp/monstore
# chown -R ceph:ceph /tmp/monstoreCopy to Clipboard Copied! Toggle word wrap Toggle overflow mon db를 다시 빌드하기 전에 인증 템플릿 파일을 복사합니다.oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)
# oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)Copy to Clipboard Copied! Toggle word wrap Toggle overflow cp /etc/ceph/keyring-store/keyring /tmp/keyring
# cp /etc/ceph/keyring-store/keyring /tmp/keyringCopy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다른 모든 Ceph 데몬(OSD, MGR, MDS 및 RGW)의 인증 키를 해당 시크릿에서 채웁니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 데몬 인증 키를 가져올 때 다음 명령을 사용합니다.
for i in `oc get secret | grep keyring| awk '{print $1}'` ; do oc get secret ${i} -ojson | jq .data.keyring | xargs echo | base64 -d ; done# for i in `oc get secret | grep keyring| awk '{print $1}'` ; do oc get secret ${i} -ojson | jq .data.keyring | xargs echo | base64 -d ; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 스크립트를 사용하여 OSD 키를 가져옵니다.
for i in `oc get pods -l app=rook-ceph-osd -o name | sed -e "s/pod\///g"` ; do oc exec -i ${i} -- bash -c 'cat /var/lib/ceph/osd/ceph-*/keyring ' ;done# for i in `oc get pods -l app=rook-ceph-osd -o name | sed -e "s/pod\///g"` ; do oc exec -i ${i} -- bash -c 'cat /var/lib/ceph/osd/ceph-*/keyring ' ;doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow mon 키 링을 로컬로 복사한 다음 이전 단계에서 캡처한 모든 데몬 키를 추가하고 MON Pod(mon-a) 중 하나로 다시 복사하여 편집합니다.
oc cp $(oc get po -l app=rook-ceph-mon,mon=a -oname|sed -e "s/pod\///g"):/etc/ceph/keyring-store/..data/keyring /tmp/keyring-mon-a
oc cp $(oc get po -l app=rook-ceph-mon,mon=a -oname|sed -e "s/pod\///g"):/etc/ceph/keyring-store/..data/keyring /tmp/keyring-mon-aCopy to Clipboard Copied! Toggle word wrap Toggle overflow vi /tmp/keyring-mon-a
vi /tmp/keyring-mon-aCopy to Clipboard Copied! Toggle word wrap Toggle overflow 예를 들어 키 링 파일은 다음과 같아야 합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 참고OSD 키 출력에
caps항목이 없는 경우 이전 인증 파일 예제에서 언급한 대로 모든 OSD 출력에caps를 추가해야 합니다.oc cp /tmp/keyring-mon-a $(oc get po -l app=rook-ceph-mon,mon=a -oname|sed -e "s/pod\///g"):/tmp/keyring
oc cp /tmp/keyring-mon-a $(oc get po -l app=rook-ceph-mon,mon=a -oname|sed -e "s/pod\///g"):/tmp/keyringCopy to Clipboard Copied! Toggle word wrap Toggle overflow mon-a 포드로 이동하여
monstore에monmap이 있는지 확인합니다.mon-a 포드로 이동합니다.
oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)
# oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)Copy to Clipboard Copied! Toggle word wrap Toggle overflow monstore에monmap이 있는지 확인합니다.ceph-monstore-tool /tmp/monstore get monmap -- --out /tmp/monmap
# ceph-monstore-tool /tmp/monstore get monmap -- --out /tmp/monmapCopy to Clipboard Copied! Toggle word wrap Toggle overflow monmaptool /tmp/monmap --print
# monmaptool /tmp/monmap --printCopy to Clipboard Copied! Toggle word wrap Toggle overflow
선택 사항:
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>
# 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>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <mon-a-id>- mon-a Pod의 ID입니다.
<mon-a-ip>- mon-a pod의 IP 주소입니다.
<mon-b-id>- mon-b Pod의 ID입니다.
<mon-b-ip>- mon-b pod의 IP 주소입니다.
<mon-c-id>- mon-c Pod의 ID입니다.
<mon-c-ip>- mon-c Pod의 IP 주소입니다.
<fsid>- 파일 시스템 ID입니다.
monmap을 확인합니다.monmaptool /root/monmap --print
# monmaptool /root/monmap --printCopy to Clipboard Copied! Toggle word wrap Toggle overflow monmap을 가져옵니다.중요이전에 생성한 키 링 파일을 사용합니다.
ceph-monstore-tool /tmp/monstore rebuild -- --keyring /tmp/keyring --monmap /root/monmap
# ceph-monstore-tool /tmp/monstore rebuild -- --keyring /tmp/keyring --monmap /root/monmapCopy to Clipboard Copied! Toggle word wrap Toggle overflow chown -R ceph:ceph /tmp/monstore
# chown -R ceph:ceph /tmp/monstoreCopy to Clipboard Copied! Toggle word wrap Toggle overflow 이전
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-a/store.db /var/lib/ceph/mon/ceph-a/store.db.corruptedCopy to Clipboard Copied! Toggle word wrap Toggle overflow mv /var/lib/ceph/mon/ceph-b/store.db /var/lib/ceph/mon/ceph-b/store.db.corrupted
# mv /var/lib/ceph/mon/ceph-b/store.db /var/lib/ceph/mon/ceph-b/store.db.corruptedCopy to Clipboard Copied! Toggle word wrap Toggle overflow mv /var/lib/ceph/mon/ceph-c/store.db /var/lib/ceph/mon/ceph-c/store.db.corrupted
# mv /var/lib/ceph/mon/ceph-c/store.db /var/lib/ceph/mon/ceph-c/store.db.corruptedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 다시 빌드된
store.db파일을monstore디렉터리에 복사합니다.mv /tmp/monstore/store.db /var/lib/ceph/mon/ceph-a/store.db
# mv /tmp/monstore/store.db /var/lib/ceph/mon/ceph-a/store.dbCopy to Clipboard Copied! Toggle word wrap Toggle overflow chown -R ceph:ceph /var/lib/ceph/mon/ceph-a/store.db
# chown -R ceph:ceph /var/lib/ceph/mon/ceph-a/store.dbCopy to Clipboard Copied! Toggle word wrap Toggle overflow monstore디렉터리를 다시 빌드한 후store.db파일을 로컬에서 MON pod로 복사합니다.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 $(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.dbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 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>
# 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>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <id>- MON Pod의 ID입니다.
나머지 MON 포드로 이동하여 복사한
monstore의 소유권을 변경합니다.oc rsh $(oc get po -l app=rook-ceph-mon,mon=<id> -oname)
# oc rsh $(oc get po -l app=rook-ceph-mon,mon=<id> -oname)Copy to Clipboard Copied! Toggle word wrap Toggle overflow chown -R ceph:ceph /var/lib/ceph/mon/ceph-<id>/store.db
# chown -R ceph:ceph /var/lib/ceph/mon/ceph-<id>/store.dbCopy to Clipboard Copied! Toggle word wrap Toggle overflow <id>- MON Pod의 ID입니다.
패치된 변경 사항을 되돌립니다.
MON 배포의 경우:
oc replace --force -f <mon-deployment.yaml>
# oc replace --force -f <mon-deployment.yaml>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <mon-deployment.yaml>- MON 배포 yaml 파일
OSD 배포의 경우:
oc replace --force -f <osd-deployment.yaml>
# oc replace --force -f <osd-deployment.yaml>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <osd-deployment.yaml>- OSD 배포 yaml 파일
MGR 배포의 경우:
oc replace --force -f <mgr-deployment.yaml>
# oc replace --force -f <mgr-deployment.yaml>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <mgr-deployment.yaml>MGR 배포 yaml 파일입니까?
중요MON, MGR 및 OSD Pod가 실행 중인지 확인합니다.
rook-ceph-operator및ocs-operator배포를 확장합니다.oc -n openshift-storage scale deployment rook-ceph-operator --replicas=1
# oc -n openshift-storage scale deployment rook-ceph-operator --replicas=1Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc -n openshift-storage scale deployment ocs-operator --replicas=1
# oc -n openshift-storage scale deployment ocs-operator --replicas=1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증 단계
Ceph 상태를 확인하여 CephFS가 실행 중인지 확인합니다.
ceph -s
# ceph -sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow MCG(Multicloud Object Gateway) 상태를 확인합니다. 활성화되어 있어야 하며 백업 저장소 및 버킷 클래스는
Ready상태에 있어야 합니다.noobaa status -n openshift-storage
noobaa status -n openshift-storageCopy to Clipboard Copied! Toggle word wrap Toggle overflow 중요MCG가 활성 상태가 아니고 백업 저장소 및 버킷 클래스가
Ready상태가 아닌 경우 모든 MCG 관련 Pod를 다시 시작해야 합니다. 자세한 내용은 12.1절. “Multicloud Object Gateway 복원”의 내용을 참조하십시오.
12.1. Multicloud Object Gateway 복원 링크 복사링크가 클립보드에 복사되었습니다!
MCG(Multicloud Object Gateway)가 활성 상태가 아니며 백업 저장소 및 버킷 클래스가 Ready 상태가 아닌 경우 모든 MCG 관련 Pod를 재시작하고 MCG 상태를 확인하여 MCG가 백업되고 실행 중인지 확인해야 합니다.
프로세스
MCG와 관련된 모든 Pod를 다시 시작합니다.
oc delete pods <noobaa-operator> -n openshift-storage
# oc delete pods <noobaa-operator> -n openshift-storageCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete pods <noobaa-core> -n openshift-storage
# oc delete pods <noobaa-core> -n openshift-storageCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete pods <noobaa-endpoint> -n openshift-storage
# oc delete pods <noobaa-endpoint> -n openshift-storageCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete pods <noobaa-db> -n openshift-storage
# oc delete pods <noobaa-db> -n openshift-storageCopy to Clipboard Copied! Toggle word wrap Toggle overflow <noobaa-operator>- MCG Operator의 이름입니다.
<noobaa-core>- MCG 코어 Pod의 이름입니다.
<noobaa-endpoint>- MCG 끝점의 이름입니다.
<noobaa-db>- MCG db Pod의 이름입니다.
RADOS Object Gateway(RGW)가 구성된 경우 포드를 다시 시작합니다.
oc delete pods <rgw-pod> -n openshift-storage
# oc delete pods <rgw-pod> -n openshift-storageCopy to Clipboard Copied! Toggle word wrap Toggle overflow <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
# oc get pods <application-pod> -n <namespace> -o yaml | grep nodeName
nodeName: node_name