K8s 5分講座#10 マルチコンテナPod
今回は「マルチコンテナPod」について話す。
通常Podはコンテナと1対1の関係にある、と前回の講義で仰ってませんでしたっけ?
あぁその通りだ。だから今回のはあくまで例外のユースケースとして捉えてくれ。
利用用途によってはこんなのもアリよ、という前回の補足という位置づけですね
マルチコンテナが有用なケース
結論から言うと、ヘルパーコンテナを用いる場合はマルチコンテナが良いと考えている。
ヘルパーコンテナ…?アプリケーションを乗せている通常のコンテナを助けるみたいな感じですかね?
具体的には、データの保存やバックアップ、ログの集約、監視などの機能を提供し、メインのアプリケーションコンテナを補完する役割を果たす。
確かにアプリと一緒のコンテナだと管理もごちゃごちゃしそうだし、開発者が分かれている場合は別に作りたいというケースもありそうですね。
そうだな。システムのより効率的な運用を求める場合や、管理の簡素化を意図する場合に、ヘルパーコンテナをアプリケーションコンテナと別に置くケースがある。
マルチコンテナを用いない場合の構成
説明を分かりやすくするため、一旦K8sから離れてPodの無い世界、シンプルなDockerコンテナの場合どうなるかを解説する。
Podでカプセル化するのではなく、コンテナ単体で稼働させる世界ですね。
まずdocker run appコマンドでアプリケーションをデプロイする。負荷が高まると更に、docker runコマンドを実行して同じアプリケーションインスタンスをデプロイする。
$ docker run app
$ docker run app
$ docker run app
$ docker run app
手動でスケーリングしていくイメージですね。現状は特に問題なさそうです。
その後、アーキテクチャが変更され、外部からデータを処理したりフェッチしたりすることでWebアプリケーションを支援する、新しいヘルパーコンテナができたとする。
メインのアプリケーション用コンテナとは別にヘルパーコンテナを作るんですね。
ヘルパーコンテナはアプリケーションコンテナと1対1の関係を維持し、直接通信させるために、関連情報を整理する必要がある。例えば下記のようなイメージだ。
$ docker run helper -link app1
$ docker run helper -link app2
$ docker run helper -link app3
$ docker run helper -link app4
app1のコンテナ用のヘルパーコンテナを立ち上げる、と言う形で1つずつ関連付けするんですね。
そうだ。リンクやカスタムネットワークを使って、これらのコンテナ間のネットワーク接続も自分で確立する必要があるということだ。
データを保存するストレージ領域を置く場合は、共有可能なボリュームを作成し、コンテナ間で共有する必要がありそうですね。
あぁ、規模が大きくなればそれらの設計を管理するのも一苦労だ。更にアプリケーションコンテナがダウンしたら、ヘルパーも削除してあげる必要がある。
逆もまた然りですね。新しいアプリケーションコンテナを作ったら、関連付けたヘルパーコンテナを都度立ち上げることになりますね。
Podがある世界
再びK8sの世界に戻ってこよう。K8sは、Podを使うことで今説明したことを全て自動的に行ってくれる。
アプリコンテナ作って、ヘルパーコンテナ関連付けて、設計を書き直して…ということから解放されますね。
Podがどのようなコンテナで構成されているかをマニフェストに定義するだけで、デフォルトでPod内のコンテナは同じストレージ、同じネットワーク空間にアクセスすることができ、作成・破棄も連動して行われる。
Pod内の同じネットワーク空間を共有しているから、互いをローカルホストとして直接通信でき、同じストレージスペースも共有できるんですね。
仮にアプリケーションがそれほど複雑で無く単一のコンテナで事足りたとしても、K8sではPodを作成する必要がある。
コンテナとPodは1対1が原則ですからね。
しかしこれは長い目で見れば、アプリケーションが将来的なアーキテクチャの変更やスケールに対応できるようになった、とも言える。
おおぉ、良いじゃないですかK8s。魅力が少し分かってきました。
あぁ。但しマルチコンテナは稀なユースケースであり、原則はコンテナとPodは1対1ということは念頭に置いといてくれ。
- 1つのPod内に、通常は同じ種類のコンテナを複数置くことはしない。
- 但し、アプリケーションコンテナとは別にヘルパーコンテナを用いる場合、マルチコンテナが有用。
- Pod内は同じネットワーク空間を共有するため、互いにローカル通信でき、ストレージも共有できる。
単にカッコイイからPodでカプセル化したわけでは無かったのですねー
そんな見た目の趣味嗜好ではなく、機能美を追求した形と言えるかもしれないな。
Podの定義をマニフェストに書くだけで、その通りに構築・維持してくれるK8sが求められる理由も分かってきました。