Resource Quota

Kubernetes の Namespace ごとにリソース使用量の上限を設定し、リソースの公平な配分を保証する仕組み

Kubernetesインフラ

Resource Quota とは

Resource Quota は、Kubernetes の Namespace ごとに CPU、メモリ、Pod 数などのリソース使用量の上限を設定するリソースである。マルチテナント環境で、1 つのチームやアプリケーションがクラスター全体のリソースを占有するのを防ぐ。

物理的なサーバーリソースは有限だ。Resource Quota がなければ、あるチームのバッチ処理が CPU を 100% 消費し、他チームのサービスが応答不能になる事態が起こりうる。

Resource Quota の設定例

apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-a-quota
  namespace: team-a
spec:
  hard:
    requests.cpu: "10"        # CPU リクエストの合計上限: 10 コア
    requests.memory: 20Gi     # メモリリクエストの合計上限: 20GiB
    limits.cpu: "20"          # CPU リミットの合計上限: 20 コア
    limits.memory: 40Gi       # メモリリミットの合計上限: 40GiB
    pods: "50"                # Pod 数の上限
    services: "10"            # Service 数の上限
    persistentvolumeclaims: "5"  # PVC 数の上限

この設定では、team-a Namespace 内の全 Pod の CPU リクエスト合計が 10 コアを超える Pod の作成は拒否される。

Resource Quota と LimitRange の違い

この 2 つは混同されやすいが、制御の粒度が異なる。

観点 Resource Quota LimitRange
制御対象 Namespace 全体の合計 個々の Pod / Container
役割 チーム全体のリソース上限 1 つの Pod が使えるリソースの範囲
設定例 「Namespace 全体で CPU 10 コアまで」 「1 Pod あたり CPU 最大 2 コア」
デフォルト値 設定不可 Pod にデフォルトの requests/limits を付与

実務では両方を組み合わせて使う。Resource Quota で Namespace 全体の枠を決め、LimitRange で個々の Pod のデフォルト値と上限を設定する。

apiVersion: v1
kind: LimitRange
metadata:
  name: default-limits
  namespace: team-a
spec:
  limits:
    - default:          # limits のデフォルト値
        cpu: "500m"
        memory: 512Mi
      defaultRequest:   # requests のデフォルト値
        cpu: "100m"
        memory: 128Mi
      max:              # 1 Container の上限
        cpu: "2"
        memory: 2Gi
      type: Container

Resource Quota が必要になる場面

  • マルチテナントクラスター: 複数チームが 1 つのクラスターを共有する場合、チームごとに Namespace を分け、Quota でリソースを公平に配分する
  • 開発環境のコスト制御: 開発環境で無制限にリソースを使われると、クラスターのコストが膨らむ。Quota で上限を設けて抑制する
  • 暴走 Pod の防止: バグで無限にレプリカが増える Pod がクラスター全体を圧迫するのを防ぐ

実務での設計指針

リソース配分の考え方

クラスター全体のリソースを 100% として、各 Namespace に配分する。

クラスター全体: CPU 100 コア, メモリ 400GiB
├── team-a (本番サービス):  CPU 40, メモリ 160GiB (40%)
├── team-b (本番サービス):  CPU 30, メモリ 120GiB (30%)
├── team-c (バッチ処理):    CPU 20, メモリ  80GiB (20%)
└── 予備 (バースト用):      CPU 10, メモリ  40GiB (10%)

合計を 100% にせず、10〜20% の予備を残すのがポイントだ。予備がないと、どの Namespace もバースト的な負荷増加に対応できない。

環境ごとの Quota 設計

環境 CPU requests メモリ requests Pod 数
prod 40 コア 160GiB 200
stg 10 コア 40GiB 50
dev 5 コア 20GiB 30

開発環境は本番の 1/8 程度に抑え、コストを最適化する。

よくある落とし穴

  • Quota を設定したのに requests/limits を書かない: Resource Quota が有効な Namespace では、Pod に requests/limits を明示しないと作成が拒否される。LimitRange でデフォルト値を設定しておかないと、開発者が混乱する
  • Quota の過小設定: 通常時は問題なくても、デプロイ時に新旧 Pod が同時に存在する (Rolling Update) ため、一時的にリソース使用量が増える。デプロイ時のオーバーヘッドを考慮した余裕が必要
  • 監視の欠如: Quota の使用率を監視していないと、上限に近づいていることに気づかず、突然 Pod が作成できなくなる。Prometheus + Grafana で kube_resourcequota メトリクスを監視する

Kubernetes 公式ドキュメントの「Resource Quotas」セクションが一次情報源であり、「Kubernetes in Action」(Marko Lukša 著) でも詳しく解説されている。

現場での応用を知るには関連書籍も役立つ。

関連用語