k8sクラスターに複数コンテナを含むPodを展開するには?

ほとんどの場合、Podを「Kubernetes」クラスターに展開すると、そのPodには単一のコンテナーが含まれる。ただし、複数のコンテナーを含むPodを展開することが必要な場合もある。複数のコンテナーを含むPodを展開すべき非常に実用的な理由が2つある。

  • サイドカーコンテナー:アプリケーションの機能を支援または強化するユーティリティーコンテナー(サイドカーコンテナーの例には、ログシッパー/ウォッチャーや監視エージェントがある)。
  • プロクシ/ブリッジ/アダプター:メインのコンテナーを外の世界に接続する。

 複数のコンテナーを含むPodを展開する最大の理由は、単一のコンテナーでは、アプリケーションのすべての側面を処理できない場合があることだ。例えば、「NGINX」のPodを展開したが、そのコンテナーのログを監視するための何かが必要になったとしよう。これを実行するには、複数のコンテナーを含むPodを展開するといい。

 信じられないかもしれないが、このプロセスはそれほど難しいものではない。

 本ブログでは、複数のコンテナーを含むPodをKubernetesクラスターに展開する手順を説明する。具体的には、2つのコンテナーを含むPodを作成する。1つ目のコンテナーは、2つ目のコンテナーとボリュームを共有するNGINXウェブサーバーを実行する。2つ目のコンテナーは1つ目のコンテナーにデータを書き込んで、複数のコンテナーを含むPodがどのように対話するのかを示す

必要なもの

 これを機能させるために必要なのは、実行中のKubernetesクラスターだけだ。クラスターが稼働したら、複数のコンテナーを含むPodの展開に取り掛かることができる。

複数のコンテナーを含むPodを定義する方法

 Kubernetesに関連するほかのすべてのことと同様に、複数のコンテナーを含むPodの定義にも「YAML」ファイルを使用する。以下のコマンドで新しいファイルを作成する。

nano multi-pod.yml

 そのファイルで、以下を貼り付ける。

apiVersion: v1
kind: Pod
metadata:
  name: multi-pod
spec:

  restartPolicy: Never

  volumes:
  - name: shared-data
    emptyDir: {}

  containers:

  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html

  - name: ubuntu-container
    image: ubuntu
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: ["/bin/sh"]
    args: ["-c", "echo Hello, TechRepublic > /pod-data/index.html"]

 YAMLファイルを確認してほしい。NGINXイメージに基づいて、1つのコンテナーがウェブサーバーとして展開されたことが分かる。ubuntu-containerという名前の2つ目のコンテナーは、「Ubuntu」イメージに基づいてコンテナーを展開し、1つ目のコンテナーによって提供されるindex.htmlファイルに、「Hello, TechRepublic」というテキストを書き込む。

 ファイルを保存して閉じる。

複数のコンテナーを含むPodを展開する方法

 この複数のコンテナーを含むPodを展開するには、以下のコマンドを実行する。

kubectl apply -f multi-pod.yml

 Podが展開されたら、実行中の状態に対して実際に多少の変更を加える作業をコンテナーに与えた後(ただし、動作し続けるのは1つ目のコンテナーだけだ)、以下のコマンドでnginx-containerシェルにアクセスする。

kubectl exec -it multi-pod -c nginx-container -- /bin/bash

 nginxコンテナーの「bash」プロンプトが表示されたはずだ。2つ目のコンテナーが役割を果たしたことを確認するには、以下のコマンドを実行する。

curl localhost

 「Hello, TechRepublic」というテキストが表示されたはずだ(図A)。

図Aubuntu-containerは、指示されたとおり、テキストをNGINX index.htmlファイルに書き込むことに成功した。
ubuntu-containerは、指示されたとおり、テキストをNGINX index.htmlファイルに書き込むことに成功した。

 これで目的は達成された。

 複数のコンテナーを含むPodをKubernetesクラスターに展開する方法の説明は、以上である。これは非常に基本的な例だが、単一のPod内で複数のコンテナーがどのように対話するのか、お分かり頂けたはずだ。