[Kubernetes] Cordon, Drain

문린이·2024년 8월 7일
0

Cordon

Cordon은 노드를 '예약 불가능(unschedulable)' 상태로 표시하는 작업이다.
이 상태의 노드에는 새로운 파드가 스케줄링되지 않는다.

kubectl cordon <node-name>
  1. 기존에 실행 중인 파드는 영향을 받지 않는다.

  2. 노드의 상태가 SchedulingDisabled로 변경된다.

  3. 임시 유지 보수나 문제 해결을 위해 사용된다.

해제 방법

kubectl uncordon <node-name>

사용 사례

  1. 노드 업그레이드 준비

  2. 하드웨어 문제 조사

  3. 리소스 재분배

테스트

  1. 적용 전 상태

    $ kubectl get node
    
    NAME            STATUS   ROLES           AGE    VERSION
    multinode       Ready    control-plane   146m   v1.30.0
    multinode-m02   Ready    <none>          145m   v1.30.0
    multinode-m03   Ready    <none>          145m   v1.30.0
  2. Cordon 적용

    $ kubectl cordon multinode-m02
    
    node/multinode-m02 cordoned
  3. Cordon 적용 후 상태

    $ kubectl get node
    
    NAME            STATUS                     ROLES           AGE    VERSION
    multinode       Ready                      control-plane   148m   v1.30.0
    multinode-m02   Ready,SchedulingDisabled   <none>          148m   v1.30.0
    multinode-m03   Ready                      <none>          147m   v1.30.0
    $ kubectl describe node multinode-m02
    
    ...
    Taints:             node.kubernetes.io/unschedulable:NoSchedule
    Unschedulable:      true
    ...

    multinode-m02SchedulingDisabled이 추가되었다.

  4. Cordon 취소

    $ kubectl uncordon multinode-m02
    
    node/multinode-m02 uncordoned
    $ kubectl get node
    
    NAME            STATUS   ROLES           AGE    VERSION
    multinode       Ready    control-plane   169m   v1.30.0
    multinode-m02   Ready    <none>          168m   v1.30.0
    multinode-m03   Ready    <none>          168m   v1.30.0

Drain

Drain은 노드에서 실행 중인 모든 파드를 제거하고, 노드를 'cordon' 상태로 만드는 작업이다.

kubectl drain <node-name>
  1. 노드를 먼저 cordon 상태로 만든다.

  2. 실행 중인 파드를 다른 노드로 이동시킨다. (재스케줄링)

  3. 노드가 완전히 비워질 때까지 대기한다.

옵션

--ignore-daemonsets : DaemonSet 관리 파드를 무시한다.
--delete-emptydir-data : emptyDir 볼륨을 사용하는 파드 삭제를 허용한다.
--force : replication controller, replica set, job, daemon set, stateful set이 아니어도 강제 삭제 (다시 생성되지 않는다.)

사용 사례

  1. 노드 유지 보수 또는 업그레이드

  2. 클러스터 축소

  3. 문제가 있는 노드 격리

테스트

  1. Test용 파드 배포

    $ kubectl get pod -o wide
    
    NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
    nginx-bf5d5cf98-dtxxz   1/1     Running   0          15s   10.244.2.2   multinode-m03   <none>           <none>
    nginx-bf5d5cf98-fjdhp   1/1     Running   0          15s   10.244.0.3   multinode       <none>           <none>
    nginx-bf5d5cf98-kbmz8   1/1     Running   0          15s   10.244.1.3   multinode-m02   <none>           <none>
  2. Drain 적용

    $ kubectl drain multinode-m02 --ignore-daemonsets
    
    node/multinode-m02 cordoned
    evicting pod default/nginx-bf5d5cf98-kbmz8
    pod/nginx-bf5d5cf98-kbmz8 evicted
    node/multinode-m02 drained
  3. Drain 적용 후 상태

    $ kubectl get pod -o wide
    
    NAME                    READY   STATUS    RESTARTS   AGE     IP           NODE            NOMINATED NODE   READINESS GATES
    nginx-bf5d5cf98-dtxxz   1/1     Running   0          4m25s   10.244.2.2   multinode-m03   <none>           <none>
    nginx-bf5d5cf98-fjdhp   1/1     Running   0          4m25s   10.244.0.3   multinode       <none>           <none>
    nginx-bf5d5cf98-qpmpq   1/1     Running   0          41s     10.244.2.3   multinode-m03   <none>           <none>
    
    $ kubectl get node
    NAME            STATUS                     ROLES           AGE     VERSION
    multinode       Ready                      control-plane   3h20m   v1.30.0
    multinode-m02   Ready,SchedulingDisabled   <none>          3h20m   v1.30.0
    multinode-m03   Ready                      <none>          3h20m   v1.30.0

    multinode-m02에 있던 파드가 다른 노드로 이동했고 multinode-m02SchedulingDisabled 상태가 되었다.

Cordon과 Drain의 차이점

  • Cordon: 새로운 파드 스케줄링만 방지

  • Drain: 기존 파드를 제거하고 새로운 스케줄링도 방지

profile
Software Developer

0개의 댓글