13장. OpenShift Data Foundation에서 ceph-monitor 쿼럼 복원
경우에 따라 ceph-mons 가 쿼럼이 손실될 수 있습니다. mons 가 다시 쿼럼을 형성할 수 없는 경우 쿼럼을 다시 진행하는 수동 프로시저가 있습니다. 유일한 요구 사항은 적어도 하나의 수도원이 건강해야 한다는 것입니다. 다음 단계에서는 쿼럼에서 비정상적인 mons 를 제거하고 단일 mon 을 사용하여 쿼럼을 다시 만든 다음 쿼럼을 원래 크기로 다시 가져올 수 있습니다.
예를 들어, 3개의 가 있고 쿼럼을 손실한 경우 쿼럼에서 두 개의 잘못된 mon을 제거하고, 쿼럼의 유일한 mons 임을 알리고, 좋은 mon mon 을 다시 시작해야 합니다.
프로시저
monmap을 수정할 때mons가 실패하지 않도록rook-ceph-operator를 중지합니다.# oc -n openshift-storage scale deployment rook-ceph-operator --replicas=0새
monmap을 삽입합니다.주의monmap을 매우 신중하게 삽입해야합니다. 잘못 실행하면 클러스터가 영구적으로 삭제될 수 있습니다. Cephmonmap은mon쿼럼을 추적합니다.monmap은 정상 mon만 포함하도록 업데이트됩니다. 이 예에서 healthy mon은rook-ceph-mon-b이지만 비정상적인mons는rook-ceph-mon-a및rook-ceph-mon-c입니다.현재
rook-ceph-mon-bDeployment의 백업을 가져옵니다.# oc -n openshift-storage get deployment rook-ceph-mon-b -o yaml > rook-ceph-mon-b-deployment.yamlYAML 파일을 열고
mon컨테이너에서 명령 및 인수 를 복사합니다(다음 예제의 컨테이너 목록 참조). 이는monmap의 변경에 필요합니다.[...] containers: - args: - --fsid=41a537f2-f282-428e-989f-a9e07be32e47 - --keyring=/etc/ceph/keyring-store/keyring - --log-to-stderr=true - --err-to-stderr=true - --mon-cluster-log-to-stderr=true - '--log-stderr-prefix=debug ' - --default-log-to-file=false - --default-mon-cluster-log-to-file=false - --mon-host=$(ROOK_CEPH_MON_HOST) - --mon-initial-members=$(ROOK_CEPH_MON_INITIAL_MEMBERS) - --id=b - --setuser=ceph - --setgroup=ceph - --foreground - --public-addr=10.100.13.242 - --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db - --public-bind-addr=$(ROOK_POD_IP) command: - ceph-mon [...]복사한
명령과args필드를 정리하여 다음과 같이 붙여넣을 수 있는 명령을 형성합니다.# ceph-mon \ --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \ --keyring=/etc/ceph/keyring-store/keyring \ --log-to-stderr=true \ --err-to-stderr=true \ --mon-cluster-log-to-stderr=true \ --log-stderr-prefix=debug \ --default-log-to-file=false \ --default-mon-cluster-log-to-file=false \ --mon-host=$ROOK_CEPH_MON_HOST \ --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \ --id=b \ --setuser=ceph \ --setgroup=ceph \ --foreground \ --public-addr=10.100.13.242 \ --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \ --public-bind-addr=$ROOK_POD_IP참고ROOK_CEPH_MON_HOST, ROOK_CEPH_INITIAL_MEMBERS 및 ROOK_POD_IP 에서는ROOK_CEPH_MON_INITIAL_MEMBERS및ROOK_POD_IP변수를 중심으로 작은따옴표를 제거해야 합니다.rook-ceph-배포를 패치하여 mon Pod를 삭제하지 않고 이mon-bmon의 작업을 중지합니다.# oc -n openshift-storage patch deployment rook-ceph-mon-b --type='json' -p '[{"op":"remove", "path":"/spec/template/spec/containers/0/livenessProbe"}]' # oc -n openshift-storage patch deployment rook-ceph-mon-b -p '{"spec": {"template": {"spec": {"containers": [{"name": "mon", "command": ["sleep", "infinity"], "args": []}]}}}}'mon-bPod에서 다음 단계를 수행합니다.정상
mon의 포드에 연결하고 다음 명령을 실행합니다.# oc -n openshift-storage exec -it <mon-pod> bash변수를 설정합니다.
# monmap_path=/tmp/monmap좋은
mon배포에서 ceph mon 명령을 붙여넣고--extract-을 파일에 추출합니다.monmap=${monmap_path} 플래그를 추가하여 monmap# ceph-mon \ --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \ --keyring=/etc/ceph/keyring-store/keyring \ --log-to-stderr=true \ --err-to-stderr=true \ --mon-cluster-log-to-stderr=true \ --log-stderr-prefix=debug \ --default-log-to-file=false \ --default-mon-cluster-log-to-file=false \ --mon-host=$ROOK_CEPH_MON_HOST \ --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \ --id=b \ --setuser=ceph \ --setgroup=ceph \ --foreground \ --public-addr=10.100.13.242 \ --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \ --public-bind-addr=$ROOK_POD_IP \ --extract-monmap=${monmap_path}monmap의 내용을 검토합니다.# monmaptool --print /tmp/monmap에서 잘못된 토큰을 제거합니다.monmap# monmaptool ${monmap_path} --rm <bad_mon>이 예제에서는
mon0및mon2를 제거합니다.# monmaptool ${monmap_path} --rm a # monmaptool ${monmap_path} --rm cceph
mon명령을 붙여넣고--inject-을 좋은 mon에 삽입합니다.monmap=$monmap_path} 플래그를 다음과 같이 추가하여 수정된 mon 맵# ceph-mon \ --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \ --keyring=/etc/ceph/keyring-store/keyring \ --log-to-stderr=true \ --err-to-stderr=true \ --mon-cluster-log-to-stderr=true \ --log-stderr-prefix=debug \ --default-log-to-file=false \ --default-mon-cluster-log-to-file=false \ --mon-host=$ROOK_CEPH_MON_HOST \ --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \ --id=b \ --setuser=ceph \ --setgroup=ceph \ --foreground \ --public-addr=10.100.13.242 \ --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \ --public-bind-addr=$ROOK_POD_IP \ --inject-monmap=${monmap_path}- 계속하려면 쉘을 종료합니다.
Rook
configmaps를 편집합니다.Operator가
mons를 추적하는 데 사용하는configmap을 편집합니다.# oc -n openshift-storage edit configmap rook-ceph-mon-endpoints데이터 요소에서 다음과 같은 세 개의
mons(또는moncount에 따라 더 많은)이 표시되는지 확인합니다.data: a=10.100.35.200:6789;b=10.100.13.242:6789;c=10.100.35.12:6789목록에서 잘못된 수도를 삭제하여 하나의 좋은
mon으로 끝납니다.예를 들면 다음과 같습니다.data: b=10.100.13.242:6789- 파일을 저장하고 종료합니다.
이제
mons및 기타 구성 요소에 사용되는시크릿을 조정해야 합니다.good_mon_id변수의 값을 설정합니다.예를 들면 다음과 같습니다.
# good_mon_id=boc patch명령을 사용하여rook-ceph-config시크릿을 패치하고 두 개의 키/값 쌍mon_host와mon_initial_members를 업데이트할 수 있습니다.# mon_host=$(oc -n openshift-storage get svc rook-ceph-mon-b -o jsonpath='{.spec.clusterIP}') # oc -n openshift-storage patch secret rook-ceph-config -p '{"stringData": {"mon_host": "[v2:'"${mon_host}"':3300,v1:'"${mon_host}"':6789]", "mon_initial_members": "'"${good_mon_id}"'"}}'참고hostNetwork: true를 사용하는 경우mon_hostvar을mon이 고정된 노드 IP로 교체해야 합니다(nodeSelector). 이는 해당 "mode"에서 생성된rook-ceph-mon-*서비스가 없기 때문입니다.
mon을 다시 시작합니다.변경 사항을 선택하려면 원래
ceph-명령을 사용하여 좋은 mon pod를 다시 시작해야 합니다.monmon배포 YAML 파일의 백업에oc replace명령을 사용합니다.# oc replace --force -f rook-ceph-mon-b-deployment.yaml참고option
--force는 배포를 삭제하고 새 배포를 생성합니다.클러스터 상태를 확인합니다.
쿼럼에 하나의
mon이 표시되어야 합니다. 상태가 정상으로 표시되면 클러스터가 다시 정상이어야 합니다.
쿼럼에 더 이상 예상되지 않는 두 개의 mon 배포를 삭제합니다.
예를 들면 다음과 같습니다.
# oc delete deploy <rook-ceph-mon-1> # oc delete deploy <rook-ceph-mon-2>이 예에서 삭제할 배포는
rook-ceph-mon-a및rook-ceph-mon-c입니다.Operator를 다시 시작합니다.
rook Operator를 다시 시작하여 클러스터 상태 모니터링을 다시 시작합니다.
참고여러 리소스가 이미 존재하는 오류는 무시해도 됩니다.
# oc -n openshift-storage scale deployment rook-ceph-operator --replicas=1Operator는
mon수에 따라 쿼럼 크기를 다시 늘리기 위해 자동으로mons를 추가합니다.