12장. OpenShift Data Foundation에서 모니터 Pod 복원


3개의 모든 포드가 중단되고 OpenShift Data Foundation이 모니터 Pod를 자동으로 복구할 수 없는 경우 모니터 포드를 복원합니다.

참고

이는 재해 복구 절차이며 Red Hat 지원 팀의 지침에 따라 수행해야 합니다. Red Hat 지원 팀에 문의하십시오. https://access.redhat.com/support

프로세스

  1. rook-ceph-operatorocs operator 배포를 축소합니다.

    # oc scale deployment rook-ceph-operator --replicas=0 -n openshift-storage
    Copy to Clipboard Toggle word wrap
    # oc scale deployment ocs-operator --replicas=0 -n openshift-storage
    Copy to Clipboard Toggle word wrap
  2. openshift-storage 네임스페이스에 모든 배포의 백업을 생성합니다.

    # mkdir backup
    Copy to Clipboard Toggle word wrap
    # cd backup
    Copy to Clipboard Toggle word wrap
    # oc project openshift-storage
    Copy to Clipboard Toggle word wrap
    # 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
    Copy to Clipboard Toggle word wrap
  3. 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
    Copy to Clipboard Toggle word wrap
  4. 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' ;done
    Copy to Clipboard Toggle word wrap
    참고

    tar 바이너리를 OSD에 복사하는 동안 tar 바이너리가 포드의 컨테이너 이미지 OS와 일치하는지 확인하는 것이 중요합니다. macOS, Ubuntu 등과 같은 다른 OS에서 바이너리를 복사하면 호환성 문제가 발생할 수 있습니다.

  5. 모든 OSD에서 monstore 클러스터 맵을 검색합니다.

    1. 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"
      done
      Copy to Clipboard Toggle word wrap
    2. recover_mon.sh 스크립트를 실행합니다.

      # chmod +x recover_mon.sh
      Copy to Clipboard Toggle word wrap
      # ./recover_mon.sh
      Copy to Clipboard Toggle word wrap
  6. MON 배포를 패치하고 command 매개변수를 sleep 으로 사용하여 실행합니다.

    1. 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
      Copy to Clipboard Toggle word wrap
    2. 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
      Copy to Clipboard Toggle word wrap
    3. 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
      Copy to Clipboard Toggle word wrap
      참고

      tar 바이너리를 MON에 복사하는 동안 tar 바이너리가 포드의 컨테이너 이미지 OS와 일치하는지 확인하는 것이 중요합니다. macOS, Ubuntu 등과 같은 다른 OS에서 바이너리를 복사하면 호환성 문제가 발생할 수 있습니다.

  7. 이전에 검색한 monstoremon-a Pod에 복사합니다.

    # oc cp /tmp/monstore/ $(oc get po -l app=rook-ceph-mon,mon=a -oname |sed 's/pod\///g'):/tmp/
    Copy to Clipboard Toggle word wrap
  8. MON 포드로 이동하여 검색된 monstore 의 소유권을 변경합니다.

    # oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)
    Copy to Clipboard Toggle word wrap
    # chown -R ceph:ceph /tmp/monstore
    Copy to Clipboard Toggle word wrap
  9. mon db 를 다시 빌드하기 전에 인증 템플릿 파일을 복사합니다.

    # oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)
    Copy to Clipboard Toggle word wrap
    # cp /etc/ceph/keyring-store/keyring /tmp/keyring
    Copy to Clipboard Toggle word wrap
    # 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 *”
    Copy to Clipboard Toggle word wrap
  10. 다른 모든 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"
    Copy to Clipboard Toggle word wrap

    데몬 인증 키를 가져올 때 다음 명령을 사용합니다.

    # 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
    Copy to Clipboard Toggle word wrap

    다음 스크립트를 사용하여 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
    Copy to Clipboard Toggle word wrap

    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
    Copy to Clipboard Toggle word wrap
    vi /tmp/keyring-mon-a
    Copy to Clipboard Toggle word wrap

    예를 들어 키 링 파일은 다음과 같아야 합니다.

    [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"
    Copy to Clipboard Toggle word wrap
    참고

    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
    Copy to Clipboard Toggle word wrap
  11. mon-a 포드로 이동하여 monstoremonmap 이 있는지 확인합니다.

    1. mon-a 포드로 이동합니다.

      # oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)
      Copy to Clipboard Toggle word wrap
    2. monstoremonmap 이 있는지 확인합니다.

      # ceph-monstore-tool /tmp/monstore get monmap -- --out /tmp/monmap
      Copy to Clipboard Toggle word wrap
      # monmaptool /tmp/monmap --print
      Copy to Clipboard Toggle word wrap
  12. 선택 사항: 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>
    Copy to Clipboard Toggle word wrap
    <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입니다.
  13. monmap 을 확인합니다.

    # monmaptool /root/monmap --print
    Copy to Clipboard Toggle word wrap
  14. monmap 을 가져옵니다.

    중요

    이전에 생성한 키 링 파일을 사용합니다.

    # ceph-monstore-tool /tmp/monstore rebuild -- --keyring /tmp/keyring --monmap /root/monmap
    Copy to Clipboard Toggle word wrap
    # chown -R ceph:ceph /tmp/monstore
    Copy to Clipboard Toggle word wrap
  15. 이전 store.db 파일의 백업을 만듭니다.

    # mv /var/lib/ceph/mon/ceph-a/store.db /var/lib/ceph/mon/ceph-a/store.db.corrupted
    Copy to Clipboard Toggle word wrap
    # mv /var/lib/ceph/mon/ceph-b/store.db /var/lib/ceph/mon/ceph-b/store.db.corrupted
    Copy to Clipboard Toggle word wrap
    # mv /var/lib/ceph/mon/ceph-c/store.db /var/lib/ceph/mon/ceph-c/store.db.corrupted
    Copy to Clipboard Toggle word wrap
  16. 다시 빌드된 store.db 파일을 monstore 디렉터리에 복사합니다.

    # mv /tmp/monstore/store.db /var/lib/ceph/mon/ceph-a/store.db
    Copy to Clipboard Toggle word wrap
    # chown -R ceph:ceph /var/lib/ceph/mon/ceph-a/store.db
    Copy to Clipboard Toggle word wrap
  17. 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
    Copy to Clipboard Toggle word wrap
    # 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 Toggle word wrap
    <id>
    MON Pod의 ID입니다.
  18. 나머지 MON 포드로 이동하여 복사한 monstore 의 소유권을 변경합니다.

    # oc rsh $(oc get po -l app=rook-ceph-mon,mon=<id> -oname)
    Copy to Clipboard Toggle word wrap
    # chown -R ceph:ceph /var/lib/ceph/mon/ceph-<id>/store.db
    Copy to Clipboard Toggle word wrap
    <id>
    MON Pod의 ID입니다.
  19. 패치된 변경 사항을 되돌립니다.

    • MON 배포의 경우:

      # oc replace --force -f <mon-deployment.yaml>
      Copy to Clipboard Toggle word wrap
      <mon-deployment.yaml>
      MON 배포 yaml 파일
    • OSD 배포의 경우:

      # oc replace --force -f <osd-deployment.yaml>
      Copy to Clipboard Toggle word wrap
      <osd-deployment.yaml>
      OSD 배포 yaml 파일
    • MGR 배포의 경우:

      # oc replace --force -f <mgr-deployment.yaml>
      Copy to Clipboard Toggle word wrap
      <mgr-deployment.yaml>

      MGR 배포 yaml 파일입니까?

      중요

      MON, MGR 및 OSD Pod가 실행 중인지 확인합니다.

  20. rook-ceph-operatorocs-operator 배포를 확장합니다.

    # oc -n openshift-storage scale deployment rook-ceph-operator --replicas=1
    Copy to Clipboard Toggle word wrap
    # oc -n openshift-storage scale deployment ocs-operator --replicas=1
    Copy to Clipboard Toggle word wrap

검증 단계

  1. Ceph 상태를 확인하여 CephFS가 실행 중인지 확인합니다.

    # ceph -s
    Copy to Clipboard Toggle word wrap

    출력 예:

    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+clean
    Copy to Clipboard Toggle word wrap
  2. MCG(Multicloud Object Gateway) 상태를 확인합니다. 활성화되어 있어야 하며 백업 저장소 및 버킷 클래스는 Ready 상태에 있어야 합니다.

    noobaa status -n openshift-storage
    Copy to Clipboard Toggle word wrap
    중요

    MCG가 활성 상태가 아니고 백업 저장소 및 버킷 클래스가 Ready 상태가 아닌 경우 모든 MCG 관련 Pod를 다시 시작해야 합니다. 자세한 내용은 12.1절. “Multicloud Object Gateway 복원”의 내용을 참조하십시오.

12.1. Multicloud Object Gateway 복원

MCG(Multicloud Object Gateway)가 활성 상태가 아니며 백업 저장소 및 버킷 클래스가 Ready 상태가 아닌 경우 모든 MCG 관련 Pod를 재시작하고 MCG 상태를 확인하여 MCG가 백업되고 실행 중인지 확인해야 합니다.

프로세스

  1. MCG와 관련된 모든 Pod를 다시 시작합니다.

    # oc delete pods <noobaa-operator> -n openshift-storage
    Copy to Clipboard Toggle word wrap
    # oc delete pods <noobaa-core> -n openshift-storage
    Copy to Clipboard Toggle word wrap
    # oc delete pods <noobaa-endpoint> -n openshift-storage
    Copy to Clipboard Toggle word wrap
    # oc delete pods <noobaa-db> -n openshift-storage
    Copy to Clipboard Toggle word wrap
    <noobaa-operator>
    MCG Operator의 이름입니다.
    <noobaa-core>
    MCG 코어 Pod의 이름입니다.
    <noobaa-endpoint>
    MCG 끝점의 이름입니다.
    <noobaa-db>
    MCG db Pod의 이름입니다.
  2. RADOS Object Gateway(RGW)가 구성된 경우 포드를 다시 시작합니다.

    # oc delete pods <rgw-pod> -n openshift-storage
    Copy to Clipboard Toggle word wrap
    <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
Copy to Clipboard Toggle word wrap
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2026 Red Hat
맨 위로 이동