Kubernetes etcd 활용 클러스터 상태 백업/복원 가이드
이 포스트는 Kubernetes 클러스터의 마스터 노드에 배포된 etcd Pod를 통해 현재 클러스터의 상태를 백업하고, 백업한 데이터를 통해 클러스터의 상태를 복원하는 방법에 관해 다룹니다.
예제에 사용된 Kubernetes 클러스터는 kubeadm을 사용하여 구성되었습니다.
구성 방법은 쿠버네티스 설치 방법 – VM 환경 튜토리얼 포스트를 참고하세요.
목차
1. etcd란?
2. etcdctl 설치/구성
3. etcd Pod를 활용한 Kubernetes 클러스터 상태 백업
4. etcd Pod를 활용한 Kubernetes 클러스터 상태 복원
5. 결론
1. etcd란?
etcd는 분산 키-값 저장소로 클러스터의 모든 구성 데이터와 상태 정보를 저장하며, 클러스터의 안정성과 일관성을 유지하는 데 필수적인 역할을 합니다. Kubernetes는 kube-apiserver를 통해 etcd와 통신하며 노드, Pod, ConfigMap, Secrets 등의 리소스와 상태 정보를 저장하고 관리합니다.
2. etcdctl 설치/구성
Kubernetes 클러스터의 etcd Pod와 통신을 위해 etcdctl을 설치합니다. etcd Pod가 배포된 마스터 노드에서 진행했으며, root 계정으로 진행했습니다.
# apt update
# apt install etcd-client
최초 설치 시 etcd API는 v2로 설정되어 있습니다(3.3.25 버전 기준). 백업과 복원을 위해선 API v3을 사용해야 합니다.
# etcdctl --help
NAME:
etcdctl - A simple command line client for etcd.
WARNING:
Environment variable ETCDCTL_API is not set; defaults to etcdctl v2.
Set environment variable ETCDCTL_API=3 to use v3 API or ETCDCTL_API=2 to use v2 API.
USAGE:
etcdctl [global options] command [command options] [arguments...]
VERSION:
3.3.25
...
다음과 같이 명령어를 사용하여 etcdctl API v3을 사용할 수 있습니다.
# ETCDCTL_API=3 etcdctl --help
NAME:
etcdctl - A simple command line client for etcd3.
USAGE:
etcdctl [flags]
VERSION:
3.3.25
API VERSION:
3.3
...
환경 변수 설정을 통해 매번 ETCDCTL_API=3 입력 없이도 etcdctl API v3를 사용하도록 설정할 수 있습니다.
# export ETCDCTL_API=3
etcdctl을 통해서 클러스터의 etcd Pod와 통신을 위해 인증서 파일과 엔드포인트 정보가 필요합니다.
--endpoints: etcd 서버의 URL (예:https://127.0.0.1:2379)--cacert: CA 인증서 파일--cer: 클라이언트 인증서 파일--key: 클라이언트 키 파일
해당 파일의 위치는 etcd Pod의 정보를 통해 확인할 수 있습니다.
# kubectl get pod -n kube-system etcd-master -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
etcd-master 1/1 Running 0 118d 192.168.200.171 master <none> <none>
# kubectl describe pod -n kube-system etcd-master


1번 사진에 표시된 인증서 파일의 경로는 etcd Pod 내부의 경로이므로 하단의 Mounts, Volumes 항목도 확인이 필요합니다. 현재 etcd Pod는 마스터 노드의 디렉터리와 동일하게 마운트 되어 있음을 확인할 수 있습니다. (/var/lib/etcd, /etc/kubernetes/pki/etcd)
위에서 확인한 내용을 통해 마스터 노드에서 etcdctl 명령어로 통신 시, 다음 옵션을 통해 etcd Pod와 통신할 수 있습니다. 명령어 사용자는 각 파일의 권한이 필요합니다.
클러스터 외부 통신 시 인증서 파일을 복사하여 사용 및 endpoints 값을 외부에서 통신이 가능한 endpoint로 변경이 필요합니다.
--endpoints=https://127.0.0.1:2379 (혹은 https://192.168.200.171:2379)
--cacert=/etc/kubernetes/pki/etcd/ca.crt
--cert=/etc/kubernetes/pki/etcd/server.crt
--key=/etc/kubernetes/pki/etcd/server.key
3. etcd Pod를 활용한 Kubernetes 클러스터 상태 백업
etcdctl snapshot save 명령어로, 현재 클러스터의 상태를 db 파일로 저장하여 백업할 수 있습니다.
1. 백업 전과 후를 비교하기 위해 네임스페이스를 생성하고, NGINX Pod를 배포합니다.
# kubectl create ns backup
namespace/backup created
# kubectl run nginx --image=nginx -n backup
pod/nginx created
# kubectl get all -n backup
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 Running 0 8s
2. etcdctl snapshot save 명령어를 사용해 클러스터의 상태를 db 파일로 백업합니다.
# etcdctl snapshot save /opt/etcdbackup/backup.db \
--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
2024-11-22 14:04:57.902998 I | clientv3: opened snapshot stream; downloading
2024-11-22 14:04:58.312539 I | clientv3: completed snapshot read; closing
Snapshot saved at /opt/etcdbackup/backup.db
/opt/etcdbackup/ 디렉터리에 backup.db 파일로 저장했습니다. etcdbackup 디렉터리는 사전에 생성한 디렉터리입니다.
3. 복원 후 결과를 확인하기 위해 생성한 네임스페이스를 삭제합니다. 네임스페이스가 삭제됨에 따라 생성했던 NGINX Pod도 삭제됩니다.
# kubectl delete ns backup
namespace "backup" deleted
# kubectl get ns backup
Error from server (NotFound): namespaces "backup" not found
4. etcd Pod를 활용한 Kubernetes 클러스터 상태 복원
이전 단계에서 생성한 db 파일을 통해 클러스터의 상태를 복원할 수 있습니다.
1. etcdctl snapshot restore 명령어를 사용해 클러스터 데이터 디렉터리를 생성합니다.
# etcdctl snapshot restore /opt/etcdbackup/backup.db \
--data-dir /var/lib/etcdbackup \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/client.crt \
--key=/etc/kubernetes/pki/etcd/client.key
2024-11-22 14:14:20.927295 I | mvcc: restore compact to 1907834
2024-11-22 14:14:20.980422 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32
백업 과정에서 생성한 backup.db 파일을 통해 데이터 디렉터리를 생성하며, --data-dir 옵션을 통해 생성될 디렉터리를 지정합니다. /var/lib/etcdbackup 디렉터리로 지정하여 생성했습니다.
2. etcd Pod의 볼륨으로 마운트할 디렉터리를 새로 생성한 데이터 디렉터리로 변경합니다.
etcd Pod는 마스터 노드에서 관리되는 Static Pod로 노드의 /etc/kubernetes/manifests 디렉터리에서 설정 파일을 확인할 수 있습니다. 혹은 /var/lib/kubelet/config.yaml 파일의 staticPodPath 항목에 명시된 디렉터리에서 확인할 수 있습니다.
# vi /etc/kubernetes/manifests/etcd.yaml
...
volumes:
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
path: /var/lib/etcdbackup
type: DirectoryOrCreate
name: etcd-data

다른 부분을 변경하지 않도록 주의합니다.
변경을 완료하면, kubelet이 자동으로 변경을 감지하고 새로운 etcd Pod를 생성합니다. etcd Pod가 재생성 되는 동안 kube-apiserver와의 통신이 잠시 동안 불가능해집니다.
3. kube-apiserver와의 통신이 복구되면 etcd Pod의 정보를 확인합니다.
# kubectl describe pod etcd-master -n kube-system

마운트된 디렉터리의 경로가 생성한 데이터가 저장된 디렉터리로 변경되었음을 확인할 수 있습니다.
4. 삭제했던 네임스페이스와 Pod를 확인할 수 있습니다.
# kubectl get ns backup
NAME STATUS AGE
backup Active 19m
# kubectl get pod -n backup
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 21m
creationTimestamp 데이터가 유지되어 AGE 값의 출력은 백업 이전에 생성한 시간을 기준으로 출력됩니다.
5. 결론
이번 포스트에서는 Kubernetes 클러스터에 배포된 etcd Pod를 통해 현재 클러스터의 상태를 db 파일로 백업하고, 백업한 파일을 통해 해당 백업 시점의 상태로 클러스터를 복원하는 방법을 알아봤습니다. 마스터 노드에 있는 인증서 파일과 etcdctl을 통해 etcd Pod와 통신할 수 있었습니다.
etcd Pod의 엔드포인트와 통신이 가능한 환경이라면 같은 방법으로 백업 db 파일 생성과 클러스터 데이터 디렉터리를 생성할 수 있습니다. 하지만 인증서 파일 준비가 필요하고, 생성된 클러스터 데이터에 etcd Pod가 접근할 수 있어야 하므로 주의가 필요합니다.
또한 etcd Pod에 새로운 디렉터리를 마운트 할 경우 잠시 동안 kube-apiserver와 통신이 불가능해지니 주의가 필요합니다.
Kubernetes 클러스터에 사용할 수 있는 고성능 API Gateway / Ingress Controller로 사용할 수 있는 NGINX의 엔터프라이즈 버전인 NGINX Plus를 체험해 보고 싶으시다면 NGINX STORE를 통해 문의해 무료로 NGINX Plus trial을 체험해 보세요.
댓글을 달려면 로그인해야 합니다.