Kubernetesのストレージ:ボリュームの仕組みと活用方法

1. ボリュームの概要

Volumeは、Pod内に複数のコンテナが共有できるディレクトリを提供する仕組みです。Podのライフサイクルと連動し、コンテナ間で一時的なデータ共有や設定情報の共有が可能になります。

1.1 KubernetesのボリュームとDockerのボリュームの違い

  • KubernetesのvolumePodレベルで定義され、同じPod内の複数のコンテナがマウントできます。
  • Volumeの寿命はPodの生存期間と一致します。コンテナの再起動ではデータが保持されますが、Pod自体が削除されるとデータも消失します。
  • Kubernetesは多様なタイプのボリュームをサポートしており、クラウド環境やホストのファイルシステムとの統合が可能です。

1.2 サポートされるボリュームタイプの一覧

  • emptyDir: Podが実行されているノード上の一時ディレクトリ。コンテナ終了後もデータは残るが、Pod削除時に消える。
  • hostPath: ノードの物理ディスク上の特定パスをマウントする。
  • secret: セキュアな情報を含む秘密情報をコンテナに渡すためのボリューム。
  • configMap: 設定値をキー・バリュー形式でコンテナに注入。
  • gitRepo: Gitリポジトリからコードを取得してマウント。
  • glusterfs: オープンソースの分散ファイルシステムをマウント。
  • awsElasticBlockStore, gcePersistentDisk, azureDiskなど: 各クラウドベンダーの永続ストレージ接続。

2. 主要なボリュームタイプの詳細

2.1 emptyDir

2.1.1 概念

emptyDirは、Podがスケジュールされたノード上で作成される一時的なディレクトリです。初期状態は空であり、同一Pod内のすべてのコンテナが読み書き可能です。ノード上のデータは、そのノード上でPodが稼働している間は保たれます。

2.1.2 主な利用シーン

  • 一時的なキャッシュやログ出力先として使用。
  • 長時間実行されるジョブのチェックポイント保存。
  • 複数コンテナ間でのデータ共有(例:ビルドツールと実行環境の連携)。

2.1.3 実装例

apiVersion: v1
kind: Pod
metadata:
  name: shared-cache-pod
spec:
  containers:
  - name: processor
    image: example/processor
    volumeMounts:
    - name: cache-storage
      mountPath: /tmp/cache
  - name: logger
    image: example/logger
    volumeMounts:
    - name: cache-storage
      mountPath: /var/log/temp
  volumes:
  - name: cache-storage
    emptyDir: {}

2.2 hostPath

2.2.1 概念

hostPathは、クラスターノードのファイルシステムにある特定のパスを、Pod内でマウントする手段です。ホストのファイルやディレクトリを直接アクセス可能にします。

2.2.2 利用用途

  • Dockerの内部構造にアクセスしたいコンテナ(例:/var/lib/docker)。
  • などの監視ツールを実行する場合(/dev/cgroupsなど)。
  • ホストの特定ファイルまたはディレクトリの存在を制御したい場合。

2.2.3 typeオプションの意味

type動作
(空)何も検証しない(デフォルト)。
DirectoryOrCreate指定パスが存在しなければ空ディレクトリを作成(権限0755)。
Directoryパスは必須のディレクトリでなければならない。
FileOrCreate存在しなければ空ファイルを作成(権限0644)。
Fileパスは既存のファイルでなければならない。
SocketUNIXソケットが必須。
CharDeviceキャラクタデバイスが必要。
BlockDeviceブロックデバイスが必要。

2.2.4 実装例

apiVersion: v1
kind: Pod
metadata:
  name: host-data-access
spec:
  containers:
  - name: app-container
    image: nginx
    volumeMounts:
    - name: host-data
      mountPath: /data/host
  volumes:
  - name: host-data
    hostPath:
      path: /mnt/local-storage
      type: DirectoryOrCreate

2.2.5 利用時の注意点

  • 各ノードのファイルシステムは異なるため、同じテンプレートで作成されたPodが異なるノードで挙動が異なる可能性がある。
  • リソース感知スケジューリングではhostPathの使用量を考慮できない。
  • ホスト上のファイルへの書き込みは通常root権限が必要。プライベートコンテナや権限変更が必要になる。

タグ: Kubernetes volume emptyDir hostPath Pod

8月1日 12:51 投稿