[Kubernetes] ETCD snapshot backup/restore

INYEONG KIM·2024년 8월 18일
post-thumbnail

ETCD snapshot 생성

ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 \
	 --cacert=/etc/kubernetes/pki/etcd/ca.crt \
     --cert=/etc/kubernetes/pki/etcd/server.crt \
     --key=/etc/kubernetes/pki/etcd/server.key \
     snapshot save /opt/snapshot-pre-boot.db

ETCD 인증서 관련파일들이 위치한 곳에서 etcdctl 커맨드 수행

ETCD snapshot 복구

ETCD의 구성 방식에 따라 복구 방식에 차이가 존재 (Stacked / External)

두 경우 모두 ETCD의 data-dir에 직접적으로 복구하지 않고, 임시 경로에 복구하였다가 Pod/서비스를 재시작해주는 방법을 권고

1. Stacked ETCD 복구

  1. ETCD의 data-dir 확인
$ k get po -n kube-system etcd-controlplane -o yaml
...
spec:
  containers:
  - command:
    - etcd
		...
    - --data-dir=/var/lib/etcd 		# 현재 ETCD의 data-dir 경로를 확인
  1. snapshot 파일복구 (임시 경로)
ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 \
	 --cacert=/etc/kubernetes/pki/etcd/ca.crt \
     --cert=/etc/kubernetes/pki/etcd/server.crt \
     --key=/etc/kubernetes/pki/etcd/server.key \
     --data-dir /var/lib/etcd-from-backup \  				### 복구할 위치 지정
     snapshot restore /opt/snapshot-pre-boot.db				### snapshot 파일명 지정
  1. etcd pod의 data-dir 경로 수정 후 pod 재시작
$ vi etcd.yaml
spec:
  containers:
  - command:
    - etcd
    ...
    - --data-dir=/var/lib/etcd
    ...
      volumeMounts:
          - mountPath: /var/lib/etcd-from-backup	# 수정
            name: etcd-data          
   ...
   volumes:
   - hostPath:
       path: /var/lib/etcd-from-backup				# 수정
       type: DirectoryOrCreate
     name: etcd-data

2. External ETCD 복구

  1. kube-apiserver 정보를 통해 etcd 구성 내용 1차 확인
$ k get po -n kube-system kube-apiserver-controlplane -o yaml | grep etcd
    - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.pem
    - --etcd-certfile=/etc/kubernetes/pki/etcd/etcd.pem
    - --etcd-keyfile=/etc/kubernetes/pki/etcd/etcd-key.pem
    - --etcd-servers=https://{{{ETCD 서버 IP}}}:2379
  1. ETCD의 data-dir 확인
    ETCD 가 구축되어 있는 머신에 대한 권한획득 및 접속은 별도로 수행 필요
$ systemctl status etcd
● etcd.service - etcd key-value store
   Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2024-08-18 14:04:42 UTC; 41min ago
     Docs: https://github.com/etcd-io/etcd
 Main PID: 833 (etcd)
    Tasks: 39 (limit: 251379)
   CGroup: /system.slice/etcd.service
           └─833 /usr/local/bin/etcd --name etcd-server --data-dir=/var/lib/etcd-data --cert-file=/etc/etcd/pki/etcd.pem --key
           ...

또는
$ ps -ef | grep etcd

또는
서비스경로에서 etcd.service 파일 확인
  1. snapshot 파일복구 (임시 경로)
ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 \
	 --cacert=/etc/kubernetes/pki/etcd/ca.crt \
     --cert=/etc/kubernetes/pki/etcd/server.crt \
     --key=/etc/kubernetes/pki/etcd/server.key \
     --data-dir /var/lib/etcd-from-backup \  				### 복구할 위치 지정
     snapshot restore /opt/snapshot-pre-boot.db				### snapshot 파일명 지정
  1. 복구 파일의 권한 수정
## 복구한 파일을 기존과 동일하게 변경 (etcd:etcd 로 가정)
$ chown -R etcd:etcd /var/lib/etcd-from-backup

권한이 올바르지 않을 경우 아래와 같은 오류가 발생

Aug 18 14:04:30 etcd-server systemd[1]: systemd-journald.service: Failed to add fd to store: Operation not permitted
Aug 18 14:04:30 etcd-server systemd[1]: systemd-journald.service: Failed to add fd to store: Operation not permitted
Aug 18 14:04:30 etcd-server systemd[1]: systemd-journald.service: Failed to add fd to store: Operation not permitted
Aug 18 14:04:30 etcd-server systemd[1]: systemd-journald.service: Failed to add fd to store: Operation not permitted
Aug 18 14:04:30 etcd-server systemd[1]: systemd-journald.service: Failed to add fd to store: Operation not permitted
  1. etcd service 의 파일경로 수정 후 서비스 재시작
$ vi etcd.service

...
[Service]
User=etcd
Type=notify
ExecStart=/usr/local/bin/etcd \
  --name etcd-server \
  --data-dir=/var/lib/etcd-from-backup				## 복구된 경로로 변경
...


$ systemctl daemon-reload

$ systemctl restart etcd

참고

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

profile
미래의 저를 위해 작성하는 중입니다 🙆‍♂️

0개의 댓글