CKA 시험시 나오는 ETCD 백업 및 복구하는 방법에 대해 실습하는 과정을 작성하였습니다.
ETCD란?
핵심 Kubernetes 구성 요소에 포함되며 작동하는 내결함성 Kubernetes 클러스터를 만들기 위한 기본 키-값 저장소 역할
쿠버네티스 클러스터의 정보를 저장(memory)해서 사용
모든 etcd 데이터는 etcd 데이터베이스 파일에 보관 : /var/lib/etcd
ETCDCTL 설치
참고 URL : Releases · etcd-io/etcd (github.com)
Releases · etcd-io/etcd
Distributed reliable key-value store for the most critical data of a distributed system - etcd-io/etcd
github.com
github에 나온 방법대로 설치를 진행합니다.
ETCD_VER=v3.5.12
# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
/tmp/etcd-download-test/etcd --version
/tmp/etcd-download-test/etcdctl version
/tmp/etcd-download-test/etcdutl version
[root@rke2-controll ~]# /tmp/etcd-download-test/etcd --version
etcd Version: 3.5.12
Git SHA: e7b3bb6cc
Go Version: go1.20.13
Go OS/Arch: linux/amd64
[root@rke2-controll ~]# /tmp/etcd-download-test/etcdctl version
etcdctl version: 3.5.12
API version: 3.5
[root@rke2-controll ~]# /tmp/etcd-download-test/etcdutl version
etcdutl version: 3.5.12
API version: 3.5
ETCD 백업
k8s master의 장애로 ETCD데이터베이스가 유실될 경우를 대비하여, Backup을 제공합니다 (ETCD snapshot)
ETCD Restore
백업시 저장했던 snapshot을 사용하여 etcd를 복원합니다.
실습을 위해 nginx deployment를 생성하고 진행하겠습니다.
kubectl create namespace cka-test
kubectl create deployment webserver --image=nginx:1.14 --replicas=2 --namespace=cka-test
[root@rke2-controll ~]# kubectl get deployments -A
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
calico-apiserver calico-apiserver 2/2 2 2 46m
calico-system calico-kube-controllers 1/1 1 1 47m
calico-system calico-typha 2/2 2 2 47m
cka-test webserver 2/2 2 2 45s
kube-system coredns 2/2 2 2 120m
tigera-operator tigera-operator 1/1 1 1 52m
ETCD 백업방법
참고 : Operating etcd clusters for Kubernetes | Kubernetes
etcdctl 툴 설치를 확인 후 아래 명령어를 진행합니다.
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>
참고로, ca,cert,key파일들은 cka시험시, 위치 예시를 제공하므로 해당 위치를 참고해서 진행하시면 됩니다.
또한 스냅샷 백업파일 저장위치고 같이 제시를 해주니, 참고하여 진행하시면 됩니다.
예)
cacert=/etc/kubernetes/pki/etcd/ca.crt
cert=/etc/kubernetes/pki/etcd/server.crt
key=/etc/kubernetes/pki/etcd/server.key
저장 위치 : /tmp/etcd-backup
###아래와 같이 진행##
ETCDCTL_API=3 /tmp/etcd-download-test/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 /tmp/etcd-backup
[root@rke2-controll ~]# ETCDCTL_API=3 /tmp/etcd-download-test/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 /tmp/etcd-backup
{"level":"info","ts":"2024-02-26T06:05:44.25883Z","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"/tmp/etcd-backup.part"}
{"level":"info","ts":"2024-02-26T06:05:44.267514Z","logger":"client","caller":"v3@v3.5.12/maintenance.go:212","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2024-02-26T06:05:44.267537Z","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"https://127.0.0.1:2379"}
{"level":"info","ts":"2024-02-26T06:05:44.320486Z","logger":"client","caller":"v3@v3.5.12/maintenance.go:220","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2024-02-26T06:05:44.333411Z","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"https://127.0.0.1:2379","size":"5.6 MB","took":"now"}
{"level":"info","ts":"2024-02-26T06:05:44.333508Z","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"/tmp/etcd-backup"}
Snapshot saved at /tmp/etcd-backup
위처럼 진행하면, /tmp/etcd-backup파일에 스냅샷파일이 생성됩니다.
Restore 는 생성된 스냅샷 파일을 이용하여 진행하면 됩니다.
ETCD Restore
Operating etcd clusters for Kubernetes | Kubernetes
Restore 테스트를 위해, 미리 생성한 nginx deployment를 제거하겠습니다.
[root@rke2-controll tmp]# kubectl delete deployment webserver -n cka-test
deployment.apps "webserver" deleted
[root@rke2-controll tmp]#
[root@rke2-controll tmp]# kubectl get deployments -A
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
calico-apiserver calico-apiserver 2/2 2 2 52m
calico-system calico-kube-controllers 1/1 1 1 53m
calico-system calico-typha 2/2 2 2 53m
kube-system coredns 2/2 2 2 126m
tigera-operator tigera-operator 1/1 1 1 58m
[root@rke2-controll tmp]#
#Restore
ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl --data-dir=/var/lib/etcd-new snapshot restore /tmp/etcd-backup
#data-dir은 다른 공간으로 지정해야합니다. /var/lib/etcd 기존 etcd가 있는곳이 아닌곳으로 지정
[root@rke2-controll tmp]# ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl --data-dir=/var/lib/etcd-new snapshot restore /tmp/etcd-backup
Deprecated: Use `etcdutl snapshot restore` instead.
2024-02-26T06:12:11Z info snapshot/v3_snapshot.go:260 restoring snapshot {"path": "/tmp/etcd-backup", "wal-dir": "/var/lib/etcd-new/member/wal", "data-dir": "/var/lib/etcd-new", "snap-dir": "/var/lib/etcd-new/member/snap"}
2024-02-26T06:12:12Z info membership/store.go:141 Trimming membership information from the backend...
2024-02-26T06:12:12Z info membership/cluster.go:421 added member {"cluster-id": "cdf818194e3a8c32", "local-member-id": "0", "added-peer-id": "8e9e05c52164694d", "added-peer-peer-urls": ["http://localhost:2380"]}
2024-02-26T06:12:12Z info snapshot/v3_snapshot.go:287 restored snapshot {"path": "/tmp/etcd-backup", "wal-dir": "/var/lib/etcd-new/member/wal", "data-dir": "/var/lib/etcd-new", "snap-dir": "/var/lib/etcd-new/member/snap"}
[root@rke2-controll tmp]# tree /var/lib/etcd-new
/var/lib/etcd-new
└── member
├── snap
│ ├── 0000000000000001-0000000000000001.snap
│ └── db
└── wal
└── 0000000000000000-0000000000000000.wal
3 directories, 3 files
[root@rke2-controll tmp]#
이제 conf파일에서 복원된 etcd파일 경로를 지정합니다.
[root@rke2-controll tmp]# vi /etc/kubernetes/manifests/etcd.yaml
#파일을 열어보면 하단에 hostpath 부분의 etcd-data의 path부분이 있습니다.
#해당 path 를 위에서 복원한 etcd경로로 지정합니다.
#파일 수정 후 kubelet을 재구동하지 않아도 자동 적용이 진행됩니다.
volumes:
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
path: /var/lib/etcd-new #######<<<<<<<<<<<<<<수정
type: DirectoryOrCreate
name: etcd-data
수정 후 ps 명령어로 etcd가 잘 구동되어있는지 다시 체크합니다.(etcd.yaml수정 및 저장하면 자동 반영됩니다.)
[root@rke2-controll tmp]# ps -ef| grep etcd
root 12244 12057 2 04:03 ? 00:02:45 kube-apiserver --advertise-address=10.0.0.4 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-account-signing-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
마지막으로 삭제한 nginx deploy가 잘 복원되었는지 확인합니다.
[root@rke2-controll tmp]# kubectl get deployments -n cka-test -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
webserver 2/2 2 2 16m nginx nginx:1.14 app=webserver
[root@rke2-controll tmp]#
복원 상태를 확인할 수 있습니다.
실제 시험에선, 기존 etcd데이터를 저장하고. 따로 저장되어있는 스냅샷 db를 이용하여 복원하는 문제가 나옵니다.
지문을 잘 읽고, 경로가 맞는지 꼼꼼하게 체크하면서 시험을 진행하시면 됩니다.
'Kubernetes > CKA' 카테고리의 다른 글
[CKA] k8s upgrade (0) | 2024.02.29 |
---|---|
[CKA] 자격증 취득을 위한 Step.1 (0) | 2023.12.22 |