
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運用を目指してみてください!