5.1. 장애 처리 가이드
장애 시 체크리스트
장애 발생 시 다음 순서로 점검하는 것을 권장합니다.
- 영향 범위 파악: 전체 클러스터 장애인지, 특정 노드/네임스페이스/애플리케이션 장애인지 확인
- Node 상태 확인: Node 상태 확인 절차 수행
- 클러스터 핵심 컴포넌트 상태 확인: API Server, etcd, CoreDNS 등
- 최근 변경 이력 확인: 최근 배포, 설정 변경, 업그레이드 여부 확인
- 로그/이벤트 확인: 관련 Pod 로그 및 클러스터 이벤트 확인
- MSAP Observability 대시보드 확인: 메트릭 추이로 원인 범위 좁히기
- 필요 시 기술 지 원팀 문의
Node 상태 확인
# 전체 노드 상태 확인
kubectl get nodes -o wide
# 특정 노드 상세(Conditions, 할당 리소스 등)
kubectl describe node <node-name>
# 노드 서비스 상태 확인(각 노드에서 직접 실행)
systemctl status rke2-server # Master
systemctl status rke2-agent # Worker
# Kubelet 상태 확인
systemctl status kubelet
Node NotReady
kubectl describe node <node-name>로 Conditions 항목(MemoryPressure, DiskPressure, PIDPressure, Ready) 확인- 해당 노드에 SSH 접속하여
systemctl status rke2-server(또는rke2-agent) 확인 - 디스크/메모리 부족 여부 확인 (컴포넌트별 장애 대응 참고)
- 필요 시 서비스 재시작
systemctl restart rke2-agent # Worker 노드인 경우
클러스터 컴포넌트 상태 확인
OPENMARU COP는 RKE2 기반이므로 시스템 서비스 및 핵심 Pod 상태로 컴포넌트 정상 여부를 판단합니다.
# API Server 접근 가능 여부
kubectl get --raw='/readyz?verbose'
# API Server 리스닝 포트 확인(Master 노드에서)
ss -tlnp | grep 6443
# etcd 클러스터 상태(Master 노드에서, etcd 정적 Pod 내부의 etcdctl 실행)
# 호스트에는 etcdctl 바이너리가 없으므로 kubectl exec로 etcd Pod 내부에서 실행합니다.
kubectl exec -n kube-system etcd-<master-node> -- etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt \
--cert=/var/lib/rancher/rke2/server/tls/etcd/server-client.crt \
--key=/var/lib/rancher/rke2/server/tls/etcd/server-client.key \
endpoint status --cluster -w table
# CoreDNS 상태 확인
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl run -it --rm debug -n kube-system --image=busybox --restart=Never -- nslookup kubernetes.default
# 전체 네임스페이스에서 비정상 Pod 조회
kubectl get pods -A | grep -v Running
# 최근 클러스터 이벤트 확인
kubectl get events -A --sort-by='.lastTimestamp' | tail -20
Node 로그 확인
# RKE2 서비스 로그(Master)
journalctl -u rke2-server -f
# RKE2 서비스 로그(Worker)
journalctl -u rke2-agent -f
# 특정 Pod 이벤트에 의한 노드 리소스 압박 확인
kubectl get events --field-selector reason=Evicted -A
# 디스크 사용량 확인 및 미사용 이미지 정리
df -h
crictl rmi --prune
journalctl --vacuum-size=1G
Web Console 대시보드 확인
OPENMARU COP Console의 메인 대시보드에서 다음을 우선 확인합니다.
- 노드 상태 도넛 차트: NotReady 노드 존재 여부
- Pod 상태 도넛 차트: Pending/CrashLoopBackOff/Error 상태 Pod 비율
- 최근 이벤트 목록: Warning 수준 이벤트 확인
- CPU/Memory 게이지: 리소스 고갈 여부
콘솔 자체 접속이 안 되는 경우(502/504 오류)는 컴포넌트별 장애 대응 - Ingress 502/503을 함께 확인하십시오.
컴포넌트별 장애 대응
| 증상 | 점검 항목 | 해결 |
|---|---|---|
| Pod 간 통신 불가 | CNI(Canal/Calico) Pod 상태, VXLAN(4789) 포트 | CNI Pod 재시작, 방화벽/보안그룹에서 VXLAN 포트 확인 |
| Service 접근 불가 | Endpoint 존재 여부, kube-proxy 상태 | kubectl get endpoints로 백엔드 Pod 연결 확인 |
| 외부 통신 불가 | DNS, NAT, 방화벽 | 노드 라우팅 테이블 및 방화벽 정책 확인 |
| PVC Pending | StorageClass, NFS Provisioner 상태 | kubectl describe pvc로 이벤트 확인, showmount -e <nfs-server>로 NFS 마운트 가능 여부 확인 |
| NFS 마운트 실패(access denied) | /etc/exports 설정, 방화벽 | NFS 서버의 allow IP 대역 확인 |
| PV가 Terminating에서 멈춤 | Finalizer | kubectl patch pv <name> -p '{"metadata":{"finalizers":null}}' (⚠️ 스토리지 실제 삭제 여부 별도 확인 필요) |
| Ingress 502/503 | 백엔드 Pod 상태, Readiness Probe | 대상 Pod가 Ready 상태인지 확인 |
| TLS 인증서 오류 | Secret 존재/만료일 | kubectl get secret <tls-secret> -n <ns> -o yaml, cert-manager 갱신 상태 확인 |
| ImagePullBackOff | ImagePullSecret, 레지스트리 접근성 | kubectl describe pod의 이벤트에서 정확한 오류 메시지 확인 |
| CrashLoopBackOff | 애플리케이션 로그 | kubectl logs <pod> --previous로 직전 종료 원인 확인 |
| OOMKilled | 메모리 제한 | kubectl describe pod에서 OOMKilled 확인 후 resources.limits.memory 상향 |
| Pod Pending(스케줄링 불가) | Taint/Toleration, NodeSelector, 리소스 부족 | kubectl describe pod의 Events에서 스케줄링 실패 사유 확인 |
| Node MemoryPressure | 노드 메모리 사용량 과다 | 아래 메모리 부족(MemoryPressure) 대응 참고 |
메모리 부족(MemoryPressure) 대응
# 1. 노드 메모리 사용량 확인
free -h
# 2. 메모리 사용량 기준 Pod 정렬 조회(클러스터 전체)
kubectl top pod -A --sort-by=memory
# 3. Pod별 메모리 제한(limits) 설정값 확인
kubectl get pods -A -o custom-columns=\
'NAME:.metadata.name,MEM:.spec.containers[*].resources.limits.memory'
# 4. 불필요하거나 메모리를 과다 점유한 Pod 정리
kubectl delete pod <pod-name> -n <namespace>
노드가 MemoryPressure 상태가 되면 Kubernetes는 우선순위가 낮은 Pod부터 자동으로 Evict(축출)할 수 있습니다. Evict된 Pod 목록은 다음으로 확인합니다.
kubectl get events --field-selector reason=Evicted -A