はじめに
Kubernetesのリソース管理について、その基本であるrequestとlimitの概念を初めて知ったのでまとめます。
リソース管理が必要な理由
Kubernetesでは、複数のpodが同じnode(サーバ)上で動きます。
もし1つのpodが独占すると他のpodが動けなくなるため、それを防ぐために各Podに「どれだけリソースを使うか」を宣言させるのがリソース管理です。
request と limit の違い
request:最低限必要なリソース
「このPodを動かすには、最低これだけ必要です」という宣言。
resources:
requests:
memory: "128Mi" # 最低128MiBのメモリが必要
cpu: "250m" # 最低0.25コアのCPUが必要
役割:
- KubernetesがPodを配置するNodeを選ぶ基準になる
- この値分のリソースは保証される
limit:使える最大のリソース
「このPodが使えるリソースの上限」を設定。
resources:
limits:
memory: "256Mi" # 最大256MiBまで
cpu: "500m" # 最大0.5コアまで
役割:
- リソースの使いすぎを防ぐ
- limitを超えた場合の挙動はCPUとメモリで異なる
スロットリングとOOMKilled
CPUとメモリの場合、limitを超えた時の動作が違います。
CPUの場合→スロットリング
limitを超えると、処理速度が遅くなるだけ。Podは落ちない。
メモリの場合→OOMKilled
limitを超えると、Podが強制終了される(Out Of Memory Killed)。
# 確認方法
kubectl get pods
# STATUS: OOMKilled
kubectl describe pod <pod名>
# Reason: OOMKilled
設定例
基本的な設定
マニフェストファイルを作成して、その中に書く
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: nginx
image: nginx:1.25
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi" # requestの2倍程度
cpu: "500m"
ファイルをアプライして、期待するpodができているか確認。
kubectl apply -f my-manifest.yaml
kubectl get pods
まとめ
request と limit の違い:
- request:最低限保証されるリソース(Pod配置の基準)
- limit:使える最大のリソース(使いすぎ防止)
CPU と メモリの違い:
- CPU:limitを超えると遅くなる
- メモリ:limitを超えるとPodが落ちる
リソース管理を適切に設定することで、安定したKubernetes運用が可能になります。