Kubernetes

ETCD Backup&Restore

Operation CWAL 2021. 5. 29. 12:06

ETCD는 K8s 클러스터의 모든 데이터가 위치한 저장소로, 주기적으로 백업하여 혹시 모를 재난에 대비할 수 있어야 한다. 다행히 자체적으로 스냅샷과 복원 기능을 제공하기 때문에 어렵지 않게 사용할 수 있다. K8s Master node에서 아래와 같은 작업을 진행한다.

etcdctl

CLI에서 etcd를 관리할 수 있는 툴이다. Ubuntu의 경우, etcd-client 패키지를 설치하면 바로 사용할 수 있다.

apt update -y && apt install -y etcd-client

 

Snapshot 생성

다음 명령어로 현재 etcd 클러스터의 snapshot을 현재 위치에 'etcd-snapshot.db' 파일로 저장할 수 있다.

ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/apiserver-etcd-client.crt \
--key=/etc/kubernetes/pki/apiserver-etcd-client.key \
snapshot save etcd-snapshot.db
  • ETCDCTL_API: 해당 환경변수를 따로 지정하지 않는 경우, etcdctl v2를 사용한다. 우리는 v3 API가 필요하기 때문에 ETCDCTL_API=3를 추가하였다.
  • --cacert: etcd 설정시 생성한 Certificate Authority 파일(/etc/kubernetes/pki/etcd/ca.crt)을 지정한다.
  • --key, --cert: K8s에서 etcd에 접근할 수 있는 Component는 kube-apiserver 뿐이다. 따라서 해당 Component에서 사용하는 Client 인증서(/etc/kubernetes/pki/apiserver-etcd-client.crt)와 Key(/etc/kubernetes/pki/apiserver-etcd-client.key)를 사용한다.

 

Snapshot 상태 확인

다음 명령어로 지정된 Snapshot 파일의 상태를 테이블 형식으로 확인 가능하다.

ETCDCTL_API=3 etcdctl snapshot status --write-out=table etcd-snapshot.db

 

Restore

1. kube-apiserver의 가동을 멈춘다. Static Pod으로 kube-apiserver를 실행중이라면 다음과 같이 Manifest 파일의 이름을 바꿔주는 것만으로 정지 가능하다.

cd /etc/kubernetes/manifests/
mv kube-apiserver.yaml kube-apiserver.yaml.tmp

 

2. 다음 명령어로 지정된 경로에 etcd 데이터 디렉토리를 생성한다..

ETCDCTL_API=3 etcdctl snapshot restore etcd-snapshot.db --data-dir /var/lib/etcd-backup

3. etcd의 데이터 디렉토리 경로를 변경한다. 예를 들어 Static Pod으로 etcd를 실행 중이라면 아래와 같이 Manifest 파일(/etc/kubernetes/manifests/etcd.yaml)을 수정한다.

#...
spec:
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://172.30.1.42:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    #- --data-dir=/var/lib/etcd
    - --data-dir=/var/lib/etcd-backup
#...

4. kube-apiserver를 가동한다. Manifest 파일의 이름을 원래대로 돌려놓는다.

cd /etc/kubernetes/manifests/
mv kube-apiserver.yaml.tmp kube-apiserver.yaml

 

'Kubernetes' 카테고리의 다른 글

Kubernetes: The Documentary  (0) 2022.02.04
PodDisruptionBudget을 활용한 Application 보호  (0) 2021.09.22
Open Policy Agent  (0) 2021.05.05
ETCD Encryption  (0) 2021.04.21
Imperative Vs. Declarative  (0) 2021.04.08