본문 바로가기
kubenetes

etcd backup, restore

by kyeongseo.oh 2022. 9. 15.

etcdctl을 사용해 etcd를 backup한다.

 

작업 전 준비사항

etcd를 backup하기 위해서는 ca.crt, server.crt, server.key가 필요함
crt 및 key등의 인증정보는 etcd가 구동중인 서버의 /etc/kubernetes/pki/etcd에 존재 (default)
etcd가 구동중인 서버가 아닌 타 서버에서 etcd backup을 위해서는 etcd server에 있는 인증정보를 복사해와야함

 

1. etcd는 kube-system에 static pod으로 존재한다. etcd가 pod이 구동 중인지 확인한다.

[root@km ~]# kubectl get pod -n kube-system
NAME                                  READY   STATUS    RESTARTS       AGE
coredns-64897985d-7z9z7               1/1     Running   4 (30d ago)    178d
coredns-64897985d-l4lcv               1/1     Running   4 (30d ago)    178d
etcd-km.dd.io                         1/1     Running   46 (30d ago)   178d
fuse-device-plugin-daemonset-sckml    1/1     Running   1 (30d ago)    52d
kube-apiserver-km.dd.io               1/1     Running   41 (30d ago)   178d
kube-controller-manager-km.dd.io      1/1     Running   8 (30d ago)    178d
kube-proxy-hmm8l                      1/1     Running   4 (30d ago)    178d
kube-proxy-sq298                      1/1     Running   3 (30d ago)    178d
kube-scheduler-km.dd.io               1/1     Running   8 (30d ago)    178d
kube-state-metrics-75fbcc566c-x942r   1/1     Running   2 (30d ago)    83d
metrics-server-87b888b69-bng7h        1/1     Running   3 (30d ago)    83d

 

2. etcd가 해당 서버에서 동작 중인지 확인하고 인증서의 위치를 파악한다.
ca.crt, server.crt, server.key의 위치를 확인한다.

[root@km manifests]# ps -ef | grep etcd
root       2535   2478 16 22:36 ?        00:00:40 kube-apiserver --advertise-address=172.30.1.144 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-account-signing-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
root       2544   2453  6 22:36 ?        00:00:15 etcd --advertise-client-urls=https://172.30.1.144:2379 --cert-file=/etc/kubernetes/pki/etcd/server.crt --client-cert-auth=true --data-dir=/var/lib/etcd --initial-advertise-peer-urls=https://172.30.1.144:2380 --initial-cluster=km.dd.io=https://172.30.1.144:2380 --key-file=/etc/kubernetes/pki/etcd/server.key --listen-client-urls=https://127.0.0.1:2379,https://172.30.1.144:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://172.30.1.144:2380 --name=km.dd.io --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@km manifests]# cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd
    - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
    - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
    - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
    - --etcd-servers=https://127.0.0.1:2379

 

etcd cluster를 별도로 구성한 경우 kube-apiserver에서 해당 etcd cluster에 접속해 데이터를 저장, 읽어오므로 kube-api를 확인한다.

ps -ef | grep kube-api

 

3. etcdctl을 설치한다. (centos7 기준)

yum install -y etcd

 

4. etcd snapshot을 backup한다.

snapshot을 /tmp/etcd-backup.db 저장한다.

etcd cluster인 경우 --endpoint='172.30.1.144,172.30.1.145,172.30.1.146'을 사용

[root@km manifests]# ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-backup.db --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --endpoints=172.30.1.144:2379

 

tmp 디렉토리 및에 backup 파일이 생성되었는 지 확인한다.

[root@km etcd]# ll /tmp/
total 13408
-rw-r--r--. 1 root root 13725728 Sep 15 00:10 etcd-backup.db

 

5. etcd restore

etcd snapshot을 통해 cluster을 복원한다.

etcd restore은 새로운 디렉토리에 데이터를 풀고 etcd.yaml 파일을 edit하는 방식으로 진행된다.

복원의 경우 원격서버에서 작업하는 것이 어려울 것으로 예상된다.

 

테스트를 위해 pod을 하나 지우고 복원이 정상적으로 되는 지 확인

[root@km ~]# kubectl get pod
NAME                                                 READY   STATUS    RESTARTS        AGE
kst                                                  1/1     Running   3 (30d ago)     153d
modify                                               1/1     Running   5 (30d ago)     163d
nfs-pod-provisioner-6f9ff9cbf5-xdp66                 0/1     Error     3339            116d
nfs-quota-provisioner-7dcdcc856b-gq42t               1/1     Running   3 (30d ago)     119d
prometheus-pushgateway-1656251766-74949d7dd4-2hrbr   1/1     Running   2 (30d ago)     80d
pytest7                                              1/1     Running   3 (30d ago)     158d
python39                                             1/1     Running   966 (49m ago)   73d
ubuntu                                               1/1     Running   526 (48m ago)   52d
[root@km ~]# kubectl delete pod kst
pod "kst" deleted

 

5.1 restore 커맨드를 실행한다.

default 데이터 저장소인 /var/lib/etcd 대신 /var/lib/etcd-backup에 snapshot을 푼다.

etcd cluster으로 구성한 경우 모든 etcd node에서 동일한 작업이 수행되어야 한다.

[root@km ~]# ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup.db --data-dir /var/lib/etcd-backup
2022-09-15 01:29:07.322286 I | mvcc: restore compact to 25487624
2022-09-15 01:29:07.332196 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32

 

5.2 etcd.yaml 파일을 수정한다.

etcd yaml의 위치는 /etc/kubernetes/manifests/

hostPath를 /var/lib/etcd에서 /var/lib/etcd-backup으로 수정하는 작업이 필요함

static pod이라 yaml을 수정하면 pod이 재생성되며 수정사항이 적용된다.

아래 커맨드를 사용하면 mountPath도 수정되지만 크게 상관없음

sudo sed -i 's+/var/lib/etcd+/var/lib/etcd-backup+g' /etc/kubernetes/manifests/etcd.yaml

 

5.3 정상적으로 복원되었는 지 확인한다.

delete한 kst pod이 정상적으로 복구되었음

복원에 일정시간 소요되는 것으로 확인된다.

[root@km snap]# kubectl get pod
NAME                                                 READY   STATUS    RESTARTS         AGE
kst                                                  1/1     Running   3 (30d ago)      153d
modify                                               1/1     Running   5 (30d ago)      163d
nfs-pod-provisioner-6f9ff9cbf5-xdp66                 0/1     Error     3339             116d
nfs-quota-provisioner-7dcdcc856b-gq42t               1/1     Running   3 (30d ago)      119d
prometheus-pushgateway-1656251766-74949d7dd4-2hrbr   1/1     Running   2 (30d ago)      80d
pytest7                                              1/1     Running   3 (30d ago)      158d
python39                                             1/1     Running   965 (119m ago)   73d
ubuntu                                               1/1     Running   525 (119m ago)   52d

 

6. 주기적으로 backup하기 위한 shell 작성

생성된 지 5일 이상 지난 파일 삭제하도록 한다.

#!/bin/bash
DATA=`date +%y%m%d`
BACUPDIR=/ks/backup/etcd
ENDPOINTS='172.30.1.144:2379'
timestamp=`date +%Y%m%d%H`
if [ ! -d "$BACUPDIR" ]; then
    echo "making dir $BACUPDIR"
    mkdir -p $BACUPDIR
fi
ETCDCTL_API=3 etcdctl snapshot save $BACUPDIR/snapshot_$timestamp.db --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --endpoints=$ENDPOINTS
find $BACUPDIR -name *.db  -mtime +5 -exec rm -rf {} \;

'kubenetes' 카테고리의 다른 글

external etcd backup & restore  (0) 2022.09.18
k8s external etcd 구성  (1) 2022.09.17
docker 이미지 수정하는 방법  (1) 2022.04.05
k8s flask web 수정하기  (0) 2022.04.04
ImagePullBackOff error 해결  (0) 2022.04.02

댓글