KubernetesのPodとコンテナの違いは何か?

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

それぞれのコンテナで、namespecは必須です。