本文へスキップ
BecomeCoder

Kubernetesコース · 第6章 運用と実践 ― 現場で使うために · レッスン30

リソース requests と limits ― CPU/メモリの確保と上限

ローカル実施

導入

1つのノードには複数の Pod が同居します。ある Pod が CPUメモリを食い尽くすと、隣の Pod まで巻き添えになります。これを防ぐため、各コンテナに「最低これだけ確保」と「これ以上は使わせない」を宣言します。それが requestslimits です。

説明

コンテナごとに、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 から退避させるかの判断に使われます。