Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

전공공부

[K8S - CKA] Backup And Restore 본문

Study/K8S

[K8S - CKA] Backup And Restore

monitor 2023. 11. 19. 18:37

Backup 후보들


1. Resource Configuration 방식


1) 저장소를 두고 저장하는 방식

 

Declarative 방식으로 구성을 한다면 싱글 폴더에 존재하고 다른 사람과 공유가 가능합니다.

 

이런 방식은 이러한 yaml 파일을 github 같은 곳에 두고 백업 솔루션으로 쓸 수 있습니다.

 

만일, 클러스터를 이런식으로 구성하면 뭔갈 잘 못 만들었을때 다시 돌아갈 수 있겠죠.

 

이를 사실 일일이 복사 할 필요는 없구요 아래 예시 처럼 KubeAPIServer를 이용해서 쿼리를 하는 것이라고 합니다. API에 직접 액세스하고 이를 카피로 두기 때문에 누락된 객체에 대한 걱정을 할 필요가 없겠죠

 

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

 

이런 식으로 저장해서 바로 쓸 수 있습니다.

 

2. ETCD 방식


우선 ETCD는 우리 클러스터의 상태를 공유하고 저장합니다.

 

위와 같은 저장소를 두고 리소스를 직접 저장하는 대신에 ETCD 자체로 백업하는 걸 할 수 있습니다.

 

ETCD는 알다 싶이 Master Node에 hosted 되어 있습니다.

 

그리고, 우리는 ETCD를 구성 할 적에 어디에 데이터가 저장될 지 지정 할 수 있습니다.

 

etcd.service

... (생략) ...
--data-dir=/var/lib/etcd
... (생략) ...

 

위 디렉토리가 백업 될 수 있게하는 디렉토리 입니다.

 

ETCD는 또한, snapshot solution을 가져오는데요 빌트인 되어 있습니다.

 

ETCD Control Utility를 사용해서 정상적인 상태의 클러스터를 스냅샷을 찍을 수 있는데요.

 

명령어는 아래와 같습니다.

 

#우선 ssh로 master node 접속 후

export ETCDCTL_API=3
#이는 자동이 아니고 static pod로 마스터 노드에 배포된 etcd pod에 접속한 것입니다.

etcdctl version
#etcd 접속 확인 용

ETCDCTL_API=3 etcdctl snapshot save snapshot.db

 

이렇게 만들면 현재 위치에 snapshot.db라는 파일로 만들어집니다.

 

자 그래서 이걸로 어떻게 다시 복구 할까요?

 

service kube-apiserver stop #1. first step 클러스터를 리스타트 하기 위함

ETCD_API=3 etcdctl snapshot restore snapshot.db --data-dir /var/lib/etcd-from-backup
#정상적은 스냅샷으로 이전의 클러스터 상태로 불러옵니다.
#이렇게 하는 이유는 새로 만들어지는 맴버가 이전의 etcd cluster에 부착되는 것을 막기 위함
#새로운 etcd 디렉토리가 만들어집니다.

systemctl daemon-reload
#클러스터 리스타트
service etcd restart
#etcd restart

service kube-apiserver start
# kube-apiserver를 다시 깨웁니다.

 

이렇게 복구가 가능하며 실제로 etcd를 저장 할 때는 

 

아래와 같이 인증서를 먼저 저장해두는 것이 좋습니다.

 

실제 저장은 이런식으로 되어짐

3. ETCD 활용


결국은 활용을 할 줄 알아야한다.

 

개념적인 것은 모두 지났고 아래 내용으로 ETCD를 활용해보자

 

k get pods -n kube-system #1. etcd pod를 찾아서 확인해봅시다.

# describe 명령어로 etcd의 version을 확인 할 수 있습니다.

# 2. ETCD가 Control plane에 접속할 때는

--listen-client-urls= #의 코멘드 주소를 따릅니다.

 

Master Node가 유지 보수를 위해서 reboot 될 것입니다. 이때, snapshot을 써서 백업 플랜을 둬 봅시다.

 

백업 플랜 만들기

 

우선 etcd는 static pod로 만들어지는 것을 우리는 알고 있으니 cd /etc/kubernetes/manifests/ 로 진입해서 etcd.yaml을 확인 해봅시다.

 

아래 etcd.yaml 파일

더보기

 

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/etcd.advertise-client-urls: https://192.16.231.3:2379
  creationTimestamp: null
  labels:
    component: etcd
    tier: control-plane
  name: etcd
  namespace: kube-system
spec:
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://192.16.231.3:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    - --data-dir=/var/lib/etcd
    - --experimental-initial-corrupt-check=true
    - --experimental-watch-progress-notify-interval=5s
    - --initial-advertise-peer-urls=https://192.16.231.3:2380
    - --initial-cluster=controlplane=https://192.16.231.3:2380
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --listen-client-urls=https://127.0.0.1:2379,https://192.16.231.3:2379
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://192.16.231.3:2380
    - --name=controlplane
    - --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: registry.k8s.io/etcd:3.5.7-0
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /health?exclude=NOSPACE&serializable=true
        port: 2381
        scheme: HTTP
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    name: etcd
    resources:
      requests:
        cpu: 100m
        memory: 100Mi
    startupProbe:
      failureThreshold: 24
      httpGet:
        host: 127.0.0.1
        path: /health?serializable=false
        port: 2381
        scheme: HTTP
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    name: etcd
    resources:
      requests:
        cpu: 100m
        memory: 100Mi
    startupProbe:
      failureThreshold: 24
      httpGet:
        host: 127.0.0.1
        path: /health?serializable=false
        port: 2381
        scheme: HTTP
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    volumeMounts: #ETCD의 위치
    - mountPath: /var/lib/etcd
      name: etcd-data
    - mountPath: /etc/kubernetes/pki/etcd
      name: etcd-certs
  hostNetwork: true
  priority: 2000001000
  priorityClassName: system-node-critical
  securityContext:
    seccompProfile:
      type: RuntimeDefault
  volumes:#Control plane의 위치
  - hostPath:
      path: /etc/kubernetes/pki/etcd
      type: DirectoryOrCreate
    name: etcd-certs
  - hostPath:
      path: /var/lib/etcd
      type: DirectoryOrCreate
    name: etcd-data
status: {}

 

위 파일을 보면 /var/lib/etcd 에 etcd-data 파일을 두고 있을을 확신 할 수 있다. 그러면 그 위치로 가서 스냅샷을 뜨면 된다.

 

ETCDCTL_API=3 etcdctl snapshot #이렇게 지정을 해야 환경변수를 쓰지 않고 쓸 수 있고 이가 귀찮다면

export ETCDCTL_API=3 #환경변수 두기하고 etcdctl 명령어를 쓰면된다.

etcdctl snapshot save --endpoints=127.0.0.1:2379 \ #listen-client-urls 임
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
/opt/snapshot-pre-boot.db

#이렇게 지정을 해야한다. 보면 스냅샷을 위해서는 위 4개의 옵션들은 필수로 지정해야한다. endpoint와
#인증 포인트를 꼭 지정해야한다.

 

 

복구하기

etcdctl snapshot restore --data-dir <백업을 할 위치> <백업된 snapshot.db 파일 위치>

 

그리고, 처음에 static pod로 만들어진 위치로 가서 etcd.yaml 파일을 열고 /var/lib/etcd로 기존에 되어있던 hostPath 위치를 지금 <백업을 할 위치의 값>으로 변경시킵니다.

 

그러면 결국 복원 된 것을 확인 할 수 있습니다.

 

4. 오답노트


1. kubectl config get-cluster : 현재 클러스터의 갯수를 볼 수 있다.

 

2. Stacked ETCD인지 판단하는 여부는 API-SERVER Pod에 ETCD-Server로 연결되는 로컬 주소가 있으면 Stacked ETCD이다.

 

3. 만일 API-SERVER POD를 확인 했는데 192.33.162.21 처럼 새로운 바깥 IP를 쓴다면 External ETCD이다.

 

4. ETCD의 POD의 --data-dir는 etcd의 데이터가 저장된 곳이다.

 

5. scp cluster1:/opt/cluster1.db /opt/ 이 명령어를 실행하면 cluster1의 /opt/cluster1.db가 현재 노드의 /opt/로 들어온다.

'Study > K8S' 카테고리의 다른 글

[K8S - CKA] TLS - Basic  (1) 2023.12.10
[K8S - CKA] SECURITY PRIMITIVES (Deprecated)  (0) 2023.12.10
[K8S - CKA] Cluster Upgrade Process  (0) 2023.11.13
[K8S - CKA] OS Upgrade  (0) 2023.11.12
[K8S - CKA] initContainers  (0) 2023.11.12