── emptyDir で容量制限? hostPath との違い&設定ポイントを完全整理!
Kubernetes で「一時ファイルを入れ過ぎてノードがパンク!」──そんな事故を防ぐ手段が ephemeral-storage リミット です。
「emptyDir ってただのディレクトリでしょ? 本当に制限かかるの?」
という疑問があるはず。そこで本記事では 仕組み と 設定の勘所 を最新仕様でアップデートしてまとめます。
1. emptyDir vs hostPath ── “似て非なる” 二つのボリューム
| emptyDir (Pod 破棄時に自動削除) | hostPath (既存パスをマウント) | |
|---|---|---|
| 実体 |
/var/lib/kubelet/pods/... に kubelet が生成 |
ホストの任意パスをそのまま |
| 使用量計測 | kubelet が追跡(du 走査または project quota) | 追跡対象外 |
ephemeral-storage リミット |
適用される(ソフトリミット) | 適用されない |
emptyDir.sizeLimit |
使える(ソフトリミット) | ー |
medium: "Memory" |
tmpfs としてハード制限 ※リソース種別はメモリ扱い |
ー |
| 典型的用途 | キャッシュ・一時ファイル・ログ | ノード固有ツールの設定など特殊ケース |
2. 制限はどうやって効くのか?
-
YAML でリミットを宣言
resources: limits: ephemeral-storage: "4Gi" # コンテナ合算でソフトリミット volumes: - name: cache emptyDir: sizeLimit: 500Mi # emptyDir 単体のサブリミット -
kubelet が使用量を計測
- ext4 / XFS を
prjquota付きでマウントしている場合
→ Filesystem Project Quota(現在 α 機能)で正確に計測 - それ以外の場合
→ 一定間隔でduを走査し、目安値を取得
- ext4 / XFS を
-
超過すると Eviction シグナル
- ソフトリミットのため、一瞬のバーストは許容され得る
- Evicted Pod はスケジューラや Deployment/Job コントローラの設定に従って再スケジュールまたは Failed 表示
-
medium: "Memory"の emptyDir はガチ停止-
tmpfs -o size=<sizeLimit>でマウントされ、サイズ超過時は物理的に書き込み不能 - kubelet はこれをメモリ使用量として管理する点に注意
-
3. ワンポイント
| 落とし穴 | 対策 |
|---|---|
| ノード共用ディスクが枯渇 | kubelet eviction-hard 有効化を検討 (nodefs.available など) |
4. まとめ
-
emptyDir なら
ephemeral-storageリミットが効く(ソフトリミット)。hostPath には効かない -
emptyDir.sizeLimitはサブリミット、medium: "Memory"はハードリミット(ただしメモリ扱い) -
計測は kubelet の du 走査
-
Eviction 後の Pod の再起動挙動はコントローラ依存。Failed で止まるケースもあるので要確認
-
状況によっては CSI EphemeralVolume(ephemeral volume)も選択肢。使える環境・条件であれば Pod 単位で独立したボリュームを動的に確保でき、より柔軟に管理できるため推奨
関連資料
- KEP-361 Local Ephemeral Storage Capacity Isolation (github.com)
- KEP-1029 Quotas for Ephemeral Storage (Filesystem quota monitoring) (github.com)
- KEP-1698 Generic Ephemeral Volumes (CSI-backed inline volumes) (github.com)
- 公式ドキュメント – Ephemeral Volumes (kubernetes.io)