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


세 가지 모두 중단되고 OpenShift Data Foundation에서 모니터 Pod를 자동으로 복구할 수 없는 경우 모니터 Pod를 복원합니다.

절차

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

    # oc scale deployment rook-ceph-operator --replicas=0 -n openshift-storage
    # oc scale deployment ocs-operator --replicas=0 -n openshift-storage
  2. openshift-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; done
  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
  4. 모든 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 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
    2. recover_mon.sh 스크립트를 실행합니다.

      # chmod +x recover_mon.sh
      # ./recover_mon.sh
  5. 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
    2. MON 배포를 패치하여 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 -
  6. 이전에 검색한 monstoremon-a pod에 복사합니다.

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

    # oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)
    # chown -R ceph:ceph /tmp/monstore
  8. mon 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 *”
  9. 각 시크릿에서 다른 모든 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 키는 복구 후 자동으로 추가됩니다.
  10. mon-a 포드로 이동하여 monstoremonmap 이 있는지 확인합니다.

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

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

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

    # monmaptool /root/monmap --print
  13. monmap 을 가져옵니다.

    중요

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

    # ceph-monstore-tool /tmp/monstore rebuild -- --keyring /tmp/keyring --monmap /root/monmap
    # chown -R ceph:ceph /tmp/monstore
  14. 이전 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
  15. rebuild 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.db
  16. monstore 디렉터리를 다시 빌드한 후 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입니다.
  17. 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입니다.
  18. 패치된 변경 사항을 되돌립니다.

    • 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가 실행 중인지 확인합니다.

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

    # oc -n openshift-storage scale deployment ocs-operator --replicas=1

검증 단계

  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+clean
  2. MCG(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 상태를 백업 및 실행 중인지 확인해야 합니다.

절차

  1. 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의 이름입니다.
  2. 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
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 소개

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

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

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

Red Hat 문서 정보

Legal Notice

Theme

© 2026 Red Hat
맨 위로 이동