현재 제가 개발하고 있는 서비스는 VM(Virtual Machine)에 Kubeadm으로 구축한 Kubernetes 클러스터에 배포되어 있습니다.
저는 장애에 대비해 클러스터를 복구할 수 있도록 백업을 수행하고 싶었습니다.
물론 저는 GitOps를 통해 코드형 인프라(Infrastructure as Code, IaC)를 구현했으므로 큰 걱정은 없었으나, 제가 수동으로 배포한 리소스들을 생각하면 백업이 필요했습니다.
그래서 백업을 할 수 있는 방법을 모색하다 ETCD를 활용하는 방법을 발견했습니다.
ETCD
ETCD는 분산형 Key-Value 저장소입니다.
비슷한 Key-Value 저장소인 Redis처럼 조회 성능이 좋아서 메타 데이터 등의 작은 크기의 데이터를 다루는데 적합합니다.
etcdctl set <key> <value>
ETCD는 함께 제공되는 CLI(Command Line Interface)인 etcdctl을 통해 다룰 수 있습니다.
Kubernetes에서의 ETCD
Kubernetes에서 ETCD는 컨트롤 플레인의 컴포넌트 중 하나로, 클러스터 내의 모든 정보들을 저장하고 있습니다.
Kubernetes의 CLI인 kubectl로 가져오는 정보들은 모두 ETCD로부터 가져오는 것들인데요.
이는 ETCD의 백업 데이터만 있다면 언제든지 클러스터를 복구할 수 있다는 의미이기도 합니다.
그 다음, 위 명령어로 스냅샷을 생성해 특정 경로에 저장합니다.
이때, 추가 인자로 CA(Certificate Authority) 인증서, 서버 인증서, Private Key가 필요합니다.
이에 대해서는 앞서 보았던 ETCD의 매니페스트에 있는 정보들을 활용할 수 있습니다.
etcdctl snapshot save --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key /opt/snapshot.db
/opt > lscni containerd snapshot.db
명령을 실행하면 /opt/snapshot.db가 생성된 것을 볼 수 있습니다.
클러스터 복구
> kubectl get allNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3m47s
클러스터 복구 테스트를 위해 default 네임스페이스에 존재하는 Deployment, Pod 등의 모든 오브젝트를 삭제했습니다.
etcdctl snapshot restore <snapshot_path>
백업과 마찬가지로, etcdctl을 통해 스냅샷을 가지고 클러스터를 복구할 수 있습니다.
이때, 추가 인자로 복구할 데이터를 저장할 디렉토리를 지정할 수 있습니다.