콘텐츠로 이동






워커노드 제외방법

back

사전 설명

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

작업절차

  1. cordon 설정
  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
    
  3. 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
    
  4. drain 수행
  5. 해당 노드에 daemonset으로 구동되는 pod가 있거나 local storage가 구동되고 있는 경우 drain 작업이 수행되지 않습니다.
  6. 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
    
  7. 강제로 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 과정에서 무시하고 진행하는 옵션입니다.
  8. 작업완료

  9. 작업이 끝난노드는 스케줄링만 다시 허용하도록 설정합니다.
    $> kubectl uncordon work2 
    node/work2 already uncordoned
    
  10. 스케쥴링 활성화 확인
    $>  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