1. Kubernetes의 장애 대응 개요
Kubernetes는 장애가 발생했을 때 자동으로 복구(Self-healing) 기능을 제공하여 안정성을 보장한다.
주요 장애 대응 및 복구 전략은 다음과 같다.
🔹 Self-healing(자가 치유) → 컨테이너 상태를 감시하고 자동으로 재시작
🔹 Restart Policy(재시작 정책) → Pod이 종료되었을 때 재시작 여부 결정
🔹 Node Failure Handling(노드 장애 처리) → 노드 장애 발생 시 워크로드를 다른 노드로 이동
2. Self-healing(자가 치유)
1) Self-healing 개요
Kubernetes는 컨트롤 플레인에서 Pod의 상태를 지속적으로 모니터링하며,
이상이 감지되면 자동으로 복구를 시도한다.
Self-healing이 동작하는 주요 방식
Self-healing 메커니즘 | 설명 |
---|---|
Liveness Probe | 컨테이너가 정상적으로 동작하는지 확인 |
Readiness Probe | 컨테이너가 트래픽을 받을 준비가 되었는지 확인 |
Startup Probe | 컨테이너가 정상적으로 시작되었는지 확인 |
2) Liveness Probe(컨테이너 상태 감지)
Liveness Probe를 사용하면 컨테이너가 비정상 상태일 경우 자동으로 재시작된다.
🔹 예제: HTTP 기반 Liveness Probe
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
containers:
- name: app
image: myapp:v1
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5 # 처음 5초 후 검사 시작
periodSeconds: 10 # 10초마다 검사
kubectl apply -f liveness-pod.yaml
📌 동작 방식:
/health
엔드포인트가 10초마다 호출됨- 응답이 실패하면 Kubernetes가 자동으로 컨테이너 재시작
3) Readiness Probe(서비스 트래픽 수락 여부 판단)
Readiness Probe를 사용하면 컨테이너가 준비되지 않은 경우 트래픽을 차단한다.
🔹 예제: TCP 기반 Readiness Probe
apiVersion: v1
kind: Pod
metadata:
name: readiness-pod
spec:
containers:
- name: app
image: myapp:v1
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
bash복사편집kubectl apply -f readiness-pod.yaml
📌 동작 방식:
8080
포트가 정상적으로 열려 있어야 서비스가 트래픽을 받을 수 있음- 준비되지 않은 상태에서는 서비스에서 제외됨
4) Startup Probe(애플리케이션 시작 감지)
Startup Probe를 사용하면 컨테이너가 시작될 때까지 기다렸다가, 이후 Liveness Probe를 실행할 수 있다.
🔹 예제: Exec 기반 Startup Probe
apiVersion: v1
kind: Pod
metadata:
name: startup-pod
spec:
containers:
- name: app
image: myapp:v1
startupProbe:
exec:
command: ["cat", "/app/ready"]
failureThreshold: 30 # 30번 실패 시 컨테이너 종료
periodSeconds: 10 # 10초마다 검사
kubectl apply -f startup-pod.yaml
📌 동작 방식:
/app/ready
파일이 존재해야 정상적인 컨테이너로 간주- 최대 30번까지 검사하며, 10초마다 실행
3. Restart Policy(재시작 정책)
1) Restart Policy 개요
Kubernetes는 Pod이 종료될 때 다음 세 가지 정책 중 하나를 적용하여 재시작 여부를 결정한다.
Restart Policy | 설명 |
---|---|
Always | (기본값) Pod이 종료될 때마다 항상 재시작 |
OnFailure | 비정상 종료 시에만 재시작 |
Never | 절대 재시작하지 않음 |
🔹 Restart Policy 예제
apiVersion: v1
kind: Pod
metadata:
name: restart-policy-pod
spec:
restartPolicy: OnFailure
containers:
- name: app
image: myapp:v1
kubectl apply -f restart-policy-pod.yaml
📌 동작 방식:
- 컨테이너가 정상적으로 종료되면 재시작하지 않음
- 오류로 종료되면 자동으로 재시작됨
4. Node Failure Handling(노드 장애 처리)
1) 노드 장애 감지 및 대체
Kubernetes는 노드의 상태를 지속적으로 모니터링하며, 노드 장애 발생 시 Pod을 다른 노드로 이동한다.
🔹 Kubelet의 헬스 체크 → 노드의 상태를 감지
🔹 Node Controller → 일정 시간 동안 응답이 없으면 노드를 NotReady
상태로 변경
🔹 Pod 재스케줄링 → 해당 노드에서 실행되던 Pod을 다른 노드로 이동
🔹 노드 상태 확인 명령어
kubectl get nodes
2) Pod이 다른 노드로 이동하도록 설정
Pod이 특정 노드에서 실행되다가 장애가 발생하면 다른 노드에서 다시 실행되도록 설정해야 한다.
이를 위해 Deployment를 사용하여 Pod을 관리하면 자동으로 다른 노드로 이동할 수 있다.
🔹 Deployment 기반 Pod 재스케줄링
apiVersion: apps/v1
kind: Deployment
metadata:
name: resilient-app
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: myapp:v1
kubectl apply -f resilient-app.yaml
📌 동작 방식:
- 노드 장애 발생 시, Kubernetes가 자동으로 다른 노드에서 Pod을 재배치
5. 장애 대응 및 복구 최적화 전략
✅ Liveness Probe / Readiness Probe / Startup Probe 설정 → Pod이 정상적으로 동작하는지 확인
✅ 적절한 Restart Policy 적용 → 애플리케이션의 특성에 맞게 재시작 정책 결정
✅ Deployment 활용 → 노드 장애 시 Pod이 자동으로 다른 노드에서 실행되도록 설정
✅ Cluster Autoscaler 적용 → 노드 장애 발생 시 새로운 노드를 추가하도록 구성
✅ 노드 상태 모니터링 및 로그 분석 → kubectl get nodes
, kubectl describe node
활용
6. 결론
✅ Kubernetes의 Self-healing 기능을 활용하여 Pod 장애 복구
✅ Restart Policy를 적절히 설정하여 재시작 전략 최적화
✅ Deployment를 사용하여 노드 장애 시 자동으로 다른 노드에서 복구
✅ Liveness / Readiness / Startup Probe를 설정하여 장애 감지 및 대응 자동화