모종의 이유로 클러스터에 문제가 생겨 특정 시점으로 복원을 해야하는 경우가 있음.
etcd의 백업/복구를 통해 백업한 시점으로 클러스터 복원이 가능.
클러스터 정보
마스터 1대, 워커 2대인 클러스터 (CentOS8)
kubernetes v1.21.4 버전이 설치되어 있음.
alias 세팅은 먼저 해줍니다.
$ alias etcdctl='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'
해당 설정을 해주지 않으면
다음과 같이 etcdctl 커맨드가 정상적으로 수행되지 않는것을 확인할 수 있습니다.
설정 이후에는
다음과 같이 정상적으로 etcdctl이 동작함을 확인할 수 있습니다.
## etcd 백업 커맨드
$ etcdctl snapshot save {백업경로}/{백업할파일명}
위 커맨드를 이용해 실제로 백업을 진행하면
$ etcdctl snapshot save /root/etcd-backup/etcd-`date +%Y%m%d_%H%M%S`
다음과 같이 정상적으로 백업이 완료됨을 확인할 수 있습니다.
추가적으로 마스터 삼중화가 되어 있는 환경에서는 한개의 마스터에서 백업을 받으면 됩니다.
백업 받은 파일을 사용해 복구를 시작합니다.
마스터 삼중화가 되어 있는 환경에서는 백업 받은 파일을 다른 마스터 노드에도 모두 옮겨줍니다.
테스트 시나리오
- etcd 백업 시점 이후 기존에 있던 namespace(api-gateway-system)를 하나 삭제해줍니다.
- etcd 복구를 수행합니다.
- etcd 백업 시점에 있었던 namespace(api-gateway-system)가 복구된 것을 확인합니다.
여기서 api-gateway-system 네임스페이스를 삭제하겠습니다.
정상적으로 삭제된 것을 확인합니다.
다음 명령어를 사용하여 etcd 복구를 수행합니다.
## master1에서 etcd 복구 커맨드(마스터 삼중화 환경 고려)
$ etcdctl snapshot restore {백업파일명} \
--name {master1_hostname} \
--data-dir /var/lib/etcd/recover \
--initial-cluster {master1_hostname}=https://{master1_IP}:2380,{master2_hostname}=https://{master2_IP}:2380,{master3_hostname}=https://{master3_IP}:2380 \
--initial-advertise-peer-urls https://{master1_IP}:2380
## master1만 있는 경우 initial-cluster 옵션에서 master1의 정보만 남기고 master 2,3정보를 지워준다.
## 마스터삼중화 구조에서는 master2와 master3에서 위 커맨드 수행시 name옵션과 initial-advertise-peer-urls의 master1값을 master2,3에 맞게 바꾸어 수행하면 된다.
실제로 커맨드를 수행해보면
이후 복구가 된 /var/lib/etcd 디렉토리로 이동하여 기존에 존재하는 member 디렉토리를 지우고 복구 된 recover 디렉토리를 member로 이름을 변경해줍니다.
마지막으로 etcd 컨테이너를 재기동해줍니다.
테스트 환경에서는 container runtime으로 crio를 사용중이라 crictl 커맨드를 사용하여 etcd 컨테이너를 지워줬습니다.
$ crictl stop {etcd컨테이너_id}
$ crictl rm {etcd컨테이너_id}
잠시 기다리고 etcd 컨테이너가 다시 올라오는것을 확인합니다.
etcd가 정상화 되면 kubectl 커맨드를 통해 api-gateway-system namespace와 해당하는 namespace에 있던 파드들이 복구 됨을 확인합니다.
etcd 백업을 주기적으로 하여 클러스터에 문제가 생겼을 때를 대비하면 좋습니다. (Cron으로 자동화)
마스터가 삼중화로 구성된 환경에서는 반드시 각 마스터 노드의 인증서(/etc/kubernetes/ssl or pki)를 가지고 진행해야하며 동일한 백업 파일로 수행해야 합니다.