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

コメント