training
kubernetes
container

Kubernetesによる同一ポッド内コンテナ間のネットワーク通信

More than 1 year has passed since last update.

1.はじめに

前回、前々回では、コンテナ間通信の中でも共有ボリュームを介した通信、プロセス間通信について説明しました。今回は、コンテナ間のネットワーク通信を取り上げます。

2. コンテナ間ネットワーク通信

同一Pod内のコンテナはローカルホストを介して通信することが可能です。この場合には同一ネットワークネームスペースを利用します。このとき、ホスト名はPod名と同一です。コンテナは同一IPアドレス・同一ポート空間を利用するので、入力ポートには異なるポート番号を割り当てます。つまり、Pod内のアプリケーションでポート番号が重複しないように調整します。
次の例では、リバースプロキシとして機能するNginx用コンテナと、ウェブアプリケーション用のコンテナから構成されるPodを作成します。

ステップ1:Nginxコンテナ用ConfigMapを作成します。コンテナ上のポート番号80番をローカルホスト上のポート5000番に変換します。

apiVersion: v1
kind: ConfigMap
metadata:
  name: mc3-nginx-conf
data:
  nginx.conf: |-
    user  nginx;
    worker_processes  1;

    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;

    events {
        worker_connections  1024;
    }

    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        sendfile        on;
        keepalive_timeout  65;

        upstream webapp {
            server 127.0.0.1:5000;
        }

        server {
            listen 80;

            location / {
                proxy_pass         http://webapp;
                proxy_redirect     off;
            }
        }
    }

ステップ2. 2つのコンテナから構成されるPodを作成します。Webアプリケーションとnginxをそれぞれ異なるコンテナを含みます。 Pod上では、nginxポート80のみ定義します。ポート5000ではPod外部からアクセスできません。

apiVersion: v1
kind: Pod
metadata:
  name: mc3
  labels:
    app: mc3
spec:
  containers:
  - name: webapp
    image: training/webapp
  - name: nginx
    image: nginx:alpine
    ports:
    - containerPort: 80
    volumeMounts:
    - name: nginx-proxy-config
      mountPath: /etc/nginx/nginx.conf
      subPath: nginx.conf
  volumes:
  - name: nginx-proxy-config
    configMap:
      name: mc3-nginx-conf

ステップ3 NodePortサービスを利用して、Podを公開します。

$ kubectl expose pod mc3 --type=NodePort --port=80
service "mc3" exposed

次のコマンドを使ってPodに転送するためのノード上のポートを特定します。

$ kubectl describe service mc3
...
NodePort:   <unset> 31418/TCP
…

これで、ブラウザ(もしくはcurlコマンド)上に以下のURLを入力すると、Nodeのポートにアクセスし、リバースプロキシ経由でWebアプリケーションにアクセスできます。

  http:// myhost:31418

このHTTPリクエストは、Webアプリケーション用コンテナ”Webapp"のポート5000に転送されます。
Network communication

上記の例では、同一Pod内にデプロイされた複数コンテナ間の通信方法を取り上げました。一方で、同一Pod内にデプロイされた複数のコンテナを外部に公開するために複数のポートを作成することはよくあることです。そのためには、次の2つの方法があります。1つ目の方法は、各サービス内部のプロセスを分割しプロセス毎にコンテナを作成し、それぞれのコンテナに対する公開ポートを作成する方法です。2つ目の方法は、1つのコンテナに対して複数の公開ポートを割りあてる方法です。

3. 最後に

最終回は、コンテナ間のネットワーク通信と外部に公開ポートを作成する方法について説明しました。今回の連載を通じて、コンテナ・オーケストレーションツールKubernetesによって作成されるPodの定義とPod内に作成されるコンテナ間の通信方法として、共有ボリュームを介した通信、プロセス間通信、ネットワーク通信を取り上げました。
Kubernetetsに実際に触れてみて、Kubernetesの可能性を探ってみたくなった方は、ぜひMirantisのトレーニングにご参加ください。

【参考資料】
Pavel Chekin (2017), “Multi-container pods and container communication in Kubernetes,” Mirantis Open Cloud Digest, https://www.mirantis.com/blog/multi-container-pods-and-container-communication-in-kubernetes/, Mirantis Inc.