LimitRangeによるリソース制約の管理
KubernetesではデフォルトでPodにCPUやメモリの制限を設けていないため、ノードの全リソースを消費可能です。多数のPodが存在する環境で個別にリソース制限を設定しない場合、クラスター全体で以下のような制約を適用できます:
- 2GBメモリのノードで単一Podが2GBを超えないように制限
- 異なるNamespaceで開発環境(512MB上限)と本番環境(8GB上限)を分離
- リソース分散のためPodごとに平均20%以上のリソース使用を強制
LimitRange設定例
1. Namespace作成
kubectl create namespace resource-constraints
2. LimitRange定義
apiVersion: v1
kind: LimitRange
metadata:
name: resource-limiter
spec:
limits:
- type: Pod
max:
cpu: "2"
memory: 1Gi
min:
cpu: 100m
memory: 4Mi
maxLimitRequestRatio:
cpu: 4
memory: 3
- type: Container
default:
cpu: 250m
memory: 150Mi
defaultRequest:
cpu: 150m
memory: 75Mi
max:
cpu: "1.5"
memory: 800Mi
min:
cpu: 50m
memory: 2Mi
maxLimitRequestRatio:
cpu: 6
memory: 5
設定パラメータの解釈
| スコープ | パラメータ | 意味 |
|---|---|---|
| Container | min | 全コンテナのRequests下限値 |
| max | 全コンテナのLimits上限値 | |
| defaultRequest | 未指定時のデフォルトRequests | |
| default | 未指定時のデフォルトLimits | |
| maxLimitRequestRatio | Limits/Requests比率上限 | |
| Pod | min | 全コンテナRequests合計の下限 |
| max | 全コンテナLimits合計の上限 | |
| maxLimitRequestRatio | 合計値の比率上限 |
パラメータ間の関係: min ≤ defaultRequest ≤ default ≤ max
検証動作
制約違反Podの作成例:
apiVersion: v1
kind: Pod
metadata:
name: invalid-resource-pod
spec:
containers:
- name: web-server
image: nginx:latest
resources:
limits:
cpu: "2.0"
memory: 900Mi
エラーメッセージ:
Error: Pod "invalid-resource-pod" is forbidden: [Maximum cpu usage per Container is 1.5, but limit is 2.0]