KubernetesのPodとコンテナの違いは何か?
Podオブジェクトとは単一のコンテナまたはコンテナのグループを表し、Kubernetesで何を実行する場合でもPodを使用して実行されます。 別の言葉を使えば、Podとは同じ実行環境上で動くアプリケーションコンテナとストレージボリュームの集まりの事とも言える。
Kubernetesのクラスタで直接コンテナを操作することはできず、Podが最小のデプロイ単位となります。 ほとんどの場面で、Podとコンテナは同じ意味になります。つまり、Kubernetesにおける最小単位という意味でつかわれますが、実態はやはりPodが最小の単位です。 しかし、より複雑なアプリケーションの場合、Podは二つ以上のコンテナで構成される可能性が高いです。
Pod内部に二つ以上のコンテナが存在するケース
Pod内部に二つのコンテナが存在するケースは、docker-composeで運用するケースとほぼ同じと言ってよいでしょう。
アプリケーションとキャッシュサーバー
Podは相互に通信してデータを共有する必要があるコンテナのグループを指しました。 一つのPod内のコンテナはデプロイするときも障害が起きてrebootするときも一緒です。
具体的な例だと、redis
などです。
redis
は基本的なキーバリューストアですが、キャッシュサーバーとして扱うこともできます。
具体的な用途 あなたのアプリケーションが
ruby on rails
を使用しており、アプリケーションでの検索結果の表示に時間がかかる場合、一度生成した検索結果をredis
に保存することで、
上記の構成の場合、Pod内部には次の二つのコンテナが出来上がることになります。
ruby on rails
で動く、あなたのアプリケーションredis
によるキャッシュサーバー
このように、一つのアプリケーションとそれをサポートする専属のコンテナという意味で、二つのコンテナが一つのPodに共存する構成があり得ます。
ブログの例
nginx
でサイトを公開するタイプのシンプルなブログアプリケーションの場合、これのみの運用だと一つのPod内部にはnginx
コンテナのみで十分になります。
ところが、ブログを管理する同期サーバーも含めたい場合は、Git
サーバーも必要になります。
このケースだと、nginx
を載せているコンテナにGit
サーバーも載せればよいことになります。
ところが、コンテナの内部には一つの事だけを実行するべきという原則があるため、この二つの機能は別々のコンテナに乗せたほうがよいでしょう。
上記の構成の場合、Pod内部には次の二つのコンテナが出来上がることになります。
ngix
によるブログアプリgit
による同期サーバー
このケースでも、一つのPodに二つのコンテナが存在することになりますね。
一つのPodに二つ以上のコンテナを乗っける方法
一つのPodに二つ以上のコンテナを実行するには、containers
に二つのコンテナを記述する必要があります。
apiVersion: v1 kind: Pod metadata: name: redis-flask-pod spec: containers: - name: redis-container image: redis:latest ports: - containerPort: 6379 - name: flask-container image: your-flask-image:tag ports: - containerPort: 5000
それぞれのコンテナで、name
とspec
は必須です。