본문 바로가기

kubernetes

[kubernetes] etcd 및 백업 복구 방법

해당 페이지는 아래 URL을 참고하여 작성 함

https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/#backing-up-an-etcd-cluster

 

 

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 those data. You can find in-depth information

kubernetes.io

etcd란?

- 모든 클러스터 데이터에 대한 kuebernetes의 백업 저장소로 사용되는 일간되고 고가용성 키 값이 저장되는 저장소

 

etcd 특징

- etc는 홀수 멤버의 클러스터로 실행 함

- etcd는 리더 기반 분산 시스템

- 리소스 요구사항이 보장된 서버에 격리되 환경에서 etcd 클러스터 실행 권고

문서 메뉴얼에 나와있는 홀수 멤버, 리더 기반 분산시스템 이라 함은
Kubenetes 가 quorum 방식의 HA을 지원하기 때문이다.
해당 내용은 현재 범위에 넘어가기에 링크로 대체 한다
https://en.wikipedia.org/wiki/Quorum_(distributed_computing) 

- 모든 kubenetes의 모든 객체는 etcd에 저장 됨

 

 

etcd 클러스터 백업

- etcd 클러스터 데이터를 주기적으로 백업하는 노드 손실와 같은 장애 대응 복구에 매우 중요

- 스냅샷 파일에는 모든 Kubenetes 상태와 중요 정보가 저장 됨

- Kubenetes 데이터를 안정적으로 유지하기 위해서 스냅샷 저장 필요

 

1. etcd snapshot

- etcd는 내장 스냅샷을 지원 함

- etcdctl snapshot save 명령어를 통한 스냅샷 방법 or 

  member/snap/db 파일을 통한 스냅샷 생성

- 스냅샷을 찍더라도 성능에 영향은 없음

 

※ snapshot save 명령어

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>

 

※ endpoint, cacert, cert, key 정보 확인

[root@m-k8s manifests]# cat  /etc/kubernetes/manifests/etcd.yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/etcd.advertise-client-urls: https://192.168.1.10:2379
  creationTimestamp: null
  labels:
    component: etcd
    tier: control-plane
  name: etcd
  namespace: kube-system
spec:
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://192.168.1.10:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    - --data-dir=/var/lib/etcd
    - --initial-advertise-peer-urls=https://192.168.1.10:2380
    - --initial-cluster=m-k8s=https://192.168.1.10:2380
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --listen-client-urls=https://127.0.0.1:2379,https://192.168.1.10:2379
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://192.168.1.10:2380
    - --name=m-k8s
    - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
    - --peer-client-cert-auth=true
    - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
    - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    - --snapshot-count=10000
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    image: k8s.gcr.io/etcd:3.4.3-0
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /health
        port: 2381
        scheme: HTTP
      initialDelaySeconds: 15
      timeoutSeconds: 15
    name: etcd
    resources: {}
    volumeMounts:
    - mountPath: /var/lib/etcd
      name: etcd-data
    - mountPath: /etc/kubernetes/pki/etcd
      name: etcd-certs
  hostNetwork: true
  priorityClassName: system-cluster-critical
  volumes:
  - hostPath:
      path: /etc/kubernetes/pki/etcd
      type: DirectoryOrCreate
    name: etcd-certs
  - hostPath:
      path: /var/lib/etcd
      type: DirectoryOrCreate
    name: etcd-data
status: {}

 

 --advertise-client-urls, --cert-file, --key-file, --trusted-ca-file 값을 조합하여 명령어 사용

[root@m-k8s manifests]# ETCDCTL_API=3 etcdctl --endpoints https://192.168.1.10:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /root/test
Snapshot saved at /root/test

# ls -al /root 
total 15824
....
-rw-r--r--.  1 root root 4038688 Oct 21 18:38 test

/root/test 파일이 생성 됨을 확인

 

etcd 클러스터 백업

- etcd는 major.minor 버전의 etcd 프로세스에서 가져온 스냅샷에서 복원을 지원함

- etcd의 다른 패치버전을 복원하는 것도 지원

- 실패한 클러스터의 데이터를 복구

- 복원 작업 전 스냅샷 파일 필요

 

※ 메뉴얼 상 문법

export ETCDCTL_API=3
etcdctl snapshot restore --data-dir <data-dir-location> snapshotdb

※ 명령어 수행

--data-dir은 복구될 될 디렉토리를, snapshotdb에는 백업된 파일 정보 입력

# ETCDCTL_API=3 etcdctl  snapshot restore --data-dir /root/restore /root/test
2022-10-21 18:52:10.859808 I | mvcc: restore compact to 75799
2022-10-21 18:52:10.864177 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32

# tree /root/restore/
/root/restore/
`-- member
    |-- snap
    |   |-- 0000000000000001-0000000000000001.snap
    |   `-- db
    `-- wal
        `-- 0000000000000000-0000000000000000.wal

 

파일 복구 후 /etc/kubernetes/manifests/etcd.yaml 내 --data-dir, etcd-data의 mountPath 변경 필요

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/etcd.advertise-client-urls: https://192.168.1.10:2379
  creationTimestamp: null
  labels:
    component: etcd
    tier: control-plane
  name: etcd
  namespace: kube-system
spec:
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://192.168.1.10:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    - --data-dir=/root/restore
....
    volumeMounts:
    - mountPath: /root/restore
      name: etcd-data
    - mountPath: /etc/kubernetes/pki/etcd
      name: etcd-certs
  hostNetwork: true
  priorityClassName: system-cluster-critical
  volumes:
  - hostPath:
      path: /etc/kubernetes/pki/etcd
      type: DirectoryOrCreate
    name: etcd-certs
  - hostPath:
      path: /var/lib/etcd
      type: DirectoryOrCreate
    name: etcd-data
status: {}

정상적으로 수행된 경우 pod가 정상적으로 나온다

# kubectl get pods -A
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-99c9b6f64-wgjpw   1/1     Running   0          8h
kube-system   calico-node-grvm8                         1/1     Running   0          8h
kube-system   calico-node-h6vvv                         1/1     Running   0          8h
kube-system   calico-node-k49xh                         1/1     Running   0          8h
kube-system   calico-node-n2wjq                         1/1     Running   0          8h
kube-system   coredns-66bff467f8-nmnvc                  1/1     Running   0          8h
kube-system   coredns-66bff467f8-r89xr                  1/1     Running   0          8h
kube-system   etcd-m-k8s                                1/1     Running   0          8h
kube-system   kube-apiserver-m-k8s                      1/1     Running   0          8h
kube-system   kube-controller-manager-m-k8s             1/1     Running   0          8h
kube-system   kube-proxy-8gcv6                          1/1     Running   0          8h
kube-system   kube-proxy-bpdn2                          1/1     Running   0          8h
kube-system   kube-proxy-f2jsf                          1/1     Running   0          8h
kube-system   kube-proxy-vvm6n                          1/1     Running   0          8h
kube-system   kube-scheduler-m-k8s                      1/1     Running   0          8h

 

제대로 반영되지 않은 경우 아래와 같이 아무런 정보가 나오지 않으며, yaml 파일 재확인이 필요

# kubectl get pods -A
No resources found

'kubernetes' 카테고리의 다른 글

[kubernetes] static pod란  (0) 2022.10.31
[kubernetes] pod란?  (0) 2022.10.26
[kubernetes] namespace 란?  (0) 2022.10.21
[kubernetes] kubernertes Component  (0) 2022.10.21