본문 바로가기

kubernetes, helm, rancher

kubernetes etcdctl backup

kubernetes volume, resources 등을 backup 하는 방법은 여러가지가 있다.

예를 들어 declative한 방법으로, 모든 resource를 하나의 yaml 파일안에 넣어 create하는 방법이 있다.

kubectl get all --all-namespaces -o yaml > [file-name.yaml] -> 모든 resource 정보를 한 파일에 저장.

또한 etcdctl을 이용해 backup, restore 하는 방법도 있다.

하지만 아래와 같은 이유로 kubernetes 자원과 volume을 백업, 관리해주는 velero를 사용하는 것이 좋다.

 

  1. 개인 local에 kubernetes cluster가 있는 것이 아니라 GKE를 사용하는 등의 etcd 접근 권한이 없을 경우.
  2. resource 뿐만 아니라 volume 상태까지 backup하고 싶은 경우.
  3. 다른 cluster로 migration하고 싶은 경우.
  4. 모든 resource가 아니라 특정 부분의 resource만 백업하고 싶은 경우.
  5. 단일 etcd가 아닌 multiple etcd를 가지는 cluster일 경우.

따라서 velero를 사용하는 편이 낫지만, velero는 나중에 주제를 다뤄서 설명하기로 하고, 지금은 etcdctl을 이용하여 backup, restore하는 방법을 알아보겠다.

 

일단 etcdctl 명령어를 실행하기 위해서 etcd-client를 설치해야한다.

sudo apt update
sudo apt install etcd-client

 

etcdctl --help를 보면 ETCDCTL_API 환경변수가 설정되어야 한다. version을 3으로 설정할 것이기 때문에ETCDCTL_API=3을 export한다.

export ETCDCTL_API=3

하지만 sudo를 사용할 경우 해당 환경변수가 적용이 안되기 때문에 에러가 발생한다. 따라서 sudo -E etcdctl ~~ 명령어를 실행하던지, /etc/sudoers 파일에 적용해 줄 환경변수명을 나열하면 된다. 아니면 sudo ETCDCTL_API=3 etcdctl ~~로 실행해도 된다.

 

etcd에 접근하기 위해서는 인증서를 넘겨주어야 한다. 즉, server 인증서, server key, ca 인증서를 etcdctl 명령어를 사용할 때 넘겨주어야 한다.

etcdctl --cacert="/etc/kubernetes/pki/etcd/ca.crt" \
--cert="/etc/kubernetes/pki/etcd/server.crt" \
--key="/etc/kubernetes/pki/etcd/server.key" \
snapshot save /opt/snapshot-backup.db

인증서와 key의 위치는 /etc/kubernetes/manifests/etcd.yaml에 보면 있다.

kubectl describe pod etcd-controlplane -n kube-system을 통해서도 확인할 수 있다.

 

etcdctl snapshot status /opt/snapshot-backup.db

을 통해 백업한 파일 상태를 확인할 수 있는데, 이후  명령어에서는 인증서를 넘겨주지 않아도 된다.

 

 

etcdctl snapshot restore /opt/snapshot-backup.db --data-dir=/var/lib/etcd-from-backup

 /var/lib/etcd-from-backup 디렉토리가 생성되고 data가 저장된다.

 

/etc/kubernetes/manifests/etcd.yaml에서 volumes['hostPath'].path=/var/lib/etcd-from-backup으로 바꿔주면 docker container에서 etcd가 재시작 된다.

host volume 위치를 백업한 파일 위치로 설정한 다음 그 위치를 --data-dir 위치로 마운트 한 다음 --data-dir 위치에 있는 파일을 이용해 etcd를 실행하는 것이기 때문에, hostPath 위치만 백업한 파일 위치로 바꿔주면 된다.

 

파일이 변경되면 자동으로 etcd가 재시작되는데 docker로 확인해보면 다시 재시작함을 알 수 있다.

 

추가적으로 위의 etcd 설정에서 2379 포트는 모든 control plane components에서 접근하는 주소이며, 2380은 다른 노드에서 접근할 때 쓰이는 주소이다. 하지만 multiple master node 환경일 경우 해당하지 않는다.