Kubernetes/Kubernetes Advanced

📌 [Pod 심화편 #4] Pod의 장애 복구 및 자동 재시작 전략

ygtoken 2025. 3. 12. 12:10
728x90

 

1️⃣ 개요

 

쿠버네티스를 운영하다 보면 Pod가 예상치 못하게 종료되거나 비정상적으로 동작하는 경우가 발생할 수 있습니다.

특히, 애플리케이션 오류, 네트워크 장애, 노드 장애 등의 원인으로 인해 Pod가 다운되면 서비스 운영에 큰 영향을 미칠 수 있습니다.

 

쿠버네티스는 Pod의 장애를 감지하고 자동으로 복구할 수 있는 여러 기능을 제공하며, 이를 활용하면 서비스의 안정성을 높일 수 있습니다.

이번 글에서는 Pod 장애 유형과 원인, 해결 방법을 표로 정리하고, 자동 복구 전략을 적용하는 방법을 설명하겠습니다.

 


2️⃣ Pod 장애 유형과 해결 방법

 

쿠버네티스 환경에서 Pod 장애는 여러 가지 이유로 발생할 수 있으며, 이를 효과적으로 관리하기 위해 원인과 해결 방법을 함께 정리하였습니다.

 

📌 Pod 장애 유형 및 해결 방법 정리         

장애 유형 원인  해결 방법
애플리케이션 충돌 컨테이너 내부 애플리케이션이 비정상 종료됨 livenessProbe 설정
메모리 부족 (OOM) 리소스 제한 초과로 강제 종료 requests & limits 조정
노드 장애 노드 다운 또는 자원 부족 다른 노드로 재배치 (affinity 설정)
네트워크 문제 Pod 간 통신 불가 또는 외부 접근 문제 NetworkPolicy 및 CoreDNS 확인
장기 실행 Pod의 리소스 누수 메모리 누수 또는 과도한 CPU 사용 Vertical Pod Autoscaler(VPA) 활용

 

 


3️⃣ Pod 자동 재시작 설정 (restartPolicy)

 

Pod가 종료되었을 때 자동으로 재시작되도록 하려면 restartPolicy 설정을 이해해야 합니다.

 

📌 Pod의 restartPolicy 옵션

 

설정 값 설명 적용 대상
Always Pod가 종료될 경우 항상 재시작 Deployment, DaemonSet
OnFailure 실패한 경우만 재시작 Job, CronJob
Never Pod가 종료되면 그대로 유지 특정 테스트 Pod

 

📌 예제: Pod의 restartPolicy 설정

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  restartPolicy: Always
  containers:
    - name: my-container
      image: my-app:v1

Deployment의 경우 기본적으로 restartPolicy: Always가 적용되므로 따로 설정할 필요가 없습니다.

Job은 OnFailure를 사용하여 실패한 경우에만 재시작하도록 설정할 수 있습니다.

 


4️⃣ Pod 장애 감지 및 자동 복구 (livenessProbe, readinessProbe)

 

애플리케이션이 정상적으로 동작하는지 감지하기 위해 쿠버네티스에서는 livenessProbereadinessProbe를 제공합니다.

이를 활용하면 Pod가 비정상적으로 동작할 때 자동으로 재시작할 수 있습니다.

 

📌 Pod 상태 감지 프로브 설정 정리

프로브 종류 설명 주요 목적
livenessProbe 컨테이너가 정상적으로 실행되고 있는지 확인 Pod 자동 재시작
readinessProbe 서비스가 정상적으로 트래픽을 받을 수 있는지 확인 서비스 트래픽 조정

 

📌 예제: HTTP 기반 livenessProbe 설정

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 3
  periodSeconds: 10

 

📌 예제: 실행 명령어 기반 livenessProbe 설정

livenessProbe:
  exec:
    command:
      - cat
      - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 10

livenessProbe가 실패하면 컨테이너가 자동으로 재시작됩니다.

readinessProbe를 함께 설정하면, Pod가 준비되지 않았을 때 트래픽을 받지 않도록 조정할 수 있습니다.

 


5️⃣ Pod 장애 발생 시 자동 대체 (Pod Eviction & Rescheduling)

 

쿠버네티스는 노드 장애가 발생하면 Pod를 자동으로 다른 노드로 이동시킬 수 있습니다.

이를 위해 nodeSelector, affinity, taints & tolerations 등의 설정을 활용해야 합니다.

 

📌 Pod 자동 재배치 설정 정리

설정 옵션 설명 주요 목적
nodeSelector 특정 노드에서만 Pod 실행을 강제 지정 특정 워크로드 배포
affinity 우선적으로 배포될 노드 조건 설정 장애 발생 시 유연한 배포
taints & tolerations 특정 Pod가 특정 노드에서만 실행되도록 제한 고급 리소스 제어

 

📌 예제: 특정 노드에 종속되지 않도록 설정 (affinity)

affinity:
  nodeAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
            - key: kubernetes.io/e2e-az-name
              operator: In
              values:
                - zone-a
                - zone-b

✅ 이 설정을 사용하면 특정 노드에 장애가 발생해도 다른 노드에서 실행될 수 있도록 유연하게 조정할 수 있습니다.

 


6️⃣ Pod의 장애 복구를 위한 추가 전략

 

✅ PodDisruptionBudget(PDB) 설정하여 장애 복구 보호

 

Pod가 운영 중인 상태에서 불필요하게 종료되지 않도록 PodDisruptionBudget(PDB)을 설정할 수 있습니다.

 

📌 PDB 설정 정리

설정 값 설명 주요 목적
minAvailable 최소한 유지해야 할 Pod 개수 지정 서비스 안정성 유지
maxUnavailable 동시에 종료될 수 있는 Pod 개수 설정 롤링 업데이트 보호

📌 예제: 최소 2개 Pod 유지 보장

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-app-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: my-app

✅ 이 설정을 사용하면 최소 2개의 Pod가 항상 유지되도록 보장할 수 있습니다.

✅ 특정 Pod를 삭제해야 하는 경우에도 운영에 문제가 없도록 설정할 수 있습니다.

 


🔥 7️⃣ 결론

 

쿠버네티스는 Pod 장애를 자동으로 감지하고 복구할 수 있도록 다양한 기능을 제공합니다.

애플리케이션이 정상적으로 동작하는지 감지하려면 livenessProbe와 readinessProbe를 설정하는 것이 필수적입니다.

노드 장애 시 자동으로 Pod를 재배치하려면 affinity 및 PodDisruptionBudget을 적절히 설정해야 합니다.

Pod가 종료될 경우 자동으로 재시작하려면 restartPolicy를 적절히 설정해야 합니다.

 

728x90