Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | High Level #3] 노드 장애 시 자동 복구 및 리소스 재배치 전략

ygtoken 2025. 3. 17. 12:03
728x90

 

쿠버네티스 클러스터에서 노드(Node)는 애플리케이션을 실행하는 핵심 인프라입니다.

노드 장애가 발생하면 워크로드가 중단될 위험이 있으며, 이를 자동으로 감지하고 복구하는 전략이 필요합니다.

이 글에서는 노드 장애 시 자동 복구 및 리소스 재배치 전략을 수립하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1. 노드 장애 감지 및 자동 복구 설정 (Node Problem Detector & Cluster Autoscaler 활용)

2. Pod Disruption Budget(PDB)를 활용한 안정적인 롤링 업데이트 및 장애 복구

3. kubectl 및 로그 분석을 활용한 노드 장애 디버깅 및 리소스 재배치 트러블슈팅

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ 노드 장애 감지 및 자동 복구 설정 (Node Problem Detector & Cluster Autoscaler 활용)

 

❓ 문제 상황

 

운영팀에서 클러스터 내 특정 노드에서 지속적인 장애가 발생하고 있으며, 해당 노드에서 실행되던 Pod들이 응답하지 않는 문제가 보고되었습니다.

이를 해결하기 위해 Node Problem Detector를 활용하여 노드의 상태를 감지하고, Cluster Autoscaler를 설정하여 장애 노드를 자동으로 대체해야 합니다.

장애 원인: 디스크 오류, 메모리 부족, 네트워크 장애 등

해결 목표: 노드 장애 감지 및 새로운 노드로 리소스 자동 재배치

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Node Problem Detector를 배포하여 노드 상태를 지속적으로 모니터링합니다.

 

2. Cluster Autoscaler를 설정하여 장애 노드가 감지되면 새로운 노드를 자동으로 추가합니다.

 


✅ 정답 Manifest (Node Problem Detector 및 Cluster Autoscaler 설정)

 

🔹 Node Problem Detector 배포

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-problem-detector
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: node-problem-detector
  template:
    metadata:
      labels:
        app: node-problem-detector
    spec:
      containers:
      - name: node-problem-detector
        image: k8s.gcr.io/node-problem-detector:v0.8.1
        securityContext:
          privileged: true

 

🔹 Cluster Autoscaler 설정

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cluster-autoscaler
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: cluster-autoscaler
  template:
    metadata:
      labels:
        app: cluster-autoscaler
    spec:
      containers:
      - name: cluster-autoscaler
        image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.23.0
        command:
        - ./cluster-autoscaler
        - --v=4
        - --cloud-provider=aws
        - --nodes=1:10:node-group-1

이제 노드 장애가 발생하면 자동으로 새로운 노드가 추가되고, 리소스가 재배치됨

 


📌 적용 후 예상 결과 값

 

1. 노드 상태 확인

kubectl get nodes

 

💡 예상 출력 값 (노드 장애 발생 전)

NAME          STATUS   ROLES    AGE   VERSION
node-1        Ready    worker   50d   v1.25.3
node-2        Ready    worker   50d   v1.25.3

 

💡 예상 출력 값 (노드 장애 감지 후)

NAME          STATUS    ROLES    AGE   VERSION
node-1        NotReady  worker   50d   v1.25.3
node-3        Ready     worker   1m    v1.25.3

장애가 발생한 노드가 NotReady 상태가 되고, 새로운 노드가 추가됨

 


2️⃣ Pod Disruption Budget(PDB)를 활용한 안정적인 롤링 업데이트 및 장애 복구

 

❓ 문제 상황

 

운영팀에서 노드 장애가 발생할 경우, 해당 노드에서 실행 중이던 애플리케이션이 일시적으로 중단될 위험이 있습니다.

이를 방지하기 위해 Pod Disruption Budget(PDB)를 설정하여 동시에 영향을 받는 Pod 수를 제한해야 합니다.

장애 원인: 노드 장애 발생 시 애플리케이션 다운타임 발생

해결 목표: 동시에 영향을 받는 Pod 수를 제한하여 서비스 연속성 보장

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Pod Disruption Budget(PDB)를 설정하여 특정 수 이상의 Pod이 동시에 중단되지 않도록 설정합니다.

 

2. Pod의 최소 가용성을 보장하여 다운타임을 최소화합니다.

 


✅ 정답 Manifest (Pod Disruption Budget 설정)

 

🔹 PDB 설정 (최소 1개의 Pod 유지)

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: web-app-pdb
  namespace: default
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: web-app

이제 노드 장애가 발생해도 최소 1개의 Pod은 항상 유지됨

 


📌 적용 후 예상 결과 값

 

1. PDB 적용 상태 확인

kubectl get pdb -n default

 

💡 예상 출력 값

NAME            MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
web-app-pdb     1               N/A               1                     5m

서비스의 최소 가용성을 유지하면서 안정적으로 롤링 업데이트 가능

 


3️⃣ kubectl 및 로그 분석을 활용한 노드 장애 디버깅 및 리소스 재배치 트러블슈팅

 

❓ 문제 상황

 

운영팀에서 노드 장애가 발생한 후, 해당 노드에서 실행 중이던 Pod들이 새로운 노드로 정상적으로 이동했는지 확인해야 합니다.

kubectl 및 시스템 로그를 활용하여 노드 장애 원인을 분석하고, 리소스 재배치 상태를 점검해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. kubectl describe node 명령어를 사용하여 노드의 상태를 점검합니다.

 

2. kubectl get pods -o wide를 사용하여 Pod의 위치 변경 여부를 확인합니다.

 


✅ 노드 장애 분석 및 리소스 재배치 확인 명령어

 

🔹 노드 상태 점검

kubectl describe node node-1

 

💡 예상 출력 값 (비정상적인 경우)

Conditions:
  Type             Status  LastHeartbeatTime
  ----             ------  -----------------
  MemoryPressure   True    1m
  DiskPressure     True    1m

메모리 또는 디스크 사용량 문제로 인해 노드가 비정상적인 상태일 가능성이 있음

 


🔹 Pod의 새로운 노드 배치 확인

kubectl get pods -o wide

 

💡 예상 출력 값

NAME          READY   STATUS    NODE
web-app-xyz   1/1     Running   node-3

노드 장애 발생 후, 새로운 노드로 Pod이 재배치되었음을 확인 가능

728x90