λ kubectl drain
gpt-5.icon
Kubernetes クラスタ内のノードを安全に退役・メンテナンス状態にするためのコマンド です。
主に、ノードをアップデートしたり削除する前に使われます。
cordon + evict
🧩 基本的な役割
kubectl drain は、指定したノード上で動作している Pod を安全に退避(Evict) します。
これにより、そのノードを安全に停止・再起動・アップグレードできるようになります。
例:
$ kubectl drain my-node --ignore-daemonsets --delete-emptydir-data
この例では:
my-node 上の Pod を他ノードに退避
DaemonSet の Pod は無視
emptyDir ボリュームを使っている Pod も削除
⚙️ Drain の内部で起きていること
1. スケジューラから除外
2. Pod の退避 (Eviction)
ノード上のすべての Pod を順に削除または Evict。
これにより、Deployment/ReplicaSet により他ノードに再スケジュールされる。
Eviction は PodDisruptionBudget (PDB) を考慮して行われる。
3. DaemonSet・Static Pod の扱い
DaemonSet の Pod は通常削除しない(オプションで制御可能)。
Static Pod(kubelet 管理下の Pod)は削除できず、--force が必要な場合も。
🚀 よく使うオプション
table:_
オプション 説明
--ignore-daemonsets DaemonSet の Pod を無視(通常は必要)
--delete-emptydir-data emptyDir ボリュームを持つ Pod を強制的に削除
--force コントローラで管理されない Pod(手動作成など)も削除
--grace-period=<秒> Pod 終了時のグレース期間を指定
--timeout=<時間> 全体の drain 操作のタイムアウトを指定
--disable-eviction Eviction API を使わず、強制削除する(テスト用)
🧠 使い方の流れ
典型的なノードメンテナンス手順は以下です:
code:bash
# 1. ノードをスケジュール不可にする
kubectl cordon my-node
# 2. Pod を安全に退避
kubectl drain my-node --ignore-daemonsets --delete-emptydir-data
# 3. メンテナンス作業(再起動やアップデートなど)
# 4. ノードを再びスケジュール可能にする
kubectl uncordon my-node
⚠️ 注意点とよくあるエラー
table:_
状況 対応策
cannot delete DaemonSet-managed Pods --ignore-daemonsets を指定する
pod is unmanaged (no controller) --force を指定する
eviction is blocked by PDB PDB の設定を確認し、一時的に緩和する必要あり
PodDisruptionBudget: Too many disruptions Eviction は PDB の制約を尊重するため、少し待つと成功することも
🧪 drain と cordon/uncordon の違い
table:_
コマンド 動作
kubectl drain 既存 Pod を退避し、ノードを安全に空にする