etcd 백업 및 복구 테스트 결과
ETCD_VER=v3.3.12
wget https://storage.googleapis.com/etcd/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf etcd-${ETCD_VER}-linux-amd64.tar.gz
mv etcd-${ETCD_VER}-linux-amd64/etcdctl /usr/bin/etcdctl
export ETCDCTL_API=3
etcdctl version
rm -rf etcd-${ETCD_VER}-linux-amd64/
rm -f etcd-${ETCD_VER}-linux-amd64.tar.gz
백업 테스트를 위한 pod배포를 진행
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
labels:
app: myapp
type: test
spec:
template:
metadata:
name: test-pod
labels:
app: myapp
type: test
spec:
containers:
- name: nginx-test
image: nginx:latest
replicas: 2
selector:
matchLabels:
type: test
yaml 파일을 이용하여 간단한 pod를 배포한다.
$ kubectl apply -f test.yaml
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/test-deployment-7f6679cc7d-5qwxx 1/1 Running 0 32s
pod/test-deployment-7f6679cc7d-855lp 1/1 Running 0 32s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/test-deployment 2/2 2 32s
NAME DESIRED CURRENT READY AGE
replicaset.apps/test-deployment-7f6679cc7d 2 2 2 32s
etcdctl의 스냅샷을 생성하기위해선 아래와같은 옵션이 필요.
etcdctl --cacert=옵션값 \
--cert=옵션값 \
--key=옵션값 \
snapshot save 백업경로 및 파일이름
옵션갑을 확인하는 방법은 ps명령어 와 grep을 를 활용.
Bold 처리된 내용이 백업시 필요한 정보이다.
$ ps -ef | grep etcd
root 2863 2764 1 05:36 ? 00\:00\:23 etcd --advertise-client-urls=https://10.178.0.2:2379 **--cert-file=/etc/kubernetes/pki/etcd/server.crt** --client-cert-auth=true --data-dir=/var/lib/etcd --initial-advertise-peer-urls=https://10.178.0.2:2380 --initial-cluster=master=https://10.178.0.2:2380 **--key-file=/etc/kubernetes/pki/etcd/server.key** --listen-client-urls=https://127.0.0.1:2379,https://10.178.0.2:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://10.178.0.2:2380 --name=master --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/etc/kubernetes/pki/etcd/peer.key --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --snapshot-count=10000 **--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt**
표를 참조하여 더 쉽게 확인

root 계정 or sudo 권한을 이용하여 백업 명령어를 실행.
root# etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /home/etcd_backup/etcd_backup1
Snapshot saved at /opt/backup
ls /home/etcd_backup
> etcd_backup1
생성한 백업 파일 있으면 백업 완료
앞에서 만든 deployment 를 삭제한다.
$ kubectl delete -f test.yaml
pod 삭제된 것 확인
$ kubectl get po
복구의 경우 추가적으로 4가지요소가 더 확인 이 필요하다.
표를 참조하여 더 쉽게 확인

root# etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--initial-advertise-peer-urls=https://10.178.0.2:2380 \
--initial-cluster=master=https://10.178.0.2:2380 \
--data-dir=/var/lib/etcd_backup \
--name=master \
snapshot restore /home/etcd_backup/etcd_backup1
/home/etcd_backup/etcd_backup1 에 생성해뒀던 스냅샷을이용해서 /var/lib 위치에 etcd_backup 파일을 생성. staticpod에서 실행되는 etcd가 이를 바라보도록 설정한다.
cd /etc/kubernetes/manifest
$ sudo vim etcd.yaml
~~~yaml
#etcd.yaml
...중략
volumes:
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
path: /var/lib/etcd_backup <----------- backup한 스냅샷을 바라보게 수정(위 복구 시 설정한 data-dir 위치)
type: DirectoryOrCreate
name: etcd-data
...
watch 명령어를 이용하여 pod가 잘 생성되었는지 확인한다.
바로 적용되지 않고 시간이 걸리니 기다린다.
$ watch kubectl get po

$ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
myapp-deployment 3/3 3 3 20s
굿...................
미리 snapshot 을 찍어둔게 없으면 의미가 없다.
주기적으로 백업 디자인을 만드는 것이 중요할것으로 보인다.