1. ボリュームの概要
Volumeは、Pod内に複数のコンテナが共有できるディレクトリを提供する仕組みです。Podのライフサイクルと連動し、コンテナ間で一時的なデータ共有や設定情報の共有が可能になります。
1.1 KubernetesのボリュームとDockerのボリュームの違い
- Kubernetesの
volumeはPodレベルで定義され、同じ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 | パスは既存のファイルでなければならない。 |
| Socket | UNIXソケットが必須。 |
| 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権限が必要。プライベートコンテナや権限変更が必要になる。