etcd는 쿠버네티스 클러스터의 모든 상태가 저장되는 키-값 저장소입니다. 여기가 날아가면 클러스터 전체가 사라지는 거나 마찬가지라, 백업과 복원 절차는 꼭 익혀둬야 해요.
etcdctl과 etcdutl의 차이
먼저 두 도구를 구분해야 합니다.
- etcdctl: 실행 중인 etcd 서버와 통신하는 명령입니다. 스냅샷 저장(백업)처럼 서버와 대화가 필요한 작업에 씁니다.
- etcdutl: 로컬 파일 시스템 작업만 수행합니다. 스냅샷 상태 확인·복원처럼 서버 없이 파일만 다루는 작업에 씁니다.
버전으로 정리하면, etcd v3.4 이하에서는 복원도 etcdctl 로 했지만, v3.5 이상에서는 복원에 etcdutl 사용이 권장됩니다. etcdutl 로는 서버와 통신하는 백업(snapshot save)은 할 수 없다는 점만 기억하면 됩니다.
1. 백업 (etcdctl)
API 버전을 3으로 지정하고 스냅샷을 저장합니다.
ETCDCTL_API=3 etcdctl snapshot save /opt/snapshot-pre-boot.db \
--endpoints=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
인증서 경로와 엔드포인트는 kube-system 네임스페이스의 etcd 파드를 describe 하면 정확히 확인할 수 있습니다. 마지막 인자는 저장할 파일 경로예요.
2. 상태 확인 (etcdutl)
etcdutl snapshot status /opt/snapshot-pre-boot.db
3. 복원 (etcdutl)
스냅샷을 새 데이터 디렉토리로 복원합니다.
etcdutl snapshot restore /opt/snapshot-pre-boot.db \
--data-dir /var/lib/etcd-restored
4. 실제 반영
복원한 데이터 디렉토리를 etcd 정적 파드가 바라보도록 매니페스트를 수정합니다.
vim /etc/kubernetes/manifests/etcd.yaml
hostPath 의 etcd 데이터 경로를 복원한 디렉토리(/var/lib/etcd-restored)로 바꾸면, kubelet이 매니페스트 변경을 감지해 etcd 파드를 새로 띄웁니다. 잠시 뒤 클러스터가 복원된 상태로 돌아오는지 확인하세요.
백업은 “정기적으로” 그리고 “복원까지 실제로 테스트해봐야” 의미가 있습니다. 백업 파일만 쌓아두고 복원을 한 번도 안 해봤다면, 그건 아직 백업이 아니라 파일일 뿐이에요.