導入
Pod は基本「1コンテナ」ですが、あえて複数のコンテナを1つの Pod に同居させる設計もあります。密に協力させたいコンテナをまとめる、この使い方の代表が サイドカーパターン です。
説明
レッスン7で見たとおり、同じ Pod のコンテナは同一IPを共有し localhost で通信でき、ボリュームも共有できます。この近さを活かすのが複数コンテナ Pod です。
サイドカー(sidecar) とは、バイクの横に付ける補助席のこと。アプリ本体のコンテナに、補助役のコンテナを寄り添わせる設計を指します。よくある補助役は次のようなものです。
graph TB
subgraph pod["Pod(IP・ボリューム共有)"]
MAIN[アプリ本体<br/>コンテナ]
SIDE[サイドカー<br/>ログ収集コンテナ]
V[(共有ボリューム<br/>ログファイル)]
MAIN -- ログを書く --> V
V -- ログを読む --> SIDE
SIDE -- localhost で連携 --- MAIN
end
2つのコンテナを持つ Pod のマニフェストの骨子はこうなります。containers の配列に2つ並べるだけです。
apiVersion: v1
kind: Pod
metadata:
name: app-with-logger
spec:
containers:
- name: app # 本体
image: my-app:1.0
- name: log-agent # サイドカー(補助役)
image: log-agent:1.0
ポイントは、本体とサイドカーが「同じ運命」を共有すること。同じノードに一緒に配置され、一緒に起動・停止します。強く結びついて動く2役だからこそ、別々の Pod ではなく1つの Pod にまとめるのです。逆に、独立して増減させたいものは同居させず、別々の Pod にします。
やってみよう
上のエディタの spec.containers に、2つ目のコンテナ(例: - name: sidecar / image: busybox:1.36)を足して kubectl apply -f manifest.yaml してみましょう。kubectl get pods の READY が 2/2 になります。
演習
2つのコンテナを持つ Pod を適用したら、その Pod の詳細を表示して、コンテナが2つ並んでいることを確かめてください。
ヒント1を見る
コンテナは spec.containers の配列なので、- name: から始まるブロックをもう1つ、同じインデントで並べるだけです。
ヒント2を見る
kubectl describe pod my-nginx を実行すると、Containers の欄に nginx と sidecar の2つが表示されます。