#1. はじめに
第1回では、KubernetesにおけるPodの定義にはじまり、複数コンテナから構成されるPodのユースケースの紹介に続き、コンテナ間通信の中でも共有ボリュームを介したコンテナ間通信について説明しました。今回は、コンテナ間通信の中でもプロセス間通信を取り上げます。
#2. プロセス間通信
Pod内のコンテナは、IPC(IPC:Inter-process communications)ネームスペースを共有します。つまりシステムVセマフォやPOSIXシェアドライブラリなどの標準プロセス間通信を利用します。
次の例では、最初に同一Pod上の2つのコンテナを定義します。両方のコンテナに同じDockerイメージを使用します。最初のコンテナをプロデューサとします。標準Linuxメッセージキューを作成し、任意のメッセージを一定数書き込んだ後に、メッセージ終了を意味するExitメッセージを書き込みます。2番目のコンテナはコンシューマとします。プロデューサが作成したメッセージキューにアクセスし、キュー上のメッセージを読み込み、Exitメッセージを受信するまでメッセージを読み込みます。リスタートポリシーをNeverに設定するので、両コンテナが終了した時点でPodも終了します。以下の定義ファイルで2つのコンテナを単一Pod内に作成します。
apiVersion: v1
kind: Pod
metadata:
name: mc2
spec:
containers:
- name: producer
image: allingeek/ch6_ipc
command: ["./ipc", "-producer"]
- name: consumer
image: allingeek/ch6_ipc
command: ["./ipc", "-consumer"]
restartPolicy: Never
以上の動作を確認するために、コマンド”kubectl create”を使ってPodを作成したのち、以下のコマンドでPodの状態を監視します。
$ kubectl get pods --show-all -w
NAME READY STATUS RESTARTS AGE
mc2 0/2 Pending 0 0s
mc2 0/2 ContainerCreating 0 0s
mc2 0/2 Completed 0 29
各コンテナのログを確認し、最初のコンテナであるプロデューサは、2番目のコンテナ コンシューマがExitを含む全メッセージを受信したことを確認します。
$ kubectl logs mc2 -c producer
...
Produced: f4
Produced: 1d
Produced: 9e
Produced: 27
$ kubectl logs mc2 -c consumer
...
Consumed: f4
Consumed: 1d
Consumed: 9e
Consumed: 27
Consumed: done
Pod内において、コンテナの起動する順序にも注意を払う必要があります。この状態では、Pod内のコンテナはすべて同時に起動されます。つまりコンテナの起動順序を決定することはできません。上記のIPCの例では、最初のコンテナ プロデューサを起動後、メッセージをキューに送信する前に、2番目のコンテナが終了してしまうかもしれません。先の例では、コンテナ プロデューサからのメッセージが既にキューに保存されていることが前提です。したがって、2番目のコンテナの起動が先に完了してしまうと、キューからのメッセージを読み込めない可能性があります。
Kubernetes Init Containersをはじめ、複数コンテナの起動順序を制御するための機能開発が現在進められています。一方でクラウド環境下においては、管理ができないことを前提として、事前に対応策を考えておいたほうが賢明です。メッセージキューが作成されるまで、アプリケーション側で待機するように修正するのも一つの対応策として考えられます。
#3. 最後に
今回は、プロセス間通信とコンテナの依存関係と起動順序に関する注意事項について記載しました。次回は、コンテナ間のネットワーク通信について説明します。
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.