[CKA] etcd 백업과 복구

etcd 백업과 복구의 핵심 개념과 구성 방법, 실습 풀이를 정리합니다.

백업과 복구 방법론을 알아봅니다.
클러스터에 다양한 deploy, pod, service 들이 배포되었습니다. 관련된 모든 정보를 etcd 클러스터에서 저장합니다. 또한 명령형, 선언형 방식으로 리소스를 생성할 수도 있으며 관련 파일을 항상 저장해두는게 좋습니다.

선언적 접근 방법이 선호되지만 정해진 기준이 없는 만큼, 리소스 구성을 백업하는 더 좋은 방법은 kube-apiserver를 사용하는 방법입니다.

백업하는 두 가지 방법

1. Backup - Resource Configs

kube-apiserver에 직접 엑세스하거나 쿼리를 통해 클러스터에 생성된 모든 개체의 리소스 구성을 복사해 저장할 수 있습니다.

kubectl get all --all-namespaces -o yaml > all-deploy.yaml

이러한 방식을 사용하는 VELERO 등이 있습니다.

2. Backup - ETCD

etcd의 경우 클러스터 상태에 관한 정보를 저장합니다
클러스터 자체의 정보, 노드 및 클러스터 내부에서 생성된 모든 리소스가 저장되며 아까처럼 리소스를 백업하는 대신 etcd 서버 자체를 백업하는 방식을 선택할 수 있습니다.

etcd cluster는 마찬가지로 마스터 노드에 호스팅 되어 있으며, 구성하는 동안 모든 데이터가 저장될 장소를 명시하고 있습니다. (etcd.service 참고)

데이터 디렉토리로 backup 도구를 사용하여 구성할 수 있습니다.
etcd는 빌트인 스냅샷 솔루션도 존재합니다.
etcdctl \ snapshot save snapshot.db
etcdctl \ snapshot status snapshot.db

Restore - ETCD

추후 복구하려고 한다면 서비스를 다시 시작해야합니다. 우선 kube-apiserver가 etcd를 참조하기 때문에 서비스 영향을 위해 kube-apiserver를 중단합니다.
이후 etcd restore 명령어를 실행하여 저장소를 복원합니다.
복구될 때 새 클러스터 구성으로 초기화하고 etcd의 멤버를 새로운 클러스터의 멤버로 구성합니다.

이후 디렉터리를 새로운 디렉터리로 변경하며 etcd 서비스 데몬을 재시작하면 됩니다.

중요한건 etcd 데이터베이스를 백업할 때 엔드포인트, 인증서, 그리고 키를 함께 지정하는 것이 중요합니다.
ETCD 데이터베이스가 TLS가 활성화되어 있으므로 다음 옵션들이 필수적입니다.

  1. -cacert
    • 번역: TLS가 활성화된 보안 서버의 인증서를 이 CA 번들을 사용하여 확인합니다.
    • 정리: 서버 인증서의 신뢰성을 검증하는 데 사용되는 인증 기관(CA) 인증서 파일 경로
  2. -cert
    • 번역: 이 TLS 인증서 파일을 사용하여 보안 클라이언트를 식별합니다.
    • 정리: 클라이언트 인증에 사용되는 TLS 인증서 파일 경로
  3. -endpoints=[127.0.0.1:2379]
    • 번역: ETCD가 마스터 노드에서 실행되고 localhost 2379에 노출되어 있으므로 이것이 기본값입니다.
    • 정리: ETCD 서버의 접근 주소와 포트, 기본적으로 로컬호스트의 2379 포트 사용
  4. -key
    • 번역: 이 TLS 키 파일을 사용하여 보안 클라이언트를 식별합니다.
    • 정리: 클라이언트 인증에 사용되는 TLS 개인 키 파일 경로

etcd 명령어 정리

export ETCDCTL_API=3
etcdctl snapshot save -h

etcd 백업 방법

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> \
  snapshot save <backup-file-location>
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_API=3 etcdctl  --data-dir /var/lib/etcd-from-backup \
snapshot restore /opt/snapshot-pre-boot.db

다음으로 /etc/kubernetes/manifests/etcd.yaml 을 업데이트하여 hostPath를 새로운 스냅샷 경로로 복원합니다.

volumes:
  - hostPath:
      path: /var/lib/etcd-from-backup
      type: DirectoryOrCreate
    name: etcd-data

참고 1: ETCD 파드가 변경되었으므로 자동으로 재시작되며, kube-controller-manager와 kube-scheduler도 재시작됩니다. 이 파드들이 재시작되는 데 1-2분 정도 기다리세요. watch "crictl ps | grep etcd" 명령을 실행하여 ETCD 파드가 언제 재시작되는지 확인할 수 있습니다.
kube-apiserver 또한 etcd의 변경을 감지하고 자동으로 재시작됩니다.
참고 2: etcd 파드가 Ready 1/1 상태가 되지 않으면, kubectl delete pod -n kube-system etcd-controlplane 명령으로 재시작하고 1분 정도 기다리세요.
참고 3: 이는 ETCD 파드가 재생성된 후 복원된 데이터를 사용하도록 하는 가장 간단한 방법입니다. 다른 것은 변경할 필요가 없습니다.
ETCD YAML 파일에서 --data-dir을 /var/lib/etcd-from-backup으로 변경하는 경우, etcd-data에 대한 volumeMounts도 업데이트되어야 하며, mountPath가 /var/lib/etcd-from-backup을 가리키도록 해야 합니다 (이 전체 단계는 선택사항이며 복원을 완료하는 데 필요하지 않습니다)


ps -ef 명령어는 시스템에서 실행 중인 모든 프로세스의 상세 정보를 표시하는 Unix/Linux 명령어입니다.

etcd가 어디있는지 확인하기
controlplane 노드에 접속하여 /etc/kubernetes/manifest 를 살펴보면 어디서 많이 사용되는지 확인할 수 있습니다.
혹은 kube-apiserver를 참조하여 확인할 수 있습니다.

외부 ETCD 토폴로지는 ETCD가 Kubernetes 마스터 노드와는 별도의 서버에서 실행되고 있음을 의미합니다. 따라서 ETCD의 설정을 확인하기 위해서는 ETCD가 실행되고 있는 서버에 접근해야합니다.
ps -ef | grep --color=auto etc

etcd 엔드포인트 조회

kubectl describe pods -n kube-system etcd-control-plane.example | grep advertise-client-urls

인증서 경로 찾기

kubectl describe pods -n kube-system etcd-control-plane.example | grep pki

ETCD 설정 전체 확인

kubectl describe pods -n kube-system etcd-control-plane.example

명령은 반드시 control-plane.example 노드에서 실행해야 합니다. 그래야 ETCD 인증서 파일에 접근할 수 있습니다.

ssh control-plane.example

ETCDCTL_API=3 etcdctl \
--endpoints=https://192.0.2.20: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/cluster-snapshot.db

scp control-plane.example:/opt/cluster-snapshot.db /opt

외부 etcd 업그레이드
스냅샷을 복원합니다.

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/etcd/pki/ca.pem --cert=/etc/etcd/pki/etcd.pem --key=/etc/etcd/pki/etcd-key.pem snapshot restore /root/cluster-snapshot.db --data-dir /var/lib/etcd-data-new

vi /etc/systemd/system/etcd.service vim을 통해 data-dir 을 업데이트 합니다.

vi /etc/systemd/system/etcd.service

etcd 사용자와 그룹에서 접근 가능하도록 설정합니다.

chown -R etcd:etcd /var/lib/etcd-data-new

etcd 서버가 해당 디렉토리를 참조할 수 있도록 재시작합니다.

systemctl daemon-reload 
systemctl restart etcd