포스트

Etcd 백업 및 복구 절차

Etcd 백업 및 복구 절차

1. 필요한 도구 설치

1.1 etcdct 설치

1
2
3
4
5
6
7
8
# 1. etcdctl 다운로드
[root@k8s-master local]# curl -L https://github.com/etcd-io/etcd/releases/download/v3.5.17/etcd-v3.5.17-linux-amd64.tar.gz -o /tmp/etcd.tar.gz

# 2. 다운드한 tar.gz 파일을 압축해제
[root@k8s-master local]# tar xzvf /tmp/etcd.tar.gz -C /tmp

# 3. 실행 파일을 /usr/local/bin 으로 이동
[root@k8s-master local]# mv /tmp/etcd-v3.5.17-linux-amd64/etcd* /usr/local/bin/

1.2 etcd endpoint 확인

etcd의 클라이언트 URL을 확인하기 위해 아래의 명령어를 실행합니다.

1
2
[root@k8s-master ~]# ps aux | grep etcd | awk -F '--listen-client-urls=' '{print $2}' | awk '{print $1}'
https://127.0.0.1:2379,https://192.168.56.30:2379

1.3 etcdctl 인증키 등록

1.3.1 etcdctl alias 등록(선택 1)

etcdctl 명령어를 간편하게 사용하기 위해 alias를 등록합니다.

1
[root@k8s-master ~]# alias etcdctl='ETCDCTL_API=3 etcdctl --endpoints=https://192.168.56.30:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key'

이 alias를 등록하면, 매번 ETCDCTL_API=3 및 인증서 경로를 입력할 필요 없이 간편하게 etcdctl 명령어를 사용할 수 있습니다.

1.3.2 환경변수 등록(선택 2)

1
2
3
4
5
[root@k8s-master ~]# export ETCDCTL_API=3
[root@k8s-master ~]# export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
[root@k8s-master ~]# export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt
[root@k8s-master ~]# export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key
[root@k8s-master ~]# export ETCDCTL_ENDPOINTS=https://192.168.56.30:2379

이 환경 변수들은 etcdctl 명령어를 사용하기 위해 필요한 인증서, 인증키, Endpoint 정보를 포함합니다.

1.4 etcd 상태 확인

1
2
3
4
5
6
7
8
9
10
11
# endpoint health check
[root@k8s-master ~]# etcdctl endpoint health
https://192.168.56.30:2379 is healthy: successfully committed proposal: took = 6.859308ms

# etcd 세부 상태 확인
[root@k8s-master ~]# etcdctl endpoint status --write-out=table
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|          ENDPOINT          |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://192.168.56.30:2379 | 7a3a42e9f89c112c |   3.5.7 |  6.9 MB |      true |      false |         6 |     203898 |             203898 |        |
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

2. etcd 백업 수행

etcdctl 명령어를 사용하여 스냅샷을 생성합니다.

1
2
3
[root@k8s-master ~]# etcdctl snapshot save /backup/etcd-backup-$(date +%F).db
...
Snapshot saved at /backup/etcd-backup-2025-01-08.db

3. etcd 복구 절차

3.1 복구 방법 1 : 스냅샷 복원 후 etcd.yaml 수정

3.1.1 스냅샷 복원

1
2
3
4
5
6
7
# 스냅샷 복원
[root@k8s-master ~]# etcdutl snapshot restore /backup/etcd-backup-2025-01-08.db --data-dir /var/lib/etcd-backup-$(date +%F)
...

# 복원된 디렉터리 확인
[root@k8s-master ~]# ls /var/lib/etcd-backup-2025-01-08/
member

3.1.2 etcd.yaml 수정

/etc/kubernetes/manifests/etcd.yaml 파일을 열어 hostPath를 스냅샷 복원했던 디렉터리로 변경합니다. etcd는 정적 파드로 yaml 파일이 수정되면 자동으로 설정이 적용됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@k8s-master ~]# vi /etc/kubernetes/manifests/etcd.yaml

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/etcd.advertise-client-urls: https://192.168.56.30:2379
  creationTimestamp: null
  labels:
    component: etcd
    tier: control-plane
  name: etcd
  namespace: kube-system
....
  - hostPath:
      path: /var/lib/etcd-backup-2025-01-08     <<--------- 수정
      type: DirectoryOrCreate

3.2 복구 방법 2 : 스냅샷 복원 후 member 파일 교체

3.1.2 스냅샷 복원

1
2
3
4
5
6
7
# 스냅샷 복원
[root@k8s-master ~]# etcdutl snapshot restore /backup/etcd-backup-2025-01-08.db --data-dir /var/lib/etcd-backup-$(date +%F)
...

# 복원된 디렉터리 확인
[root@k8s-master ~]# ls /var/lib/etcd-backup-2025-01-08/
member

3.1.3 member 파일 교체

1
2
3
[root@k8s-master ~]# mv /var/lib/etcd /var/lib/etcd.bak
[root@k8s-master ~]# mkdir /var/lib/etcd
[root@k8s-master ~]# mv /var/lib/etcd-backup-2025-01-08/member /var/lib/etcd/

3.1.4 etcd 재시작

1
2
3
4
5
6
7
# etcd container id 확인
[root@k8s-master ~]# crictl --runtime-endpoint unix:///run/containerd/containerd.sock ps
CONTAINER           IMAGE               CREATED             STATE               NAME                        ATTEMPT             POD ID              POD
e78fa7ae1adbb       86b6af7dd652c       24 hours ago        Running             etcd                        0                   1af5613b2e3eb       etcd-k8s-master

# etcd 재시작(stop시 자동으로 재실행됨)
[root@k8s-master ~]# crictl --runtime-endpoint unix:///run/containerd/containerd.sock stop e78fa7ae1adbb

3.2 복구 상태 확인

etcd가 정상적으로 동작하는지 확인합니다.

1
2
[root@k8s-master ~]# etcdctl endpoint health
https://192.168.56.30:2379 is healthy: successfully committed proposal: took = 6.859308ms

4. 참고 문서

etcd 설치

https://etcd.io/docs/v3.6/op-guide/recovery/#restoring-a-cluster

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

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.