導入
1つのノードには複数の Pod が同居します。ある Pod が CPU やメモリを食い尽くすと、隣の Pod まで巻き添えになります。これを防ぐため、各コンテナに「最低これだけ確保」と「これ以上は使わせない」を宣言します。それが requests と limits です。
説明
コンテナごとに、CPU とメモリについて2つの値を指定できます。
- requests(要求) … 「最低これだけは確保してほしい」量。k8s はこの値を見て、どのノードに Pod を置くか(スケジューリング) を決めます。空きが足りないノードには置きません。
- limits(上限) … 「これを超えて使ってはいけない」量。超えたときの挙動は資源で違います。
spec:
containers:
- name: web
image: myapp:1.0
resources:
requests:
cpu: "250m" # 0.25コアを確保(1000m = 1コア)
memory: "128Mi"
limits:
cpu: "500m" # 上限0.5コア
memory: "256Mi"
上限を超えたときの違いが重要です。
- CPU が limit 超過 → プロセスは止められず、単に速度が絞られる(スロットリング)。
- メモリが limit 超過 → OOMKill(Out Of Memory Kill、メモリ不足でコンテナが強制終了)される。
もし requests/limits を指定しないとどうなるでしょう。k8s は確保量が分からないまま Pod を詰め込み、結果としてノードの資源が枯渇し、Pod が突然殺される――という不安定さにつながります。だから本番では指定が推奨されます。
requests と limits の関係から、k8s は Pod に QoS クラス(サービス品質の格付け) を付けます。両方を同値で指定した Pod は最優先(Guaranteed)、指定なしは最後回し(BestEffort)となり、資源が逼迫したときにどの Pod から退避させるかの判断に使われます。