「世の中には難しいことが多い!」と感じることが多い私が、様々な用語を、初学者向けにわかりやすく全力で解説します。
今回解説する用語
コンテナ用語である、podとnode、cordonとdrainについて初学者向けに、図を用いて、なるべく分かりやすいように解説をします。また、cordonやdrainを使用してnodeを移行する方法についても説明します。
nodeやpodはKubernetesがシステムを管理する単位
podやnodeとは、Kubernetesがコンテナアプリケーションのシステムを管理する単位です。Kubernetesについて詳しく知りたい場合は以下の記事を読んでみてください。
podとは?
pod(ポッド)とは、Kubernetesが管理するための最小の単位になります。podではシステム(アプリケーションなど)が稼働しております。

例えば、旅行の見積もりをしてくれるシステムがあるとします。その場合は、以下の図のように、このシステムはPodという中で動いているというイメージです。

nodeとは?
node(ノード)とは、複数のpodのまとまりのことです。podはnodeという単位で管理されます。

例えば、旅行の見積もりをしてくれるシステムと旅行の申し込みをしてくれるシステムがあるとします。その場合は、以下の図のようにそれぞれのシステムがnodeという単位で管理されているイメージです。

Kubernetesは何が便利なのか?
Kubernetesを使用することで、nodeとpodを管理することが出来ます。つまり、nodeとpodの数を自由自在に操ることが出来るのです。nodeやpodの数を増減させることで負荷分散になり、システムの可用性を向上させることが出来ます。
例えば、システムへたくさんのアクセスがある場合は、podを増加させることで可用性を向上させることが出来ます。ユーザーはストレスなくシステムを使えて嬉しいですね。

逆にシステムへのアクセスが少ない場合は、podを減少させることでコストを抑えることが出来ます。システム開発をした人は無駄なコストを抑えることが出来て嬉しいですね。

cordonとdrainをすることでnodeやpodのメンテナンスをすることが出来る
以上を踏まえたうえで、cordon(コードン)とdrain(ドレイン)について解説していきます。cordonとdrainをすることでnodeやpodのメンテナンスをすることが出来ます。node1で稼働しているシステムを新規で作成したnode2へ移行したい場合を例として、解説します。
cordonとは?
nodeにcordonをすることで、podへデプロイされるのを抑止することが出来ます。つまり、cordonをされたnodeのpodはシステムがデプロイされなくなるのです。

「デプロイされなくなるってどういうこと?」と思うかもしれません。実はpodの中のシステムは空いているpodがあると、ぬるりとpod中に入ってくるのです。この性質があることで、何らかの障害でアプリが止まってしまっても、空いているpodを見つけてまた稼働をしてくれるのです。そして、cordonをすることでシステムがpodに入ってこれなくなります。

ちなみにcordonされたpodはuncordonをすることで、cordonの状態を解除することが出来ます。
drainとは?
podにdrainをすることによって、podで稼働しているシステムを追い出すことが出来ます。

cordonとdrainを使うことで別のnodeへ移行をすることが出来る
cordonとdrainを使うことで、システムを別のnodeへ移行をすることが出来ます。例えば、node1から新しく作成したnode2へ移行をする場合を考えてみます。
まずは、node1のpodへシステムが入ってこれないようにcordonを行います。

次に、node1の各podへdrainを行います。drainをすることでシステムが外に追い出されます。

node1はcordonされているので、システムはnode1のpodに入ってこれません。そこで追い出されたシステムは中身がないnode2のpodへ入ってくるのです。

これでよい感じにnode1からnode2へ移行することが出来ました!不必要になったnode1は削除してしまいましょう。

「そもそもnodeを移行することなんてあるの?」と思うかもしれません。筆者はGoogleCloud製品であるGKEのメンテナンス作業でnodeの移行を行いました。セカンダリIP範囲の拡張するために、アプリケーションを旧nodeから新規nodeに移行しました。
