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 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": []}]}}}}' ; donetar를 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' ;done참고tar 바이너리를 OSD에 복사하는 동안
tar바이너리가 포드의 컨테이너 이미지 OS와 일치하는지 확인하는 것이 중요합니다. macOS, Ubuntu 등과 같은 다른 OS에서 바이너리를 복사하면 호환성 문제가 발생할 수 있습니다.모든 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 exec $osd_pod -- mkdir $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를 늘립니다.# 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 - ; donetar을 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참고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/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 데몬(OSD, MGR, MDS 및 RGW)의 인증 키를 해당 시크릿에서 채웁니다.
# 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"데몬 인증 키를 가져올 때 다음 명령을 사용합니다.
# 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다음 스크립트를 사용하여 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 ' ;donemon 키 링을 로컬로 복사한 다음 이전 단계에서 캡처한 모든 데몬 키를 추가하고 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-avi /tmp/keyring-mon-a예를 들어 키 링 파일은 다음과 같아야 합니다.
[mon.] key = AQCbQLRn0j9mKhAAJKWmMZ483QIpMwzx/yGSLw== caps mon = "allow *" [mds.ocs-storagecluster-cephfilesystem-a] key = AQBFQbRnYuB9LxAA8i1fCSAKQQsPuywZ0Jlc5Q== caps mon = "allow profile mds" caps osd = "allow *" caps mds = "allow" [mds.ocs-storagecluster-cephfilesystem-b] key = AQBHQbRnwHAOEBAAv+rBpYP5W8BmC7gLfLyk1w== caps mon = "allow profile mds" caps osd = "allow *" caps mds = "allow" [osd.0] key = AQAvQbRnjF0eEhAA3H0l9zvKGZZM9Up6fJajhQ== caps mgr = "allow profile osd" caps mon = "allow profile osd" caps osd = "allow *" [osd.1] key = AQA0QbRnq4cSGxAA7JpuK1+sq8gALNmMYFUMzw== caps mgr = "allow profile osd" caps mon = "allow profile osd" caps osd = "allow *" [osd.2] key = AQA3QbRn6JvcOBAAFKruZQhlQJKUOi9oxcN6fw== caps mgr = "allow profile osd" caps mon = "allow profile osd" caps osd = "allow *" [client.admin] key = AQCbQLRnSzOuLBAAK1cSgr2eIyrZV8mV28UfvQ== caps mds = "allow *" caps mon = "allow *" caps osd = "allow *" caps mgr = "allow *" [client.rgw.ocs.storagecluster.cephobjectstore.a] key = AQBTQbRny7NJLRAAPeTvK9kVg71/glbYLANGyw== caps mon = "allow rw" caps osd = "allow rwx" [mgr.a] key = AQD9QLRn8+xzDxAARqWQatoT9ruK76EpDS6iCw== caps mon = "allow profile mgr" caps mds = "allow *" caps osd = "allow *" [mgr.b] key = AQD9QLRnltZOIhAAexshUqdOr3G79HWYXUDGFg== caps mon = "allow profile mgr" caps mds = "allow *" caps osd = "allow *" [client.crash] key = AQD7QLRn6DDzCBAAEzhXRzGQUBUNTzC3nHntFQ== caps mon = "allow profile crash" caps mgr = "allow rw" [client.ceph-exporter] key = AQD7QLRntHzkGxAApQTkMVzcTiZn7jZbwK99SQ== caps mon = "allow profile ceph-exporter" caps mgr = "allow r" caps osd = "allow r" caps mds = "allow r"참고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/keyringmon-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 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 --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.corrupted다시 빌드된
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 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 /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 포드로 이동하여 복사한
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>- MON 배포 yaml 파일
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 rook-ceph-operator --replicas=1# oc -n openshift-storage scale deployment ocs-operator --replicas=1
검증 단계
Ceph 상태를 확인하여 고객 포털에서 다운로드해야 하는
odf-cli툴을 사용하여 CephFS가 실행 중인지 확인합니다.# odf 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) 상태를 확인합니다. 활성화되어 있어야 하며 백업 저장소 및 버킷 클래스는
Ready상태에 있어야 합니다.noobaa status -n openshift-storage중요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-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 Object Gateway(RGW)가 구성된 경우 포드를 다시 시작합니다.
# oc delete pods <rgw-pod> -n openshift-storage<rgw-pod>- RGW Pod의 이름입니다.
OpenShift Container Platform에서 복구 후 RBD PVC가 애플리케이션 Pod에 마운트되지 않습니다. 따라서 애플리케이션 pod를 호스팅하는 노드를 다시 시작해야 합니다. 애플리케이션 pod를 호스팅하는 노드 이름을 가져오려면 다음 명령을 실행합니다.
# oc get pods <application-pod> -n <namespace> -o yaml | grep nodeName
nodeName: node_name