내 잡다한 노트

쿠버네티스 노드 관리 본문

DevOps/쿠버네티스

쿠버네티스 노드 관리

peanutwalnut 2024. 11. 17. 22:03

1. 노드가 다운되었을 때 발생하는 문제

  • 클러스터에서 **노드(Node)**가 다운되면, 해당 노드에서 실행 중이던 Pod에 접근할 수 없게 됩니다.
  • Pod가 여러 복제본(Replicas)으로 구성된 경우:
    • 예: 블루 Pod는 여러 복제본이 있어 다른 노드에서 서비스가 계속 제공되므로 사용자에게 영향이 없음.
  • Pod가 단일 인스턴스로 실행 중인 경우:
    • 예: 그린 Pod는 다른 복제본이 없으므로 사용자에게 서비스가 중단됨.

2. Kubernetes의 동작 원리

  1. 노드가 빠르게 복구된 경우:
    • 노드가 빠르게 복구되면, kubelet이 다시 시작되어 Pod가 정상적으로 실행됩니다.
  2. 노드가 5분 이상 다운된 경우:
    • Kubernetes는 기본적으로 5분간 노드 상태를 감시하다가 노드가 복구되지 않으면 Pod을 종료(terminate) 처리합니다.
    • 해당 Pod가 ReplicaSet의 일부인 경우:
      • 새로운 노드에서 자동으로 Pod가 다시 생성됩니다.
    • ReplicaSet에 포함되지 않은 경우:
      • Pod는 재생성되지 않고 완전히 사라집니다.
  3. Pod Eviction Timeout:
    • Pod Eviction Timeout: 노드가 비활성 상태로 간주되기 전까지 기다리는 시간(기본값: 5분).
    • 이 시간은 Kubernetes Controller Manager에서 설정할 수 있음.

 

3. 유지보수를 위한 안전한 노드 관리

노드 유지보수를 진행할 때, 예상치 못한 문제가 발생하지 않도록 다음과 같은 절차를 따를 수 있습니다.

(1) Drain 명령어

  • 노드에서 실행 중인 **모든 워크로드(Pod)**를 안전하게 다른 노드로 이동.
  • Pod 이동 과정:
    • Pod는 현재 노드에서 종료(terminate) 처리.
    • ReplicaSet이나 Deployment의 설정에 따라 다른 노드에서 새롭게 생성.
  • 결과:
    • 노드는 "스케줄링 불가(unschedulable)" 상태가 되며, 새로운 Pod는 이 노드에 할당되지 않음.

    kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

  • --ignore-daemonsets: DaemonSet에 속한 Pod는 이동되지 않도록 설정.
  • --delete-emptydir-data: emptyDir 볼륨을 사용하는 Pod도 제거.

(2) Cordon 명령어

  • 노드를 스케줄링 불가(unschedulable) 상태로 표시.
  • 기존 Pod는 그대로 유지되며, 새로운 Pod만 스케줄링되지 않음.

kubectl cordon <node-name>

 

(3) Uncordon 명령어

  • 노드를 다시 스케줄링 가능한 상태로 복구.

kubectl uncordon <node-name>

 

4. Drain과 Cordon의 차이점

명령어설명Pod 동작

Drain 노드를 스케줄링 불가 상태로 표시하고, Pod를 이동. 기존 Pod는 종료되고, 다른 노드로 재배치.
Cordon 노드를 스케줄링 불가 상태로 표시. 기존 Pod는 그대로 유지.
Uncordon 노드를 다시 스케줄링 가능한 상태로 복구. 새로운 Pod가 이 노드에 스케줄링 가능.

 

 

유의 사항

  1. Pod는 원래 노드로 돌아오지 않음:
    • Drain을 수행한 후, Pod는 다른 노드에서 새로 생성되며, 원래 노드로 자동 복귀하지 않음.
  2. ReplicaSet의 중요성:
    • 단일 Pod 대신 ReplicaSet을 사용하면 Pod가 다른 노드에서 자동으로 생성되어 가용성이 보장됨.
  3. DaemonSet:
    • DaemonSet에 의해 관리되는 Pod는 Drain 명령어로 이동되지 않음. 이는 DaemonSet Pod가 각 노드에 1개씩 실행되어야 하기 때문.
  4. RBAC 및 네임스페이스 관리:
    • 노드 관리 명령어를 사용할 권한이 있어야 하며, 올바른 네임스페이스에서 명령을 실행해야 함.