etcd 백업하기

Damian·2022년 2월 3일

kubernetes

목록 보기
5/7

etcd 백업 및 복구 테스트 결과

1. 설치 및 세팅

1-1. etcdctl 설치

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

1-2. 배포하기

백업 테스트를 위한 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

1-3. 상태 확인

$ 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 

2. 백업하기

2-1. 환경 세팅

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**

[표 참조]

표를 참조하여 더 쉽게 확인

2-2. 백업 명령어 실행

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
생성한 백업 파일 있으면 백업 완료

3. 복구 하기

3-1. 환경 세팅

앞에서 만든 deployment 를 삭제한다.
$ kubectl delete -f test.yaml

pod 삭제된 것 확인
$ kubectl get po

[표 참조]

복구의 경우 추가적으로 4가지요소가 더 확인 이 필요하다.

표를 참조하여 더 쉽게 확인

3-2. 복구하기

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

3-3. etcd 연결하기

/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

...

3-4. 결과 확인

watch 명령어를 이용하여 pod가 잘 생성되었는지 확인한다.

바로 적용되지 않고 시간이 걸리니 기다린다.

$ watch kubectl get po

$ kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
myapp-deployment   3/3     3            3           20s

굿...................
미리 snapshot 을 찍어둔게 없으면 의미가 없다.
주기적으로 백업 디자인을 만드는 것이 중요할것으로 보인다.

profile
oepenpen

0개의 댓글