클러스터 장애 복구

Kubernetes 클러스터 전체의 장애 시나리오와 복구 절차 완벽 가이드


Kubernetes 클러스터 전체의 장애 시나리오와 복구 절차 완벽 가이드

목표: 클러스터가 완전히 다울 때도 복구할 수 있는 수준


🚨 장애 시나리오

시나리오 1: Control Plane 장애

# 증상
kubectl get nodes
# The connection to the server was refused

# 또는
kubectl get nodes
# NAME     STATUS     ROLES           AGE
# cp-1     NotReady   control-plane   10d

복구 절차:

# 1. API Server 상태 확인
sudo systemctl status kube-apiserver

# 2. kubelet 확인
sudo systemctl status kubelet

# 3. etcd 확인
sudo systemctl status etcd
sudo ETCDCTL_API=3 etcdctl endpoint health

# 4. 인증서 확인 (만료 여부)
sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout | grep Not

# 5. 복구
# kubelet 재시작
sudo systemctl restart kubelet

# etcd 복구 (백업에서)
sudo ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \
  --data-dir=/var/lib/etcd-backup

# 인증서 갱신
sudo kubeadm certs renew all
sudo systemctl restart kubelet

시나리오 2: etcd 데이터 손상

# 증상
kubectl get pods
# Error from server: etcdserver: mvcc: database space exceeded

# 또는
# etcd Pod CrashLoopBackOff

복구 절차:

# 1. etcd 백업 (가능한 경우)
sudo ETCDCTL_API=3 etcdctl snapshot save backup.db

# 2. etcd 데이터 정리
sudo ETCDCTL_API=3 etcdctl defrag

# 3. 자동 압축 설정
sudo ETCDCTL_API=3 etcdctl put /registry/compact_key ""

# 4. 심각한 경우: 스냅샷 복원
# etcd 중지
sudo systemctl stop etcd

# 데이터 디렉토리 교체
sudo mv /var/lib/etcd /var/lib/etcd.old
sudo mkdir /var/lib/etcd

# 복원
sudo ETCDCTL_API=3 etcdctl snapshot restore backup.db \
  --data-dir=/var/lib/etcd

# 재시작
sudo systemctl start etcd

시나리오 3: Worker Node 장애

# 증상
kubectl get nodes
# NAME       STATUS     ROLES    AGE
# worker-1   NotReady   <none>   5d

복구 절차:

# 1. 노드 상세 정보
kubectl describe node worker-1

# 2. SSH 접속
ssh worker-1

# 3. kubelet 상태
sudo systemctl status kubelet
sudo journalctl -u kubelet -f

# 4. 리소스 확인
free -h
df -h

# 5. 복구
# kubelet 재시작
sudo systemctl restart kubelet

# Docker/containerd 재시작
sudo systemctl restart containerd

# 네트워크 재시작
sudo systemctl restart systemd-networkd

# 6. 클러스터에서 제거 후 재조인 (극단적)
kubectl drain worker-1 --ignore-daemonsets --delete-emptydir-data
kubectl delete node worker-1

# 노드에서
sudo kubeadm reset
sudo kubeadm join ...

시나리오 4: 네트워크 분할

# 증상
# Pod 간 통신 불가
# Service DNS 해석 불가

복구 절차:

# 1. CNI 확인
kubectl get pods -n kube-system

# 2. CoreDNS 확인
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl logs -n kube-system -l k8s-app=kube-dns

# 3. 네트워크 정책 확인
kubectl get networkpolicies --all-namespaces

# 4. CNI 재시작
kubectl delete pods -n kube-system -l k8s-app=kube-proxy
kubectl delete pods -n kube-system -l app=flannel

# 5. iptables 정리 (극단적)
sudo iptables -F
sudo iptables -t nat -F
sudo systemctl restart kubelet

🛡️ 예방 조치

백업 자동화

# etcd 백업 스크립트
#!/bin/bash
# /usr/local/bin/etcd-backup.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/etcd"
RETENTION_DAYS=7

mkdir -p $BACKUP_DIR

# 백업
ETCDCTL_API=3 etcdctl snapshot save $BACKUP_DIR/etcd-$DATE.db \
  --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

# 압축
gzip $BACKUP_DIR/etcd-$DATE.db

# 오래된 백업 삭제
find $BACKUP_DIR -name "*.gz" -mtime +$RETENTION_DAYS -delete
# cron 등록
0 */6 * * * /usr/local/bin/etcd-backup.sh

모니터링

# 핵심 메트릭
kubectl top nodes
kubectl top pods --all-namespaces

# 이벤트 모니터링
kubectl get events --all-namespaces --watch

# 컴포넌트 상태
kubectl get componentstatuses

📋 복구 체크리스트

  • etcd 백업 확인
  • 인증서 만료 확인
  • 노드 상태 확인
  • CNI 상태 확인
  • DNS 확인
  • 리소스 사용량 확인
  • 이벤트 로그 분석

🔗 관련 노트

  • 02-01-kubeadm-클러스터-설치 — 재설치
  • 02-11-Pod-실패-원인-분석 — Pod 장애
  • 02-02-클러스터-업그레이드 — 업그레이드

마지막 업데이트: 2026-06-01