클러스터 장애 복구
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