8.3. 온프레미스 환경에서 etcd 백업 및 복원
온프레미스 환경의 호스팅 클러스터에서 etcd를 백업하고 복원하여 오류를 수정할 수 있습니다.
8.3.1. 온프레미스 환경의 호스팅 클러스터에서 etcd 백업 및 복원
호스트 클러스터에서 etcd를 백업하고 복원하면 3개의 노드 클러스터의 etcd 멤버의 손상된 데이터 또는 누락된 데이터와 같은 오류를 해결할 수 있습니다. etcd 클러스터의 여러 멤버가 데이터 손실이 발생하거나 CrashLoopBackOff
상태인 경우 이 접근 방식은 etcd 쿼럼 손실을 방지하는 데 도움이 됩니다.
이 절차에는 API 다운타임이 필요합니다.
사전 요구 사항
-
oc
및jq
바이너리가 설치되어 있습니다.
절차
먼저 환경 변수를 설정하고 API 서버를 축소합니다.
다음 명령을 입력하여 호스팅된 클러스터에 대한 환경 변수를 설정하여 필요에 따라 값을 바꿉니다.
$ CLUSTER_NAME=my-cluster
$ HOSTED_CLUSTER_NAMESPACE=clusters
$ CONTROL_PLANE_NAMESPACE="${HOSTED_CLUSTER_NAMESPACE}-${CLUSTER_NAME}"
다음 명령을 입력하여 호스팅 클러스터의 조정을 일시 중지하여 필요에 따라 값을 교체합니다.
$ oc patch -n ${HOSTED_CLUSTER_NAMESPACE} hostedclusters/${CLUSTER_NAME} -p '{"spec":{"pausedUntil":"true"}}' --type=merge
다음 명령을 입력하여 API 서버를 축소합니다.
kube-apiserver
를 축소합니다.$ oc scale -n ${CONTROL_PLANE_NAMESPACE} deployment/kube-apiserver --replicas=0
openshift-apiserver
를 축소합니다.$ oc scale -n ${CONTROL_PLANE_NAMESPACE} deployment/openshift-apiserver --replicas=0
openshift-oauth-apiserver
를 축소 :$ oc scale -n ${CONTROL_PLANE_NAMESPACE} deployment/openshift-oauth-apiserver --replicas=0
다음으로 다음 방법 중 하나를 사용하여 etcd의 스냅샷을 만듭니다.
- 이전에 백업한 etcd 스냅샷을 사용합니다.
사용 가능한 etcd pod가 있는 경우 다음 단계를 완료하여 활성 etcd pod에서 스냅샷을 만듭니다.
다음 명령을 입력하여 etcd pod를 나열합니다.
$ oc get -n ${CONTROL_PLANE_NAMESPACE} pods -l app=etcd
Pod 데이터베이스의 스냅샷을 가져와서 다음 명령을 입력하여 시스템에 로컬로 저장합니다.
$ ETCD_POD=etcd-0
$ oc exec -n ${CONTROL_PLANE_NAMESPACE} -c etcd -t ${ETCD_POD} -- env ETCDCTL_API=3 /usr/bin/etcdctl \ --cacert /etc/etcd/tls/etcd-ca/ca.crt \ --cert /etc/etcd/tls/client/etcd-client.crt \ --key /etc/etcd/tls/client/etcd-client.key \ --endpoints=https://localhost:2379 \ snapshot save /var/lib/snapshot.db
다음 명령을 입력하여 스냅샷이 성공했는지 확인합니다.
$ oc exec -n ${CONTROL_PLANE_NAMESPACE} -c etcd -t ${ETCD_POD} -- env ETCDCTL_API=3 /usr/bin/etcdctl -w table snapshot status /var/lib/snapshot.db
다음 명령을 입력하여 스냅샷의 로컬 사본을 만듭니다.
$ oc cp -c etcd ${CONTROL_PLANE_NAMESPACE}/${ETCD_POD}:/var/lib/snapshot.db /tmp/etcd.snapshot.db
etcd 영구 스토리지에서 스냅샷 데이터베이스의 사본을 만듭니다.
다음 명령을 입력하여 etcd pod를 나열합니다.
$ oc get -n ${CONTROL_PLANE_NAMESPACE} pods -l app=etcd
실행 중인 Pod를 찾아
ETCD_POD: ETCD_POD=etcd-0
의 값으로 설정한 다음 다음 명령을 입력하여 스냅샷 데이터베이스를 복사합니다.$ oc cp -c etcd ${CONTROL_PLANE_NAMESPACE}/${ETCD_POD}:/var/lib/data/member/snap/db /tmp/etcd.snapshot.db
다음으로 다음 명령을 입력하여 etcd 상태 저장 세트를 축소합니다.
$ oc scale -n ${CONTROL_PLANE_NAMESPACE} statefulset/etcd --replicas=0
다음 명령을 입력하여 두 번째 및 세 번째 멤버의 볼륨을 삭제합니다.
$ oc delete -n ${CONTROL_PLANE_NAMESPACE} pvc/data-etcd-1 pvc/data-etcd-2
pod를 생성하여 첫 번째 etcd 멤버의 데이터에 액세스합니다.
다음 명령을 입력하여 etcd 이미지를 가져옵니다.
$ ETCD_IMAGE=$(oc get -n ${CONTROL_PLANE_NAMESPACE} statefulset/etcd -o jsonpath='{ .spec.template.spec.containers[0].image }')
etcd 데이터에 액세스할 수 있는 pod를 만듭니다.
$ cat << EOF | oc apply -n ${CONTROL_PLANE_NAMESPACE} -f - apiVersion: apps/v1 kind: Deployment metadata: name: etcd-data spec: replicas: 1 selector: matchLabels: app: etcd-data template: metadata: labels: app: etcd-data spec: containers: - name: access image: $ETCD_IMAGE volumeMounts: - name: data mountPath: /var/lib command: - /usr/bin/bash args: - -c - |- while true; do sleep 1000 done volumes: - name: data persistentVolumeClaim: claimName: data-etcd-0 EOF
etcd-data
pod의 상태를 확인하고 다음 명령을 입력하여 실행할 때까지 기다립니다.$ oc get -n ${CONTROL_PLANE_NAMESPACE} pods -l app=etcd-data
다음 명령을 입력하여
etcd-data
pod의 이름을 가져옵니다.$ DATA_POD=$(oc get -n ${CONTROL_PLANE_NAMESPACE} pods --no-headers -l app=etcd-data -o name | cut -d/ -f2)
다음 명령을 입력하여 etcd 스냅샷을 포드에 복사합니다.
$ oc cp /tmp/etcd.snapshot.db ${CONTROL_PLANE_NAMESPACE}/${DATA_POD}:/var/lib/restored.snap.db
다음 명령을 입력하여
etcd-data
포드에서 이전 데이터를 제거합니다.$ oc exec -n ${CONTROL_PLANE_NAMESPACE} ${DATA_POD} -- rm -rf /var/lib/data
$ oc exec -n ${CONTROL_PLANE_NAMESPACE} ${DATA_POD} -- mkdir -p /var/lib/data
다음 명령을 입력하여 etcd 스냅샷을 복원합니다.
$ oc exec -n ${CONTROL_PLANE_NAMESPACE} ${DATA_POD} -- etcdutl snapshot restore /var/lib/restored.snap.db \ --data-dir=/var/lib/data --skip-hash-check \ --name etcd-0 \ --initial-cluster-token=etcd-cluster \ --initial-cluster etcd-0=https://etcd-0.etcd-discovery.${CONTROL_PLANE_NAMESPACE}.svc:2380,etcd-1=https://etcd-1.etcd-discovery.${CONTROL_PLANE_NAMESPACE}.svc:2380,etcd-2=https://etcd-2.etcd-discovery.${CONTROL_PLANE_NAMESPACE}.svc:2380 \ --initial-advertise-peer-urls https://etcd-0.etcd-discovery.${CONTROL_PLANE_NAMESPACE}.svc:2380
다음 명령을 입력하여 포드에서 임시 etcd 스냅샷을 제거하십시오.
$ oc exec -n ${CONTROL_PLANE_NAMESPACE} ${DATA_POD} -- rm /var/lib/restored.snap.db
다음 명령을 입력하여 데이터 액세스 배포를 삭제합니다.
$ oc delete -n ${CONTROL_PLANE_NAMESPACE} deployment/etcd-data
다음 명령을 입력하여 etcd 클러스터를 확장합니다.
$ oc scale -n ${CONTROL_PLANE_NAMESPACE} statefulset/etcd --replicas=3
etcd 멤버 pod가 반환되고 다음 명령을 입력하여 사용 가능한 것으로 보고할 때까지 기다립니다.
$ oc get -n ${CONTROL_PLANE_NAMESPACE} pods -l app=etcd -w
다음 명령을 입력하여 모든 etcd-writer 배포를 확장합니다.
$ oc scale deployment -n ${CONTROL_PLANE_NAMESPACE} --replicas=3 kube-apiserver openshift-apiserver openshift-oauth-apiserver
다음 명령을 입력하여 호스팅 클러스터의 조정을 복원합니다.
$ oc patch -n ${CLUSTER_NAMESPACE} hostedclusters/${CLUSTER_NAME} -p '{"spec":{"pausedUntil":""}}' --type=merge