본문 바로가기
스터디

ETCD란 무엇인가 etcd Backup & Restore

by 썩석 2024. 2. 6.
반응형

Kubernetes Cluster의 Node는 크게 두 가지로 구분될 수 있습니다.

Control Plane 노드: 클러스터의 머리 역할

Worker 노드: 사용자가 배포한 컨테이너가 실행되는 곳

 

 

etcd 개념

출처 - 쿠버네티스 홈페이지

Control Plane 노드에는 다양한 Component로 구성되어 있습니다.

API Server, Controller manager, Scheduler, etcd 등 다양한 Component가 있는데

그중 etcd는 쿠버네티스에서 일어나는 모든 이벤트를 저장하고 있는 저장소입니다.

쉽게 말하면 etcd는 쿠버네티스 클러스터의 데이터베이스입니다.

 

컨트롤플레인 노드, 마스터 노드에는 모두 kubelet이라는 Pod가 실행됩니다.

이 kubelet Pod에는 cadvisor가 포함되어 있으며 모든 이벤트를 ControlPlane 노드의 API Server로 보내고

API Server는 etcd로 Key: Value 형태로 저장이 됩니다.

 

etcd Config

etcd는 Control Plane 노드에 Static Pod형태로 실행되고 있습니다.

/etc/kubernetes/manifest/etcd.yaml

 

※ Static Pod: 특정 경로에 yaml을 위치하면 쿠버네티스가 자동으로 실행시켜 줌., Pod 가 삭제돼도 yaml 파일이 해당 경로에 있으면 재실행

 

etcd.yaml 파일을 간단히 살펴볼게요

etcd는 기본적으로 2379 포트를 사용하고 있으며,

엔드포인트(endpoint)는 Control Plane의 localhost인 127.0.0.1:2379, <Control Plane Node>:2379로 접근이 가능하며,

--cert-file, --key-file 경로에 있는 인증서/키 파일은 etcd에 대한 ssl/tls 인증이며 파일들로 https를 사용할 수 있습니다.

--trusted-ca-file: 경로에 있는 ca.crt는 etcd의 인증서 입니다.

 

앞서 말한 4가지는 etcd backup & restore에 사용되니 꼭 기억해 주세요!!

 

/etc/kubernetes/pki/etcd/server.crt을 decode 해봤습니다.

유효기간은 1년이며 SAN은 Control Plane Node/IP, localhost, 등 etcd에 접근할 수 있는 곳이 한정되어 있어요

 

 

 

/etc/kubernetes/pki/etcd/ca.crt를 복호화해봤습니다.

유효기관은 10년이며 etcd의 ca인 것을 확인할 수 있습니다.

 

etcd 백업 및 복구

 

 

 

이 부분은 CKA 시험에 꼭 나오니 유의하여 보시기 바랍니다.

 

etcdctl 사용할 때 $ ECTDCTL_API=3 또는 $ export ETCDCTL_API=3을 입력하여

etcdctl 버전을 명시해야 합니다. 

 

먼저 etcd backup을 먼저 알아볼게요

$ ETCDCTL_API=3 etcdctl snapshot save <경로 및 파일명> \
--endpoints="https://localhost:2379" \ #endpoint 경로 입력
--key=/etc/kubernetes/pki/etcd/server.key \ #--key-file 파일 경로
--cert=/etc/kubernetes/pki/etcd/server.crt \ #--cert-file 파일 경로
--cacert=/etc/kubernetes/pki/etcd/ca.crt #--trusted-ca-file 파일 경로

 

usage는 위와 같아요  샘플코드를 한번 볼게요

$ ETCDCTL_API=3 etcdctl snapshot save /opt/etcd.db \
--endpoints="https://localhost:2379" \
--key=/etc/kubernetes/pki/etcd/server.key \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--cacert=/etc/kubernetes/pki/etcd/ca.crt

명령어를 실행하면 해당 경로에 파일이 생기는 것을 볼 수 있어요

 

 

다음은 restore입니다.

$ ETCDCTL_API=3 etcdctl snapshot restore <경로 및 파일명>

 

usage는  위와 같고 샘플코드를 한 번 볼게요

$ ETCDCTL_API=3 etcdctl snapshot restore /opt/etcd.db

/opt폴더에 etcd.db이름을 가진 스냅샷이 생성됩니다.

etcd backup & restore 테스트

default namespace에 pod가 없는 상태에서 snapshot을 생성했어요

/opt폴더에 etcd.db라는 파일이 생겼습니다.

$ kubectl run nginx --image=nginx #nginx image로 nginx pod 생성
$ mkdir /var/etcd-new #디렉토리에 폴더 생성
$ ETCDCTL_API=3 etcdctl snapshot restore /opt/etcd.db

그다음 nginx pod 배포, 새로운 etcd의 새로운 디렉토리를 사용할 폴더를 생성 후 nginx pod가 잘 실행되고 있는지 확인!

etcd restore를 진행해 볼게요

 

restore를 한 후 /etc/kubernetes/manifest/etcd.yaml 파일을 수정해야 합니다.

끝쪽에 위치해 있는 etcd-data의 경로를 새로 저장할 폴더로 변경합니다.

변경을 완료하면 해당 디렉토리에는 etcd파일이 존재하게 되며 스냅샷을 생성했을 때로 돌아가게 됩니다.

저는 스냅샷 생성 당시 nginx pod가 없었기에 생성했던 nginx pod가 삭제됨을 볼 수 있습니다.

 

끝~

반응형