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に転送されます。
上記の例では、同一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.