콘텐츠로 이동






워커노드 제외방법

back

사전 설명

  1. k8s환경에서 특정 노드 제외할때 그냥 삭제해도 kube scheduling에 의해 재배치가 있긴하지만 계획된 정지 작업같은 작업이 있는경우 보다 안정적으로 노드를 제외하려면 cordon / drain 절차를 거치면 좋습니다.
  2. PodDisruptionBudget(PDB)가 설정된 경우 drain이 지연되거나 실패할 수 있으며, 이 경우 --force 옵션이나 PDB 조정이 필요할 수 있습니다.
  3. cordon / drain의 차이
    • cordon: 새로운 Pod 스케줄링만 막음
    • drain: 기존 Pod를 eviction하여 다른 노드로 이동
    • drain은 단순 삭제가 아니라 eviction을 통해 컨트롤러가 있는 Pod(Deployment 등)를 다른 노드로 재스케줄링하도록 유도하는 방식입니다. 컨트롤러가 없는 Pod는 복구되지 않습니다.

작업절차

  1. cordon 설정
    1. 노드 정보 확인
      $>  kubectl get no
      NAME    STATUS   ROLES                  AGE   VERSION
      masr1   Ready    control-plane,master   37d   v1.23.7
      work1   Ready    <none>                 37d   v1.23.7
      work2   Ready    <none>                 37d   v1.23.7
      
    2. cordon 수행 (work1노드를 제외할껍니다.)
      $> kubectl cordon work1
      node/work1 cordoned
      $>  kubectl get no
      NAME    STATUS                         ROLES                  AGE   VERSION
      masr1   Ready                          control-plane,master   37d   v1.23.7
      work1   Ready,SchedulingDisabled       <none>                 37d   v1.23.7
      work2   Ready                          <none>                 37d   v1.23.7
      
  2. drain 수행

    1. 해당 노드에 daemonset으로 구동되는 pod가 있거나 local storage가 구동되고 있는 경우 drain 작업이 수행되지 않습니다.
    2. emptyDir, hostPath와 같은 local storage를 사용하는 Pod는 drain 시 데이터 유실이 발생할 수 있으므로, 상태 데이터를 가지는 워크로드는 PV 기반으로 구성하는 것이 안전합니다.
      $> kubectl drain work2
      node/work2 already cordoned
      error: unable to drain node "work2", aborting command...
      
      There are pending nodes to be drained:
       k8sw2
      cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/calico-node-fb862, kube-system/kube-proxy-4qhsx, kube-system/nodelocaldns-6cptm
      cannot delete Pods with local storage (use --delete-emptydir-data to override): kubernetes-dashboard/dashboard-metrics-scraper-66dd8bdd86-6cnbv, kubernetes-dashboard/kubernetes-dashboard-844749bcff-mmpq2
      
    3. 강제로 drain 처리
      $> kubectl drain work2  --ignore-daemonsets --delete-emptydir-data
      node/work2 already cordoned
      WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-fb862, kube-system/kube-proxy-4qhsx, kube-system/nodelocaldns-6cptm
      evicting pod kubernetes-dashboard/kubernetes-dashboard-844749bcff-mmpq2
      evicting pod cert-manager/cert-manager-cainjector-75c94654d-r7trs
      evicting pod cert-manager/cert-manager-webhook-d4fd4f479-cr6z2
      evicting pod gitlab-agent/house-gitlab-agent-v1-586d6d6797-vm68t
      evicting pod kube-system/coredns-657959df74-j2zbq
      evicting pod kubernetes-dashboard/dashboard-metrics-scraper-66dd8bdd86-6cnbv
      pod/cert-manager-cainjector-75c94654d-r7trs evicted
      pod/cert-manager-webhook-d4fd4f479-cr6z2 evicted
      pod/house-gitlab-agent-v1-586d6d6797-vm68t evicted
      pod/kubernetes-dashboard-844749bcff-mmpq2 evicted
      pod/dashboard-metrics-scraper-66dd8bdd86-6cnbv evicted
      pod/coredns-657959df74-j2zbq evicted
      node/work2 evicted
      
      • DaemonSet으로 생성된 Pod는 drain 대상이 아니며, --ignore-daemonsets 옵션은 해당 Pod를 삭제하는 것이 아니라 drain 과정에서 무시하고 진행하는 옵션입니다.
  3. 작업완료

    1. 작업이 끝난노드는 스케줄링만 다시 허용하도록 설정합니다.
      $> kubectl uncordon work2 
      node/work2 already uncordoned
      
    2. 스케쥴링 활성화 확인
      $>  kubectl get no
      NAME    STATUS   ROLES                  AGE   VERSION
      masr1   Ready    control-plane,master   37d   v1.23.7
      work1   Ready    <none>                 37d   v1.23.7
      work2   Ready    <none>                 37d   v1.23.7
      






작성일: 2026년 6월 18일 ,  마지막 업데이트: 2026년 8월 20일