[Kubernetes] Backup and Restore


서론

Kubernetes 클러스터를 안정적으로 운영하기 위해서는 정기적인 백업과 복원이 필요하다.

이 장에서는 Kubernetes 리소스를 백업하고 복원하는 두 가지 주요 방법에 대해 알아보자.

  • 첫 번째는 Kube API 서버를 통해 리소스 정의를 백업하는 방식이고
  • 두 번째는 etcd 데이터베이스 자체를 백업하는 방식이다.

Kube API Backup

Kubernetes에서 배포된 애플리케이션은 Deployment, Pod, Service 등으로 이루어져 있다.

이때 워크로드를 생성하는 방식이 2가지가 있다:

  • 명령형 방식(imperative): 명령어로 직접 리소스를 생성 (kubectl create ...)
  • 선언형 방식(declarative): YAML 정의 파일을 만들고 kubectl apply로 적용

선언형 방식은 yaml파일을 그대로 남겨두기 때문에 이들을 소스코드와 함께 Github 저장소에 보관하면 백업을 쉽게 할 수 있다.

하지만 명령형 방식으로 워크로드를 만들었다면 yaml파일이 없다.

이런 경우에는 kubectl get 명령어로 Kube API 서버에서 현재 클러스터의 워크로드 정보를 추출하여 백업할 수 있다.

kubectl get all --all-namespaces -o yaml > cluster-backup.yaml

(자동 백업을 원한다면 Velero와 같은 백업 도구를 사용하면 된다)

ETCD Backup

etcd는 Kubernetes 클러스터의 모든 상태 정보를 저장하는 핵심 데이터베이스이다.

클러스터의 노드, 네임스페이스, 리소스 구성 등이 모두 etcd에 저장되어 있기 때문에, etcd 자체를 백업하면 전체 클러스터를 한 번에 복원할 수 있다.

etcd는 etcdctl 명령어를 통해 스냅샷(snapshot) 을 생성하고 복원할 수 있다.

우선 etcdctl을 백업 등의 작업에 사용하려면 API 버전이 3.x인지 확인해야 한다.(etcdctl은 etcd를 위한 커맨드라인 클라이언트이다.)

etcdctl version

Snapshot-based Backup

etcd가 실행중인 서버에서 백업을 생성하려면 아래의 명령어를 사용한다.

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 /backup/etcd-snapshot.db

옵션 설명

  • -endpoints는 etcd 서버의 주소 지정(기본값: localhost:2379)
  • -cacert는 CA 인증서의 경로
  • -cert는 클라이언트 인증서의 경로
  • -key는 클라이언트 키의 경로

Checking Snapshot Status

스냅샷 파일의 메타데이터를 확인하려면 아래 명령어를 사용한다.


etcdctl snapshot status /backup/etcd-snapshot.db \
  --write-out=table

Restoring ETCD

스냅샷을 새로운 데이터 디렉토리에 복원하면 아래 명령어를 사용한다.

backup/etcd-snapshot.db 에 있는 백업파일을 /var/lib/etcd-restored에 복원하라는 뜻이다.

etcdutl snapshot restore /backup/etcd-snapshot.db \
  --data-dir /var/lib/etcd-from-backup

이후 나중에 복원하기 위해 etcd.yaml에 들어가 호스트 디렉토리를 업데이트 해주면된다.(etcd가 static pod로 실행되는 경우 파드 내부에서는 /var/lib/etcd에 파일을 저장하지만 실제는 호스트 디렉토리에 저장된다.

vim /etc/kubernetes/manifests/etcd.yaml
 ...
  volumes:
  - hostPath:
      path: /var/lib/etcd-from-backup # Newly restored backup directory
      type: DirectoryOrCreate
    name: etcd-data

Referece

https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/#backing-up-an-etcd-cluster