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
は遮蔽を解除するという意味になります。