KubernetesでemptyDirを使ってコンテナ間でログを共有する方法

kubenetesロゴ

Kubernetesで同一Pod内のコンテナ間でデータ共有を行いたい場合、emptyDirボリュームがよく利用されます。

本記事では、emptyDirを使ってログファイルを共有する方法を解説します。

emptyDirとは?

emptyDirは、Podが起動したタイミングで作成される一時的なストレージです。

  • Podが削除されるとデータも削除される
  • 同一Pod内のすべてのコンテナから共有可能

ログの一時保存やコンテナ間のデータ連携に適しています。

サンプル①:ログを書き込むPodの作成

まずは、ログを書き込むPodを作成します。

vi log-test-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: log-test-pod
spec:
  containers:
  - image: busybox
    name: write-log-pod-container
    volumeMounts:
    - mountPath: /log
      name: data-volume
    command:
      - sh
      - -c
      - "date >> /log/date.log; sleep 300"
  volumes:
  - name: data-volume
    emptyDir: {}

Podを作成します。

kubectl apply -f log-test-pod.yaml

ログの確認方法

作成したログファイルは、以下のコマンドで確認できます。

kubectl exec log-test-pod -- cat /log/date.log

サンプル②:コンテナ間でログを共有する

次に、同一Pod内の別コンテナからログを参照してみます。

apiVersion: v1
kind: Pod
metadata:
  name: log-test-pod
spec:
  containers:
  - image: busybox
    name: write-log-pod-container
    volumeMounts:
    - mountPath: /log
      name: data-volume
    command:
      - sh
      - -c
      - "date >> /log/date.log; sleep 300"

  - image: busybox
    name: log-reader-container
    volumeMounts:
    - mountPath: /log
      name: data-volume
    command:
      - sh
      - -c
      - "tail -f /log/date.log"

  volumes:
  - name: data-volume
    emptyDir: {}

コンテナのログを確認する

ログ監視用コンテナの出力は、以下で確認できます。

kubectl logs log-test-pod -c log-reader-container

重要ポイント(試験対策にも◎)

  • 同一Pod内であればVolumeは共有可能
  • emptyDirはPodのライフサイクルに依存
  • 永続化したい場合はPersistentVolumeを使用

まとめ

  • emptyDirを使うことでコンテナ間のデータ共有が簡単に実現できる
  • ログ連携やサイドカー構成に最適
  • Pod削除でデータも消えるため用途に注意