v1.25 で StableになったLocal Ephemeral Storage ── emptyDir で容量制限？ hostPath との違い＆設定ポイントを一気に把握！

── 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. 制限はどうやって効くのか？

1. **YAML でリミットを宣言**

   ```yaml
   resources:
     limits:
       ephemeral-storage: "4Gi"      # コンテナ合算でソフトリミット
   volumes:
   - name: cache
     emptyDir:
       sizeLimit: 500Mi              # emptyDir 単体のサブリミット
   ```

2. **kubelet が使用量を計測**

   * ext4 / XFS を `prjquota` 付きでマウントしている場合
     → **Filesystem Project Quota**（現在 α 機能）で正確に計測
   * それ以外の場合
     → 一定間隔で `du` を走査し、目安値を取得

3. **超過すると Eviction シグナル**

   * ソフトリミットのため、一瞬のバーストは許容され得る
   * Evicted Pod はスケジューラや Deployment／Job コントローラの設定に従って再スケジュールまたは Failed 表示

4. **`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][2])
* **KEP-1029 Quotas for Ephemeral Storage** (Filesystem quota monitoring) ([github.com][1])
* **KEP-1698 Generic Ephemeral Volumes** (CSI-backed inline volumes) ([github.com][3])
* **公式ドキュメント – Ephemeral Volumes** ([kubernetes.io][4])

[1]: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/1029-ephemeral-storage-quotas "Quotas for Ephemeral Storage - GitHub"
[2]: https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/361-local-ephemeral-storage-isolation/README.md "Local Ephemeral Storage Capacity Isolation - GitHub"
[3]: https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/1698-generic-ephemeral-volumes/README.md "KEP-1698: generic ephemeral inline volumes - GitHub"
[4]: https://kubernetes.io/ja/docs/concepts/storage/ephemeral-volumes/ "エフェメラルボリューム - Kubernetes"