見出し画像

KubernetesのPodのリクエストとは?—最小限のリソースを確保する仕組み

Kubernetesを使っていると、「リクエスト(requests)」という言葉をよく目にしますよね。「これは何の設定だろう?」「リクエストを適当に設定するとどうなるの?」と疑問に思ったことはありませんか?

リクエストは、Podが最低限確保しておきたいCPUやメモリ(RAM)をKubernetesに伝えるための仕組みです。うまく設定すれば、安定した動作を維持できますが、適当に決めると「スケジュールされない」「リソース不足で落ちる」といった問題が発生することも。

この記事では、リクエストとは何か、どんな影響があるのか、どのように設定すればよいのかをわかりやすく解説します。


リクエストとは?

Kubernetesでは、各Podが使うCPUやメモリの量を指定できます。リクエスト(requests)は、その中でも最低限確保したいリソースを表します。

例えば、オフィスでフリーアドレス(自由席)を導入するとき、「最低限、自分の席は1つ確保しておきたい」と希望を出すようなものです。この希望(リクエスト)をもとに、オフィス(Kubernetes)は座席(ノード)を割り当てます。


リクエストの設定方法

リクエストは、PodのYAML設定ファイルで spec.containers[].resources.requests に指定します。以下のように、CPUとメモリの最低保証量を記述できます。

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
    - name: example-container
      image: nginx
      resources:
        requests:
          cpu: "500m"     # 0.5 CPU(500ミリCPU)
          memory: "256Mi" # 256MiB(約256MB)

(1) CPUの指定

  • 1 CPU = 1000m(ミリCPU)

  • 例:500m(0.5 CPU)

(2) メモリの指定

  • Mi(Mebibyte)または Gi(Gibibyte)で記述

  • 例:256Mi(256 MiB)

この設定を行うことで、Podが最低限確保すべきリソースをKubernetesに伝えます。


リクエストの役割

リクエストには、大きく3つの重要な役割があります。

(1) スケジューリングの判断基準

Kubernetesは、Podをどのノード(サーバー)に配置するかを決める際に、リクエストの量を考慮します。

例えば、ノードA(CPU: 2, メモリ: 4Gi)があるとします。

  • cpu: 500m, memory: 256Mi のPodなら、このノードにスケジュール可能

  • cpu: 2, memory: 4Gi のPodなら、ギリギリだが配置できる

  • cpu: 4, memory: 8Gi のPodなら、リソースが足りず、スケジュール不可(Pending状態になる)

つまり、リクエストを大きくしすぎると、適切なノードが見つからずスケジュールされない可能性があります。

(2) 最低限のリソース保証

リクエストを設定しておくと、その量のリソースは他のPodに奪われることなく確保されます。

例えば、同じノード上で動作する2つのPodがあったとしましょう。

  • Pod A: cpu: 500m, memory: 256Mi

  • Pod B: cpu: 500m, memory: 256Mi

この場合、それぞれのPodは最低500mのCPUと256Miのメモリを確保できます。他のPodがリソースを大量に使っても、自分のリクエスト分は保証されるため、最低限の動作が保証されるのです。

(3) リクエストとリミットの違い

リクエストと似た概念に「リミット(limits)」があります。

項目 説明 リクエスト(requests) 最低限確保するリソース リミット(limits) 使用できる最大リソース

例えば、以下の設定を見てみましょう。

resources:
  requests:
    cpu: "500m"
    memory: "256Mi"
  limits:
    cpu: "1"
    memory: "512Mi"

この場合、

  • 最低限確保されるリソース → CPU: 500m、メモリ: 256Mi

  • 最大利用できるリソース → CPU: 1、メモリ: 512Mi

もしPodが負荷の高い処理を実行してCPUを1以上使おうとしても、1を超えることはできません。逆に、最低限500mのCPUと256Miのメモリは確保されるので、他のPodに圧迫されてもこの分は守られます。


リクエスト設定時の注意点

リクエストの設定には、いくつか気をつけるべきポイントがあります。

(1) リクエストが高すぎるとスケジュールされにくい

リクエストを大きくしすぎると、必要なリソースを満たすノードが見つからず、PodがPending(待機状態)になってしまうことがあります。

例えば、ノードに CPU: 2, メモリ: 8Gi しかないのに、cpu: 4, memory: 16Gi をリクエストしたら、当然ながら配置できません。

(2) リクエストが低すぎるとリソース競争に負ける

逆に、リクエストを小さくしすぎると、同じノードの他のPodがリソースを大量に使ったときに、自分のPodが圧迫されて動作が遅くなったり、最悪の場合、OOM Kill(Out of Memory Kill)される可能性があります。

そのため、実際に必要なリソースに見合った適切なリクエスト値を設定することが重要です。


リクエストを確認する方法

Podのリクエストは、以下のコマンドで確認できます。

(1) kubectl describe pod

kubectl describe pod example-pod

出力例:

Requests:
  cpu:     500m
  memory:  256Mi

(2) kubectl get pod -o jsonpath

kubectl get pod example-pod -o jsonpath="{.spec.containers[0].resources.requests}"

まとめ

  • リクエストは、Podが最低限確保するリソース量

  • スケジューリング時に考慮され、リクエストが高すぎると配置されにくい

  • 低すぎると他のPodに圧迫され、リソース不足になる可能性がある

  • リクエストとリミットを適切に設定することで、安定した動作を確保できる

リクエストの適切な設定を意識しながら、安定したKubernetes運用を目指してみてください!

いいなと思ったら応援しよう!