# ローカルエフェメラルストレージ

LLMS index: [llms.txt](/llms.txt)

---

ノードは、ローカルに接続された書き込み可能なデバイス、または場合によってはRAMによって提供されるローカルエフェメラルストレージを持っています。
「エフェメラル」とは、耐久性に関する長期的な保証がないことを意味します。

Podは、スクラッチスペース、キャッシュ、およびログのためにエフェメラルローカルストレージを使用します。
kubeletは、ローカルエフェメラルストレージを使用してコンテナに[`emptyDir`](/docs/concepts/storage/volumes/#emptydir)
 <a class='glossary-tooltip' title='データを格納するディレクトリで、Pod内のコンテナからアクセス可能です。' data-bs-toggle='tooltip' data-bs-placement='top' href='/ja/docs/concepts/storage/volumes/' target='_blank' aria-label='ボリューム'>ボリューム</a>をマウントすることで、Podにスクラッチスペースを提供できます。

kubeletは、この種のストレージを[ノードレベルのコンテナログ](/docs/concepts/cluster-administration/logging/#logging-at-the-node-level)、コンテナイメージ、および実行中のコンテナの書き込み可能なレイヤーの保持にも使用します。

<div class="alert alert-caution" role="note"><h4 class="alert-heading">注意:</h4>ノードに障害が発生すると、そのエフェメラルストレージ内のデータは失われる可能性があります。
アプリケーションは、ローカルエフェメラルストレージに対してパフォーマンスSLA(例えばディスクIOPS)を期待することはできません。</div>



<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4><p>エフェメラルストレージに対してリソースクォータを機能させるには、2つのことを行う必要があります:</p>
<ul>
<li>管理者がNamespaceにephemeral-storageのリソースクォータを設定する。</li>
<li>ユーザーがPod specでephemeral-storageリソースのlimitsを指定する。</li>
</ul>
<p>ユーザーがPod specでephemeral-storageリソースのlimitsを指定しない場合、リソースクォータはephemeral-storageに対して適用されません。</p>
</div>


Kubernetesでは、Podが消費するエフェメラルローカルストレージの量を追跡、予約、制限できます。

## ローカルエフェメラルストレージの設定 {#configurations}

Kubernetesは、ノード上のローカルエフェメラルストレージを設定する2つの方法をサポートしています:
<ul class="nav nav-tabs" id="tabs-local-storage-configurations" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-local-storage-configurations-0" role="tab" aria-controls="tabs-local-storage-configurations-0" aria-selected="true">単一ファイルシステム</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-local-storage-configurations-1" role="tab" aria-controls="tabs-local-storage-configurations-1">2つのファイルシステム</a></li></ul>

<div class="tab-content" id="tabs-local-storage-configurations-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-local-storage-configurations-0" role="tabpanel" aria-labelledby="tabs-local-storage-configurations-0-tab" tabindex="local-storage-configurations"><p>この設定では、すべての種類のエフェメラルローカルデータ(<code>emptyDir</code>ボリューム、書き込み可能なレイヤー、コンテナイメージ、ログ)を1つのファイルシステムに配置します。
kubeletを設定する最も効果的な方法は、このファイルシステムをKubernetes(kubelet)のデータ専用にすることです。</p>
<p>kubeletは<a href="/ja/docs/concepts/cluster-administration/logging/#logging-at-the-node-level">ノードレベルのコンテナログ</a>もファイルに書き込み、エフェメラルローカルストレージと同様に扱います。</p>
<p>kubeletは、設定されたログディレクトリ(デフォルトでは<code>/var/log</code>)内のファイルにログを書き込みます。
また、その他のローカルに保存されるデータのためのベースディレクトリ(デフォルトでは<code>/var/lib/kubelet</code>)を持っています。</p>
<p>通常、<code>/var/lib/kubelet</code>と<code>/var/log</code>はどちらもシステムのルートファイルシステム上にあり、kubeletはそのレイアウトを前提として設計されています。</p>
<p>ノードには、Kubernetesに使用されない他のファイルシステムをいくつでも持つことができます。</p>
</div><div class="tab-body tab-pane fade"
        id="tabs-local-storage-configurations-1" role="tabpanel" aria-labelledby="tabs-local-storage-configurations-1-tab" tabindex="local-storage-configurations"><p>ノード上に、実行中のPodから生成されるエフェメラルデータ(ログと<code>emptyDir</code>ボリューム)に使用するファイルシステムがあります。
このファイルシステムは他のデータ(例えばKubernetesに関連しないシステムログ)にも使用できます。ルートファイルシステムであっても構いません。</p>
<p>kubeletは<a href="/ja/docs/concepts/cluster-administration/logging/#logging-at-the-node-level">ノードレベルのコンテナログ</a>も最初のファイルシステムに書き込み、エフェメラルローカルストレージと同様に扱います。</p>
<p>また、異なる論理ストレージデバイスによって提供される、別のファイルシステムも使用します。
この設定では、コンテナイメージのレイヤーと書き込み可能なレイヤーを配置するようkubeletに指定するディレクトリが、この2番目のファイルシステム上にあります。</p>
<p>最初のファイルシステムには、イメージレイヤーや書き込み可能なレイヤーは保持されません。</p>
<p>ノードには、Kubernetesに使用されない他のファイルシステムをいくつでも持つことができます。</p>
</div></div>


kubeletは、使用しているローカルストレージの量を測定できます。
これは、ローカルエフェメラルストレージのサポートされた設定のいずれかを使用してノードをセットアップした場合に提供されます。

異なる設定を使用している場合、kubeletはエフェメラルローカルストレージに対するリソース制限を適用しません。


<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4>kubeletは、<code>tmpfs</code>のemptyDirボリュームをローカルエフェメラルストレージとしてではなく、コンテナのメモリ使用量として追跡します。</div>



<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4>kubeletは、エフェメラルストレージについてルートファイルシステムのみを追跡します。
<code>/var/lib/kubelet</code>または<code>/var/lib/containers</code>に別のディスクをマウントするOSレイアウトでは、エフェメラルストレージが正しく報告されません。</div>


## ローカルエフェメラルストレージのrequestsとlimitsの設定 {#requests-limits}

ローカルエフェメラルストレージを管理するために`ephemeral-storage`を指定できます。
Podの各コンテナは、以下のいずれかまたは両方を指定できます:

* `spec.containers[].resources.limits.ephemeral-storage`
* `spec.containers[].resources.requests.ephemeral-storage`

`ephemeral-storage`のlimitsとrequestsはバイト単位で測定されます。
ストレージは、整数またはサフィックス(E、P、T、G、M、k)を使用した固定小数点数として表現できます。
また、2の累乗の等価表現(Ei、Pi、Ti、Gi、Mi、Ki)も使用できます。
例えば、以下の量はすべてほぼ同じ値を表します:

- `128974848`
- `129e6`
- `129M`
- `123Mi`

サフィックスの大文字小文字に注意してください。
ephemeral-storageに`400m`をリクエストした場合、これは0.4バイトのリクエストになります。
これを入力した人はおそらく400メビバイト(`400Mi`)または400メガバイト(`400M`)を要求するつもりだったでしょう。

以下の例では、Podに2つのコンテナがあります。
各コンテナには2GiBのローカルエフェメラルストレージのrequestがあります。
各コンテナには4GiBのローカルエフェメラルストレージのlimitがあります。
そのため、Podには4GiBのローカルエフェメラルストレージのrequestと、8GiBのローカルエフェメラルストレージのlimitがあります。
そのlimitのうち500Miは`emptyDir`ボリュームによって消費される可能性があります。

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        ephemeral-storage: "2Gi"
      limits:
        ephemeral-storage: "4Gi"
    volumeMounts:
    - name: ephemeral
      mountPath: "/tmp"
  - name: log-aggregator
    image: images.my-company.example/log-aggregator:v6
    resources:
      requests:
        ephemeral-storage: "2Gi"
      limits:
        ephemeral-storage: "4Gi"
    volumeMounts:
    - name: ephemeral
      mountPath: "/tmp"
  volumes:
    - name: ephemeral
      emptyDir:
        sizeLimit: 500Mi
```

## ephemeral-storageのrequestを持つPodがどのようにスケジュールされるか {#how-pods-with-ephemeral-storage-requests-are-scheduled}

Podを作成すると、KubernetesスケジューラーはPodを実行するノードを選択します。
各ノードには、Podに提供できるローカルエフェメラルストレージの最大量があります。
詳細については、[Node Allocatable](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable)を参照してください。

スケジューラーは、スケジュールされたコンテナのリソースrequestの合計がノードの容量より少ないことを保証します。

## エフェメラルストレージの消費量管理 {#resource-emphemeralstorage-consumption}

kubeletがローカルエフェメラルストレージをリソースとして管理している場合、kubeletは以下のストレージ使用量を測定します:

- _tmpfs_ の`emptyDir`ボリュームを除く、`emptyDir`ボリューム
- ノードレベルのログを保持するディレクトリ
- 書き込み可能なコンテナレイヤー

Podが許可された量を超えてエフェメラルストレージを使用している場合、kubeletはPodの退避をトリガーする退避シグナルを設定します。

コンテナレベルの分離では、コンテナの書き込み可能なレイヤーとログの使用量がストレージのlimitを超えた場合、kubeletはそのPodを退避対象としてマークします。

Podレベルの分離では、kubeletはそのPod内のコンテナのlimitsを合計することで、Pod全体のストレージlimitを算出します。
この場合、すべてのコンテナからのローカルエフェメラルストレージ使用量とPodの`emptyDir`ボリュームの合計がPod全体のストレージlimitを超えた場合、kubeletはそのPodを退避対象としてマークします。

<div class="alert alert-caution" role="note"><h4 class="alert-heading">注意:</h4><p>kubeletがローカルエフェメラルストレージを測定していない場合、ローカルストレージのlimitを超えたPodは、ローカルストレージリソースの制限違反によって退避されることはありません。</p>
<p>ただし、書き込み可能なコンテナレイヤー、ノードレベルのログ、または<code>emptyDir</code>ボリュームのファイルシステムの空き容量が少なくなると、ノードはローカルストレージが不足しているという<a class='glossary-tooltip' title='key、value、effectの3つの必須属性からなり、Podが特定のノードやノードグループにスケジューリングされることを防ぎます。' data-bs-toggle='tooltip' data-bs-placement='top' href='/ja/docs/concepts/scheduling-eviction/taint-and-toleration/' target='_blank' aria-label='taint'>taint</a>を自身に付与し、このtaintを明示的に許容しないすべてのPodの退避をトリガーします。</p>
<p>エフェメラルローカルストレージのサポートされた<a href="#configurations">設定</a>を参照してください。</p>
</div>


kubeletは、Podのストレージ使用量を測定するための異なる方法をサポートしています:

<ul class="nav nav-tabs" id="tabs-resource-emphemeralstorage-measurement" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-resource-emphemeralstorage-measurement-0" role="tab" aria-controls="tabs-resource-emphemeralstorage-measurement-0" aria-selected="true">定期的なスキャン</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-resource-emphemeralstorage-measurement-1" role="tab" aria-controls="tabs-resource-emphemeralstorage-measurement-1">ファイルシステムプロジェクトクォータ</a></li></ul>

<div class="tab-content" id="tabs-resource-emphemeralstorage-measurement-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-resource-emphemeralstorage-measurement-0" role="tabpanel" aria-labelledby="tabs-resource-emphemeralstorage-measurement-0-tab" tabindex="resource-emphemeralstorage-measurement"><p>kubeletは、各<code>emptyDir</code>ボリューム、コンテナログディレクトリ、および書き込み可能なコンテナレイヤーをスキャンする定期的なチェックを実行します。</p>
<p>スキャンは、使用されているスペースの量を測定します。</p>
<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4><p>このモードでは、kubeletは削除されたファイルのオープンファイルディスクリプターを追跡しません。</p>
<p><code>emptyDir</code>ボリューム内にファイルを作成(あなたまたはコンテナが)し、何かがそのファイルを開き、ファイルがまだ開いている間にそのファイルを削除した場合、削除されたファイルのinodeはそのファイルを閉じるまで残りますが、kubeletはそのスペースを使用中として分類しません。</p>
</div>
</div><div class="tab-body tab-pane fade"
        id="tabs-resource-emphemeralstorage-measurement-1" role="tabpanel" aria-labelledby="tabs-resource-emphemeralstorage-measurement-1-tab" tabindex="resource-emphemeralstorage-measurement">  <div class="feature-state-notice feature-beta" title="フィーチャーゲート: LocalStorageCapacityIsolationFSQuotaMonitoring">
              <span class="feature-state-name">FEATURE STATE:</span> 
              <code>Kubernetes v1.31 [beta]</code>(デフォルトで無効)</div>
<p>プロジェクトクォータは、ファイルシステム上のストレージ使用量を管理するためのオペレーティングシステムレベルの機能です。
Kubernetesでは、ストレージ使用量を監視するためにプロジェクトクォータを有効にできます。
ノード上で<code>emptyDir</code>ボリュームを提供するファイルシステムがプロジェクトクォータをサポートしていることを確認してください。
例えば、XFSとext4fsはプロジェクトクォータを提供しています。</p>
<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4>プロジェクトクォータはストレージ使用量を監視しますが、制限を強制するものではありません。</div>
<p>Kubernetesは<code>1048576</code>から始まるプロジェクトIDを使用します。
使用中のIDは<code>/etc/projects</code>と<code>/etc/projid</code>に登録されます。
この範囲のプロジェクトIDがシステム上の他の目的で使用されている場合、Kubernetesがそれらを使用しないように、それらのプロジェクトIDを<code>/etc/projects</code>と<code>/etc/projid</code>に登録する必要があります。</p>
<p>クォータはディレクトリスキャンよりも高速で正確です。
ディレクトリがプロジェクトに割り当てられると、そのディレクトリ配下に作成されたすべてのファイルはそのプロジェクト内に作成され、カーネルはそのプロジェクト内のファイルが使用しているブロック数を追跡するだけで済みます。
ファイルが作成されて削除されたが、オープンファイルディスクリプターを持っている場合、そのファイルはスペースを消費し続けます。
クォータの追跡はそのスペースを正確に記録しますが、ディレクトリスキャンでは削除されたファイルが使用しているストレージを見落とします。</p>
<p>クォータを使用してPodのリソース使用量を追跡するには、Podがユーザー名前空間内にある必要があります。
ユーザー名前空間内では、カーネルがファイルシステム上のprojectIDの変更を制限し、クォータによって計算されるストレージメトリクスの信頼性を保証します。</p>
<p>プロジェクトクォータを使用する場合は、以下を行う必要があります:</p>
<ul>
<li>
<p><a href="/docs/reference/config-api/kubelet-config.v1beta1/">kubelet設定</a>の<code>featureGates</code>フィールドを使用して、<code>LocalStorageCapacityIsolationFSQuotaMonitoring=true</code><a href="/ja/docs/reference/command-line-tools-reference/feature-gates/">フィーチャーゲート</a>を有効にする。</p>
</li>
<li>
<p><code>UserNamespacesSupport</code><a href="/ja/docs/reference/command-line-tools-reference/feature-gates/">フィーチャーゲート</a>が有効であり、カーネル、CRI実装、およびOCIランタイムがユーザー名前空間をサポートしていることを確認する。</p>
</li>
<li>
<p>ルートファイルシステム(またはオプションのランタイムファイルシステム)でプロジェクトクォータが有効になっていることを確認する。
すべてのXFSファイルシステムはプロジェクトクォータをサポートしています。
ext4ファイルシステムの場合、ファイルシステムがマウントされていない状態でプロジェクトクォータの追跡機能を有効にする必要があります。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># ext4の場合、/dev/block-deviceがマウントされていない状態で</span>
</span></span><span class="line"><span class="cl">sudo tune2fs -O project -Q prjquota /dev/block-device
</span></span></code></pre></div></li>
<li>
<p>ルートファイルシステム(またはオプションのランタイムファイルシステム)がプロジェクトクォータを有効にしてマウントされていることを確認する。
XFSとext4fsの両方で、マウントオプションは<code>prjquota</code>という名前です。</p>
</li>
</ul>
<p>プロジェクトクォータを使用しない場合は:</p>
<ul>
<li><a href="/docs/reference/config-api/kubelet-config.v1beta1/">kubelet設定</a>の<code>featureGates</code>フィールドを使用して、<code>LocalStorageCapacityIsolationFSQuotaMonitoring</code><a href="/ja/docs/reference/command-line-tools-reference/feature-gates/">フィーチャーゲート</a>を無効にする。</li>
</ul>
</div></div>



## 次の項目

* XFSの[プロジェクトクォータ](https://www.linux.org/docs/man8/xfs_quota.html)について読む
