Kubernetes

Kubernetes - ETCD backup and restore

사실 나도 모름 2024. 3. 4. 04:18
  1. 목적
  2. 백업(Backup)
  3. 복원(Restore)

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

 

Operating etcd clusters for Kubernetes

etcd is a consistent and highly-available key value store used as Kubernetes' backing store for all cluster data. If your Kubernetes cluster uses etcd as its backing store, make sure you have a back up plan for the data. You can find in-depth information a

kubernetes.io

 

 

1. 목적

etcd는 분산 데이터 시스템에서 중요한 데이터를 저장하고 동기화하기 위한 목적으로 사용된다.

kubernetes에서는 클러스터의 상태와 구성 정보를 저장하는데 사용된다.

이러한 정보들을 백업하는 것은 중요하다.

클러스터의 데이터 중 일부만 소실되어도 시스템의 일관성과 안정성이 떨어지며 정상적인 동작을 할 수 없다.

예기치 못한 장애를 대비하여 백업과 복구하는 방법을 알고 있어야 한다.

 

 

 

 


2. 백업(Backup)

백업과 복구하는 과정은 간단하다.

먼저 백업을 하기 위해 어떤 정보가 필요한 지 확인할 것이다.

# /etc/kubernetes/manifests/kube-apiserver.yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 192.168.108.130:6443
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=192.168.108.130
    - --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										# use
    - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt						# use
    - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key						# use
    - --etcd-servers=https://127.0.0.1:2379												# use
    - --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
    image: registry.k8s.io/kube-apiserver:v1.29.1
    imagePullPolicy: IfNotPresent
    
    ...

 

 

기본적으로 etcdctl이라는 명령을 통해 etcd 백업과 복구를 할 수 있다.

백업에 대한 명령은 다음과 같다.

ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-backup.db \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--cert /etc/kubernetes/pki/etcd/server.crt \
--key /etc/kubernetes/pki/etcd/server.key

 

 

etcdctl 명령으로 아무런 옵션 정보없이 백업을 시도하려고 하면 에러를 발생시킨다.

etcd에 대한 접근을 위해 접근에 필요한 ca 정보key 정보, cert 정보가 필요하다.

또한 ETCDCTL_API=3이라는 문구를 명시해야 정상적인 백업이 이루어진다.

 

 

 

 

 


3. 복원(Restore)

복원도 백업과 크게 다른 것은 없다.

그러나 복원을 위해서는 컨트롤 플레인의 모든 구성요소를 잠시 중지시킬 필요가 있다.

이는 데이터의 일관성과 안정성을 위해서 진행한다.

 

복원을 진행하기 전에 백업 내용과 차이를 두기 위해 파드를 하나 실행한다.

kubectl run test-pod --image nginx:1.25

 

 

컨트롤 플레인의 구성요소 etcd와 kube-apiserver, kube-scheduler, kube-control-manager는 static-pod로 실행중이다.

static-pod는 기본적으로 /etc/kubernetes/manifests/ 디렉토리 아래에 yaml파일을 두면 알아서 실행시키는데 여기에 있는 yaml파일들을 임시로 다른 장소로 이동시킨다.

watch 명령과 crictl ps로 컨테이너 런타임 인터페이스에 프로세스들이 종료되는 것을 확인 후 etcd 복원을 진행한다.

cd /etc/kubernetes/manifests/
mv * ..
watch crictl ps

 

 

모두 종료되고 아무런 시스템에 아무런 파드가 실행되지 않음을 확인했으면 다음을 실행한다.

ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup.db \
--data-dir /var/lib/etcd-backup \
--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-backup/이라는 디렉토리 위치에 backup파일을 복원하라는 의미다.

순정 상태의 etcd의 경우 /var/lib/etcd/ 라는 디렉토리에 쿠버네티스 모든 상태정보들이 저장된다.

위와 같이 복원을 진행하면 /var/lib/etcd-backup이라는 디렉토리가 새로 생성되면서 복원을 진행하게 된다.

 

여기서 끝내면 복원이 전혀 진행되지 않는다.

기본 쿠버네티스 설정은 etcd 정보의 위치가 /var/lib/etcd로 지정되어 있기에 컨트롤 플레인 구성요소를 다시 실행시킨다고 한들 아무런 변화가 없다.

그러므로 완전한 백업 절차를 거치기 위해서는 쿠버네티스 설정의 etcd의 위치정보도 함께 변경해야 한다.

 

# 원래 /etc/kubernetes/manifests/ 아래 있던 파일이지만 일시 중지를 위해 위치를 변경했음
vi /etc/kuberentes/etcd.yaml

hostPath의 path정보를 다음과 같이 변경한다.

 

 

여기까지 정보를 변경한 후 다시 원래 위치로 구성요소 파일들을 옮겨 놓으면 끝이다.

mv ../*.yaml ./manifests/
# 혹은
mv /etc/kubernetes/*.yaml /etc/kubernetes/manifests/

 

 

다음과 같이 모든 구성요소를 원위치시킨 후 결과를 관찰한다.

복원을 진행하기 앞서 파드를 실행시켰는데 확인하면 생성한 파드는 없어진 것을 확인할 수 있을 것이다.

백업 전 상태와 동일하다.

 

'Kubernetes' 카테고리의 다른 글

JSONPath  (0) 2024.12.16
Kubernetes - Network Policy  (0) 2024.03.04
Kubernetes - Metrics Server, PodAutoScaling  (0) 2024.02.03
Kubernetes 기초 - Helm(3)  (0) 2024.01.30
Kubernetes 기초 - Helm(2)  (0) 2024.01.27