Cordon은 노드를 '예약 불가능(unschedulable)' 상태로 표시하는 작업이다.
이 상태의 노드에는 새로운 파드가 스케줄링되지 않는다.
kubectl cordon <node-name>
기존에 실행 중인 파드는 영향을 받지 않는다.
노드의 상태가 SchedulingDisabled로 변경된다.
임시 유지 보수나 문제 해결을 위해 사용된다.
해제 방법
kubectl uncordon <node-name>
사용 사례
노드 업그레이드 준비
하드웨어 문제 조사
리소스 재분배
적용 전 상태
$ 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
Cordon
적용
$ kubectl cordon multinode-m02
node/multinode-m02 cordoned
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-m02
에 SchedulingDisabled
이 추가되었다.
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은 노드에서 실행 중인 모든 파드를 제거하고, 노드를 'cordon' 상태로 만드는 작업이다.
kubectl drain <node-name>
노드를 먼저 cordon 상태로 만든다.
실행 중인 파드를 다른 노드로 이동시킨다. (재스케줄링)
노드가 완전히 비워질 때까지 대기한다.
옵션
--ignore-daemonsets : DaemonSet 관리 파드를 무시한다.
--delete-emptydir-data : emptyDir 볼륨을 사용하는 파드 삭제를 허용한다.
--force : replication controller, replica set, job, daemon set, stateful set이 아니어도 강제 삭제 (다시 생성되지 않는다.)
사용 사례
노드 유지 보수 또는 업그레이드
클러스터 축소
문제가 있는 노드 격리
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>
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
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-m02
가 SchedulingDisabled
상태가 되었다.
Cordon: 새로운 파드 스케줄링만 방지
Drain: 기존 파드를 제거하고 새로운 스케줄링도 방지