kubernetsの実行環境はnode(ノード)と呼ばれます。実機サーバーの場合もありますし、Google Container EngineのようにVMインスタンスの場合もあります。
複数のノード・クラスタの上で、pod(コンテナ)が実行されます。
通常のコンテナ運用では、podがどのnodeに配備されるかはkubernetesが自動的に決定しているため、ノードを直接操作する必要はありません。
たとえば、Google Container Engineの場合は、2016年5月にリリースされた Node Pool機能を活用すればほぼ運用をカバーできると思います。
ただし、計画停止や明示的にノード操作を行いたいケースのために、kubernetes v1.2からノード操作用のコマンドが拡充されています。
cordon / uncordon でコンテナ配備を制約
kubectl cordon some_node_name
は、指定したノードにpodが新規配備されるのを禁止するコマンドです。すでに実行中のpodsは影響を受けることなく実行を継続します。
このコマンドを実行したあとにkubectl create
すると、cordonでマークされたノードを避けて、別ノードにpodが配備されます。
指定するノード名や現在のcordonのステータスを確認するには、kubectl get nodes
コマンドを利用できます。
作業が終了したあとは、kubectl uncordon some_node_name
でcordonのマークを解除できます。
kubectl drain でノード除去の準備
ノードの動作が不安定で、計画停止したい場合には、kubectl drain
を使います。
drainはcordonによる新規配備の禁止に加えて、実行中のpodも停止し、ノード上の処理を空にできます。
多数のノードを運用するケースでは、drainで準備したうえで不調なノードを除去するフローが有効と考えられます。
kubectl cordonの利用シナリオ
kubernetesのシステム運用は原則として自動化されているため、順調に動作している場合はノード名すら知らなくても問題ありません。
ただ、とくにメモリリソースの割り当てがたまたま必要な容量より少ない場合など、podの配備は完了するもののコンテナ内のアプリ起動に失敗して再起動ループを繰り返す、というようなケースは起こります。
このような場合、起動に失敗したノードで再起動を繰り返しても問題は修復されず、別のノードにも移行しません。
kubectl cordon
で実行ノードを一時的に配備禁止に設定することで別のノードが探索され十分にメモリを獲得できれば起動します。
kubernetesの割り当てポリシーはかなり大雑把であるため、このように配備をチューニングしたくなるシーンではcordonを使えます。
Chuma Takahiro