前提条件
- Kubernetes v1.22以降が必要(v1.28でベータ、最新のv1.32では機能改善あり)
- cgroup v2が必須(cgroup v1ではサポートされていない)
- ノード上にスワップが有効かつプロビジョニングされていること
kubelet設定
kubelet設定ファイルにおける表現:
failSwapOn: false # スワップが有効な場合でもkubeletを起動可能にする
memorySwap:
swapBehavior: LimitedSwap # スワップポリシーを設定
swapBehaviorのオプション:
-
UnlimitedSwap
: (v1.32で削除) Kubernetesワークロードはシステム制限までスワップメモリを無制限に使用可能 -
LimitedSwap
: Burstable QoSのポッドのみスワップ使用可能で、使用量は制限される -
NoSwap
(デフォルト): Kubernetesワークロードはスワップを使用不可
QoSクラスとスワップの関係
QoSクラスの説明
-
Guaranteed:
- すべてのコンテナがメモリとCPUの
requests
とlimits
を指定し、両方が同じ値 - 最も高い優先度を持ち、リソース不足時に最後に削除される
- スワップ: 通常はスワップを使用しない
- すべてのコンテナがメモリとCPUの
-
Burstable:
- 少なくとも1つのコンテナがメモリまたはCPUの
requests
を指定 -
requests
とlimits
が異なるか、limits
が指定されていない場合 - スワップ:
LimitedSwap
設定時のみスワップ使用可能
- 少なくとも1つのコンテナがメモリまたはCPUの
-
BestEffort:
- どのコンテナも
requests
もlimits
も指定していない - リソース不足時に最初に削除される最低優先度
- どのコンテナも
LimitedSwapモードでのBurstable QoSの動作
- Burstable QoSのポッドのみがスワップメモリを使用可能
- ポッドに割り当てられるスワップ量は、そのポッドが要求するメモリ量とノードの総メモリ量の比率に基づいて自動的に決定される
- Burstable QoSでもメモリの
requests
とlimits
を同じ値に設定すれば、そのコンテナはスワップを使用しない
Pod仕様での関連表現
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: app
image: example/app
resources:
requests:
memory: "128Mi" # メモリリクエスト
limits:
memory: "256Mi" # メモリ制限
このPodはメモリのrequests
とlimits
が異なるため、Burstable QoSクラスとなり:
- kubeletが
LimitedSwap
モードの場合: スワップメモリを使用可能 - kubeletが
NoSwap
モードの場合: スワップメモリは使用不可
セキュリティ上の注意点
- セキュリティリスクを軽減するため、暗号化されたスワップを使用することが推奨されています
- 重要な情報(Kubernetesのシークレットなど)がディスクにスワップアウトされる可能性があるため
注意点
- 現在のところ、各ワークロードごとに個別のスワップ制限を設定するAPIはサポートされていない
- スワップ使用許可は、kubeletレベルで全体的に設定される
- メモリ使用量とスワップ使用量に関する指標はkubeletの
/metrics/resource
と/stats/summary
エンドポイントから取得可能