Kubernetes의 장애 대응 및 복구 전략: Self-healing, Restart Policy, Node Failure Handling


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를 설정하여 장애 감지 및 대응 자동화

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다