KubernetesのNodeを再起動やメンテナンスをしたい時に、クラスタからNodeを切り離す手順を説明します。
安全に切り離すには、kubectl drainコマンドを使います。drain は「徐々に排出する」というような意味です。このコマンドを実行すると対象ノードで起動しているPodに停止命令が送られたあとにPodが削除されます。
ノード名を調べる
kubectl get nodes
ノードを排除する
kubectl drain {$node_name}
drainに指定できるオプション
| オプション名 | 短縮 | デフォルト | 説明 |
|---|---|---|---|
| delete-local-data | false | emptyDir(ノードが排出されたときに削除されるローカルデータ)を使用するポッドがあっても続行 | |
| dry-run | false | trueの場合、命令は送信せずに結果だけ表示 | |
| force | false | ReplicationController、ReplicaSet、Job、DaemonSetまたはStatefulSetで管理されていないポッドがあっても続行 | |
| grace-period | -1 | 正常に終了するために各ポッドに与えられる時間(秒単位)。負の場合、ポッドで指定されたデフォルト値が使用される | |
| ignore-daemonsets | false | DaemonSetで管理されているPodを無視する | |
| pod-selector | 対象podをラベルセレクタで選択 | ||
| selector | l | ラベルでノードを選択 | |
| timeout | 0s | タイムアウトを待つ時間の長さ、0は無限に待つ |
例
kubectl drain {$node_name} --grace-period=900
この例では、ReplicationController、ReplicaSet、Job、DaemonSet、またはStatefulSetによって管理されていないポッドがある場合は中止し、15分の猶予時間を与える。
対象ノードで動作しているpod一覧を取得する
kubectl get pods --template \
'{{range .items}}{{if eq .spec.nodeName "ノード名"}}{{.metadata.name}}{{"\n"}}{{end}}{{end}}'
ノードをメンテナンスする
対象ノードで動作しているpodが無くなったら再起動やメンテナンスを実施します。
ノードを復帰させる
kubectl uncordon {$node_name}
cordon は遮蔽するというような意味なので、uncordonは遮蔽を解除するという意味になります。