노드 내의 모든 파드를 안전하게 제거하고, 더이상 해당 노드에 새로운 파드가 스케줄링 되지 않도록 설정하는 명령어
노드를 SchedulingDisabled
상태로 만듦
--ignore-daemonsets
만약 데몬셋 파드가 존재한다면 이 옵션을 추가해서 drain 실행해야함.
옵션을 추가하면 데몬셋 파드를 삭제하지 않음
데몬셋 파드가 존재하는 경우 아래처럼 drain 명령이 적용되지 않음
controlplane ~ ➜ k drain node01
node/node01 cordoned
error: unable to drain node "node01" due to error:cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-flannel/kube-flannel-ds-fkjrh, kube-system/kube-proxy-htdhj, continuing command...
There are pending nodes to be drained:
node01
cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-flannel/kube-flannel-ds-fkjrh, kube-system/kube-proxy-htdhj
옵션을 추가해서 데몬셋 파드를 제외한 파드를 정리하도록 명령
controlplane ~ ➜ k drain node01 --ignore-daemonsets
node/node01 already cordoned
Warning: ignoring DaemonSet-managed Pods: kube-flannel/kube-flannel-ds-fkjrh, kube-system/kube-proxy-htdhj
evicting pod default/blue-6b478c8dbf-rmhqq
evicting pod default/blue-6b478c8dbf-mnn4c
pod/blue-6b478c8dbf-mnn4c evicted
pod/blue-6b478c8dbf-rmhqq evicted
node/node01 drained
drain 명령 적용된 노드는 더이상 스케줄링 되지 않음
controlplane ~ ➜ k get nodes
NAME STATUS ROLES AGE VERSION
controlplane Ready control-plane 11m v1.27.0
node01 Ready,SchedulingDisabled <none> 11m v1.27.0
노드 내에 존재하는 파드에 영향을 주지 않으면서, 더이상 해당 노드에 새로운 파드가 스케줄링되지 않도록 설정하는 명령어
노드를 SchedulingDisabled
상태로 만듦
controlplane ~ ➜ k cordon node01
node/node01 cordoned
controlplane ~ ➜ k get nodes
NAME STATUS ROLES AGE VERSION
controlplane Ready control-plane 28m v1.27.0
node01 Ready,SchedulingDisabled <none> 28m v1.27.0
controlplane ~ ➜ k get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
blue-6b478c8dbf-5vfqp 1/1 Running 0 17m 10.244.0.5 controlplane <none> <none>
blue-6b478c8dbf-8jv48 1/1 Running 0 19m 10.244.0.4 controlplane <none> <none>
blue-6b478c8dbf-h778m 1/1 Running 0 17m 10.244.0.6 controlplane <none> <none>
hr-app-6d6df76fc-589tc 1/1 Running 0 4m 10.244.1.6 node01 <none> <none>
drain, cordon 명령이 사용된 노드를 정상으로 되돌려 놓는 명령어
SchedulingDisabled
상태를 해제한다.
그러나 uncordon 으로 노드를 다시 살린다고 해서 곧바로 pod가 스케줄링 되는 것은 아님.
새로운 파드가 생성되어야 이 노드로 스케줄링 될 수 있음
controlplane ~ ➜ k uncordon node01
node/node01 uncordoned
controlplane ~ ➜ k get nodes
NAME STATUS ROLES AGE VERSION
controlplane Ready control-plane 13m v1.27.0
node01 Ready <none> 13m v1.27.0
만약 replicaset, replica controller, job, daemonset, statefulset 에 속하지 않은 pod가 존재 할 경우, 강제로 노드를 drain 시키면?
그 pod는 영영 없어져버림…
controlplane ~ ✖ k drain node01 --ignore-daemonsets --force
node/node01 already cordoned
Warning: deleting Pods that declare no controller: default/hr-app; ignoring DaemonSet-managed Pods: kube-flannel/kube-flannel-ds-fkjrh, kube-system/kube-proxy-htdhj
evicting pod default/hr-app
pod/hr-app evicted
node/node01 drained
controlplane ~ ➜ k get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
blue-6b478c8dbf-5vfqp 1/1 Running 0 10m 10.244.0.5 controlplane <none> <none>
blue-6b478c8dbf-8jv48 1/1 Running 0 12m 10.244.0.4 controlplane <none> <none>
blue-6b478c8dbf-h778m 1/1 Running 0 10m 10.244.0.6 controlplane <none> <none>