# メンテナンスのためにNodeからPodを削除する。同時にNodeはスケジュール不可の状態になる。
$ kubectl drain <node>
# Nodeをスケジュール可能にする。
$ kubectl uncordon <node>
# Nodeをスケジュール不可にする。Podは削除しない。
$ kubectl cordon <node>
# 実行前の状態
$ kubectl get node
NAME STATUS ROLES AGE VERSION
cluster-control-plane Ready control-plane,master 106s v1.23.0
cluster-worker Ready <none> 68s v1.23.0
cluster-worker2 Ready <none> 68s v1.23.0
cluster-worker3 Ready <none> 68s v1.23.0
# drainを実行してNode上のPodを削除すると同時にスケジュール不可にする
# 今回はkindのDaemonSetが動いているので`--ignore-daemonsets`オプションが必要
# cluster-worker2 Node上で動いていたnginx-558db87554-lsbnj Podは削除された
$ kubectl drain cluster-worker2 --ignore-daemonsets
node/cluster-worker2 already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/kindnet-wc62d, kube-system/kube-proxy-jq6qg
evicting pod default/nginx-558db87554-lsbnj
pod/nginx-558db87554-lsbnj evicted
node/cluster-worker2 drained
# STATUSにSchedulingDisabledが追加された
$ kubectl get node cluster-worker2
NAME STATUS ROLES AGE VERSION
cluster-worker2 Ready,SchedulingDisabled <none> 3m22s v1.23.0
# uncordonでスケジュール可能に戻す
$ kubectl uncordon cluster-worker2
node/cluster-worker2 uncordoned
# Readyのみの状態に戻った
$ kubectl get node cluster-worker2
NAME STATUS ROLES AGE VERSION
cluster-worker2 Ready <none> 3m39s v1.23.0
参考
- https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/
- https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#drain
- https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#uncordon
- https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#cordon