[Kubernetes] Cluster Maintenance (OS/Cluster Upgrades, Backup, Restore, ETCDCTL, ETCDUTL)

Xabi·2025년 9월 6일

kubernetes

목록 보기
14/20

OS Upgrades

kubect drain node01 --ignore-daemonsets

Node01의 pod를 다른 node로 배출한다. Pod가 evicted된다.
그리고 drain할 경우, get nodes 시 해당 노드에 Unscheduled가 status인 것을 볼 수 있다. (SchedulingDisabled)

단, ReplicaSet, Job, DaemonSet과 같은 것으로 관리되는 pod인 경우에만 다른 node로 보낼 수 있고, 그렇지 않은 경우 강제로 drain하려고 하면 기존 Node는 완전히 제거된다! 이 pod를 옮기거나 스케쥴을 재조정할 주체가 없기 때문이다.

kubectl uncordon node01

Node를 다시 스케쥴링 가능 상태로 복귀한다.
복귀한다고 해도 기존에 evicted된 pod는 같이 복귀되지 않는다.
신규 pod가 created된 경우에만 해당 node에 생성된다.

kubectl cordon node01

해당 node에 신규 pod가 생성되지 않게 하면서 기존에 배포된 pod도 영향을 받지 않게 한다.
이 경우에도 해당 노드의 Status가 Unscheduled를 의미하는 SchedulingDisabled로 변경된 것을 볼 수 있다.

Kubernetes Releases

V1.33.0

  • Major . minor . patch version

cat /etc/release

Cluster Upgrade Precess

구성 요소는 다른 릴리즈 버전으로 갈 수 있다.

업그레이드 프로세스는 클러스터 설정에 달려있다. 직접 설치한 경우 직접 업그레이드를 진행해야 한다.

Kubeadm 클러스터 업그레이드 시 먼저 마스터 노드를 업그레이드 한다. 그 이후 워커 노드를 업그레이드 한다.
마스터 노드가 잠시 다운되고 백업 후 업그레이드가 완료되면 다시 정상적으로 작동한다. 이 동안 워커 노드에는 영향이 없으나 마스터 노드로써 작동하지 않으므로 관련 기능도 작동하지 않는다. 그 이후 워커 노드들이 다운, 백업, 업그레이드 후 다시 정상 작동한다.

워커 노드 업그레이드 전략

  • 1) 한번에 다같이 다운 / 업그레이드 : 서비스 다운
  • 2) 노드 하나씩 다운 / 업그레이드 : 이 때 pod가 다른 노드로 이동되어 서비스 가능 : 서비스 가능
  • 3) 업그레이드 버전을 가진 새로운 노드에 기존 pod 이동시켜놓고 old 노드는 지운다 : 서비스 가능

현재 실행 중인 어플리케이션을 종료하지 않고 클러스터를 업그레이드하는 방법

클러스터를 업그레이드하기 전에 kubeadm을 먼저 업그레이드해라.

시험에서 나오면 공식 문서를 꼭 보고 버전 별로 그대로 하자..

1) 마스터 노드 drain

kubectl drain controlplane

2) 현재 버전 및 업그레이드 가능 버전 확인

apt update
apt-cache madison kubeadm

kubectl get nodes (클러스터 버전 확인)
kubeadm upgrade plan (kubeadm의 안정 업그레이드 버전 확인)

3) 마스터 노드 components 업그레이드
3-1) 마스터 노드 kubeadm 업그레이드

apt-get upgrade -y kubeadm=1.12.0-00
kubeadm upgrade apply v1.12.00

3-2) 마스터 노드 kubelet 업그레이드

apt-get upgrade -y kubelet=1.12.0-00
systemctl daemon-reload
systemctl restart kubelet
이 명령 이후에 master node의 버전이 1.12.0 으로 업그레이드 된다.

4) 마스터 노드 uncordon 으로 node 다시 스케쥴링

kubectl uncordon controlplane

5) 워커 노드 접속

kubectl get nodes -o wide
ssh '워커 노드 internal-ip'

6) 워커 노드 drain

kubectl drain node-1

7) 워커 노드 별 kubeadm / kubelet 업그레이드

apt-get upgrade -y kubeadm=1.12.0
apt-get upgrade -y kubelet=1.12.0-00
kubeadm upgrade node config --kubelet-version v1.12.00
systemctl daemon-reload
systemctl restart kubelet

8) 워커 노드 별 uncordon 으로 node 다시 스케쥴링

kubectl uncordon node-1

9) 그 다음 워커 노드에서도 동일하게 진행한다.

Backup and Restore Methods

kubectl describe pod etcd-controlplane -n kube-system | grep cert

etcdctl version

etcdctl snapshot save snapshot.db

etcdctl snapshot status

etcdctl snapshot restore snapshot.db --data-dir /newdirectory

systemctl daemon-reload
service etcd restore
service kube-apiserver start

📌 ETCDCTL & ETCDUTL 정리 (CKA 대비)

쿠버네티스에서 etcd클러스터의 모든 상태 데이터를 저장하는 핵심 Key-Value 저장소입니다.
CKA 시험에서는 etcd 백업 및 복구가 자주 출제되므로, 명령어와 절차를 확실히 익혀야 합니다.


1. etcdctl 확인

etcdctl version
  • ETCDCTL_API=3 반드시 지정해야 함 (K8s 기본 etcd 버전: v3)

2. etcdctl Snapshot 백업 (라이브 클러스터 백업)

ETCDCTL_API=3 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 /backup/etcd-snapshot.db

✅ 주요 옵션

  • --endpoints → etcd 서버 주소 (보통 127.0.0.1:2379)
  • --cacert → CA 인증서
  • --cert → 클라이언트 인증서
  • --key → 클라이언트 키

3. etcdutl Backup (파일 기반, 오프라인)

etcdutl backup   --data-dir /var/lib/etcd   --backup-dir /backup/etcd-backup
  • etcd 서비스 중지 상태에서만 사용 가능
  • DB + WAL 파일을 통째로 백업

4. Snapshot 상태 확인

ETCDCTL_API=3 etcdctl snapshot status /backup/etcd-snapshot.db --write-out=table
  • 크기(size), revision, hash, 총 key 수 확인 가능
  • 복구 전 무결성 체크

5. Snapshot 복구

(1) etcdutl snapshot restore

etcdutl snapshot restore /backup/etcd-snapshot.db   --data-dir /var/lib/etcd-restored
  • 새로운 데이터 디렉토리로 복원
  • 이후 /etc/kubernetes/manifests/etcd.yaml 수정 필요
    • --data-dir=/var/lib/etcd--data-dir=/var/lib/etcd-restored
  • manifest 수정 시 etcd Pod 자동 재시작됨

(2) etcdutl backup → 복구

  • etcdutl backup으로 만든 디렉토리는 /var/lib/etcd로 복사 후 etcd 재시작

6. endpoints 확인 방법

--endpoints 값은 etcd 서버의 IP와 포트(2379)를 의미합니다.

확인 방법:
1. etcd static pod manifest 확인

cat /etc/kubernetes/manifests/etcd.yaml | grep listen-client-urls

출력 예시:

--listen-client-urls=https://127.0.0.1:2379

→ 이 값을 --endpoints에 넣으면 됨.

  1. kubectl get pod 후 describe
    kubectl -n kube-system describe pod etcd-controlplane | grep 2379

🔑 시험 대비 핵심 포인트

  • etcdctl snapshot save → 라이브 클러스터 스냅샷 생성 (.db)
  • etcdctl snapshot status → 스냅샷 무결성 확인
  • etcdutl snapshot restore.db 복구 (새 data-dir 필요)
  • etcdutl backup → etcd 중지 후 raw 파일 복사
  • endpoints 값은 etcd manifest에서 확인 가능

📝 CKA 대비 연습문제

문제 1: etcd Snapshot 생성

클러스터의 etcd 데이터를 /opt/snapshot-pre-restore.db 경로에 백업하세요.

  • 인증서는 /etc/kubernetes/pki/etcd/ 경로 사용
  • API 버전은 v3

✅ 정답 예시:

ETCDCTL_API=3 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 /opt/snapshot-pre-restore.db

문제 2: Snapshot 상태 확인

위에서 생성한 /opt/snapshot-pre-restore.db 스냅샷의 상태를 테이블 형식으로 출력하세요.

✅ 정답 예시:

ETCDCTL_API=3 etcdctl snapshot status /opt/snapshot-pre-restore.db --write-out=table

문제 3: Snapshot 복원

1번 문제에서 생성한 스냅샷(/opt/snapshot-pre-restore.db)을 /var/lib/etcd-restored로 복원하세요.

✅ 정답 예시:

etcdutl snapshot restore /opt/snapshot-pre-restore.db   --data-dir /var/lib/etcd-restored

추가작업

  • /etc/kubernetes/manifests/etcd.yaml 수정 → --data-dir 값 변경
  • etcd Pod 자동 재시작 확인

문제 4: File-based Backup

etcd 서비스를 중지한 상태에서 /var/lib/etcd 데이터를 /backup/etcd-raw 디렉토리에 백업하세요.

✅ 정답 예시:

etcdutl backup --data-dir /var/lib/etcd --backup-dir /backup/etcd-raw

문제 5: 복구 검증

복구 후 kubectl get pods -A 명령어가 정상적으로 출력되는지 확인하세요.

✅ 정답 예시:

kubectl get pods -A

🔥 시험 팁

  • snapshot 문제는 /opt/ 경로로 지정되는 경우가 많음 → 경로 정확히 입력해야 함.
  • 인증서 경로(/etc/kubernetes/pki/etcd/)와 파일명 반드시 외워둘 것.
  • restore 후 반드시 etcd manifest 수정까지 해야 점수 획득.

ETCD Snapshot Restore (복구 과정)

쿠버네티스에서 etcd는 클러스터의 모든 상태 데이터를 저장하는 핵심 컴포넌트입니다.
etcdctl 명령어로 스냅샷(백업)을 만들 수 있고, etcdutl 명령어로 스냅샷 복구를 할 수 있습니다.

이번 글에서는 etcdutl snapshot restore를 활용한 복구 과정을 정리합니다.


1. 스냅샷 복구 실행

이전에 생성한 스냅샷(/opt/snapshot-pre-boot.db)을 새로운 디렉토리에 복구합니다.

etcdutl snapshot restore /opt/snapshot-pre-boot.db   --data-dir /var/lib/etcd-from-backup
  • /opt/snapshot-pre-boot.db : 백업된 스냅샷 파일 경로
  • --data-dir : 복구할 etcd 데이터 디렉토리 (기존 /var/lib/etcd 대신 새 경로 지정)

⚠️ 마지막 줄은 \ 없이 Enter 입력해야 명령어가 실행됩니다.
복구 시 기존 /var/lib/etcd가 아닌 별도의 경로를 사용하는 것이 안전합니다.


2. etcd.yaml 수정

복구한 데이터를 사용하려면 etcd 매니페스트 파일을 수정해야 합니다.

# /etc/kubernetes/manifests/etcd.yaml
...
volumes:
- hostPath:
    path: /var/lib/etcd-from-backup   # 복구된 디렉토리로 수정
    type: DirectoryOrCreate
  name: etcd-data
  • 원래 /var/lib/etcd/var/lib/etcd-from-backup 으로 변경합니다.
  • /etc/kubernetes/manifests 디렉토리 내의 매니페스트는 static pod이므로, 파일을 저장하면 etcd pod가 자동 재생성됩니다.

3. 상태 확인

(1) 컨테이너 재시작 모니터링

watch crictl ps
  • etcd pod와 kube-apiserver pod가 재시작되는 것을 확인합니다.

(2) 복구된 리소스 확인

kubectl get deployments,services
  • 기존에 사라졌던 deployments, services 등이 복구되었는지 확인합니다.

4. 정리

ETCD 스냅샷 복구 절차는 다음과 같습니다.

  1. etcdutl snapshot restore로 새 디렉토리에 데이터 복구
  2. /etc/kubernetes/manifests/etcd.yaml에서 hostPath를 복구 경로로 수정
  3. etcd 및 관련 컨트롤 플레인 컴포넌트 자동 재시작 확인
  4. kubectl로 리소스 복구 검증

✅ 참고:

  • etcdctl → 백업(snapshop save)
  • etcdutl → 복구(snapshot restore)
profile
롱런하는 개발자!

0개의 댓글