export ETCDCTL_API=3
export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
export ETCDCTL_CACERT=/etc/ssl/etcd/ssl/ca.pem
export ETCDCTL_KEY=/etc/ssl/etcd/ssl/admin-gpu01-key.pem
export ETCDCTL_CERT=/etc/ssl/etcd/ssl/admin-gpu01.pem

해당 파일에서 인증서 경로를 찾을 수 있음.
etcdctl snapshot save /backup/etcd-backup.db
백업이 완료되면, 다음 명령어로 백업 파일이 생성되었는지 확인
etcdctl snapshot status /backup/etcd-backup.db

etcdutl 설치
wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz
tar -xvf etcd-v3.5.0-linux-amd64.tar.gz
sudo mv etcd-v3.5.0-linux-amd64/etcdutl /usr/local/bin/

etcd 서비스 중지
sudo systemctl stop etcd
기존 데이터 삭제
sudo rm -rf /var/lib/etcd/*
백업 파일 복구
etcdctl snapshot restore /backup/etcd-backup.db --data-dir=/var/lib/etcd

'etcd' 서비스 재시작
sudo systemctl start etcd
복구 상태 확인
etcdctl endpoint status

Velero를 사용한 백업 및 복구
velero install --provider <provider> --bucket <bucket_name> --secret-file <credentials_file> --use-restic --backup-location-config region=<region>
Velero는 클라우드 스토리지를 이용하여 백업을 저장할 수 있음. 예를 들어, AWS, Azure, Google Cloud와 같은 클라우드 프로바이더에 백업 데이터를 저장 가능.
velero backup create <backup_name> --include-namespaces <namespace_name>
특정 네임스페이스 또는 전체 클러스터에 대한 백업을 수행함.
velero restore create --from-backup <backup_name>
sudo systemctl stop etcd
sudo rsync -avz /var/lib/etcd /backup/etcd-backup/
또는
sudo cp -r /var/lib/etcd /backup/etcd-backup/
sudo rsync -avz /backup/etcd-backup/ /var/lib/etcd
또는
sudo cp -r /backup/etcd-backup/ /var/lib/etcd
sudo systemctl start etcd
restic은 파일 기반의 백업 도구로, etcd 데이터 디렉토리와 같은 파일 시스템의 데이터를 백업할 수 있는 도구임. S3 호환 스토리지, 로컬 스토리지 등 다양한 백엔드 스토리지를 지원함.
wget -O restic.bz2 https://github.com/restic/restic/releases/download/v0.9.5/restic_0.9.5_linux_amd64.bz2
bunzip2 restic.bz2
chmod +x restic
mv restic /usr/local/bin/
restic init -r /backup/etcd
restic -r /backup/etcd backup /var/lib/etcd
restic -r /backup/etcd restore latest --target /var/lib/etcd
쿠버네티스 환경에서 etcd가 Persistent Volume(PV)에 저장된 경우, PV 스냅샷 기능을 사용할 수 있음.
쿠버네티스 스냅샷 API를 사용하여 etcd의 PV를 백업함.
스냅샷 리소스를 생성하여 PV의 상태를 캡처할 수 있음.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: etcd-snapshot
spec:
volumeSnapshotClassName: <snapshot-class>
source:
persistentVolumeClaimName: <etcd-pvc-name>
스냅샷을 생성한 후, 쿠버네티스 리소스 상태를 확인
스냅샷을 이용하여 새로운 PVC를 생성함.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: etcd-pvc-restore
spec:
dataSource:
name: etcd-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
새로운 PVC를 기존 etcd에 연결하고 서비스를 재시작
kubectl get pods -n kube-system -l component=etcd
kubectl exec -it etcd-master1 -n kube-system -- /bin/sh
export ETCDCTL_API=3
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /var/lib/etcd/backup.db
1) 파드 중지
etcd가 자동으로 재시작되는 것을 방지하기 위해 etcd 디플로이먼트나 스테이트풀셋을 중지합니다. 보통 etcd는 쿠버네티스의 스태틱 파드로 관리되므로, 이 경우 etcd 매니페스트 파일을 수정하거나 파드를 직접 삭제합니다.
kubectl delete pod etcd-master1 -n kube-system
스테이트풀셋으로 구성된 경우:
kubectl scale statefulset etcd --replicas=0 -n kube-system
2) etcd 데이터 복원
etcdctl snapshot restore /var/lib/etcd/backup.db --data-dir=/var/lib/etcd/new_etcd_data
3) etcd 재시작
kubectl scale statefulset etcd --replicas=1 -n kube-system
kubectl get pods -n kube-system -l component=etcd
etcdctl --endpoints=https://127.0.0.1:2379 endpoint status
export ETCDCTL_API=3
export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt
export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key
"IS LEADER" 컬럼이 true로 되어 있는 노드가 리더 노드
etcdctl --endpoints=https://127.0.0.1:2379 endpoint status --write-out=table
클러스터 멤버 리스트 확인
etcdctl --endpoints=https://127.0.0.1:2379 member list
3) 복구 시 기존 데이터를 보존하거나 백업 후 완전히 지우고 복원하는 방식으로 진행
출처 :
1. https://etcd.io/docs/v3.5/op-guide/recovery/
2. https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/
3. https://velero.io/docs/v1.14/
4. https://rsync.samba.org/documentation.html
5. https://restic.readthedocs.io/en/stable/
6. https://kubernetes.io/docs/concepts/storage/volume-snapshots/