GKE クラスターのノードをアップグレードする前に、現在のノードにスケジュールされている Pod を安全に退避させるコマンドはどれですか?
- A. kubectl delete node <NODE_NAME>
- B. kubectl cordon <NODE_NAME>
- C. kubectl taint node <NODE_NAME> NoSchedule
- D. kubectl drain <NODE_NAME> --ignore-daemonsets --delete-emptydir-data
解答と解説を見る
正解: D
kubectl drain <NODE_NAME> は指定ノードを cordoned(新規 Pod のスケジューリング不可)にした上で、実行中の Pod を安全に他のノードに退避させます。--ignore-daemonsets は DaemonSet Pod を無視し(DaemonSet は全ノードに存在するため)、--delete-emptydir-data は emptyDir ボリュームを持つ Pod も退避できます。kubectl delete node はノード自体を削除してしまいます。kubectl taint でも NoSchedule を追加できますが、既存 Pod の退避は行いません。kubectl cordon はノードを新規スケジューリング不可にしますが、既存 Pod の退避は行いません(drain は cordon + evict をセットで行います)。