ほとんどの場合、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)。
図A
ubuntu-containerは、指示されたとおり、テキストをNGINX index.htmlファイルに書き込むことに成功した。
これで目的は達成された。
複数のコンテナーを含むPodをKubernetesクラスターに展開する方法の説明は、以上である。これは非常に基本的な例だが、単一のPod内で複数のコンテナーがどのように対話するのか、お分かり頂けたはずだ。