【ツール活用|初心者向け】Kubernetesの「騒がしい隣人」を防ぐ!Resource RequestsとLimitsの正しい設定方法

1. 導入:なぜリソース設定が重要なのか

Kubernetesでアプリケーションを運用していると、特定のPodがメモリを大量消費してノード全体をダウンさせたり、他のPodの動作を遅くさせたりする問題が発生することがあります。これは「騒がしい隣人(Noisy Neighbor)」問題と呼ばれます。Resource RequestsとLimitsを適切に設定することで、K8sはノードのリソースを正しく配分し、安定したシステム運用を実現できるようになります。

2. 基礎知識:RequestsとLimitsとは

Requests(要求量):Podが起動するために最低限必要なリソース量です。K8sのスケジューラは、この値を基に「どのノードにPodを配置するか」を決定します。
Limits(制限量):Podが使用できるリソースの最大値です。これを超えてメモリを使用しようとすると、システムによってPodが強制停止(OOM Killer)させられる場合があります。
QoS Class:RequestsとLimitsの設定の組み合わせによって、Podの重要度(Guaranteed, Burstable, BestEffort)が自動的に決まります。重要度の高いPodは、リソース不足時に優先的に保護されます。

3. 実装と解決策

Podの定義ファイル(YAML)のcontainersセクション内に、resourcesブロックを追加します。CPUは「m(ミリコア)」や「1(1コア)」、メモリは「Mi(メビバイト)」や「Gi(ギビバイト)」で指定します。

4. サンプルプログラム

以下のマニフェストは、開発環境でよく使われる標準的な設定例です。そのままコピーして、`pod.yaml`として保存し、`kubectl apply -f pod.yaml`で適用してください。

apiVersion: v1
kind: Pod
metadata:
  name: resource-demo-pod
spec:
  containers:
  • name: my-app
image: nginx resources: requests: # このPodが最低限必要とするリソース memory: "64Mi" cpu: "250m" limits: # このPodが使用できる最大リソース memory: "128Mi" cpu: "500m"

5. 応用・注意点

メモリのLimit設定に注意:メモリのLimitを低く設定しすぎると、アプリケーションが急なトラフィック増加でメモリ不足になり、頻繁に再起動(OOMKilled)を繰り返す原因になります。最初は余裕を持って設定し、モニタリングツール(Prometheusなど)で実際の使用量を観測しながら調整するのが鉄則です。
CPUの挙動:CPUはLimitを超えてもPodが強制終了されることはありませんが、設定値以上に負荷をかけると「スロットリング」が発生し、処理が意図的に遅延させられます。
RequestsとLimitsを一致させる:本番環境の重要なサービスでは、RequestsとLimitsを同じ値に設定することで「Guaranteed(保証)」クラスとなり、最も安定した実行環境を確保できます。

コメント

タイトルとURLをコピーしました