PONCOTSU

インフラ領域を主にあれしてます

複数コンテナを有するPodのHPA設定の挙動を深ぼる

HPAの設定ではDeployment単位で閾値を指定しているのに、扱うリソースはPodなので少しわかりづらいとおもったので、複数コンテナを有するPodに対してHPA設定をかけた場合の計算ロジック(詳細版)をまとめました。

HPAのreplicaset数算出方法を整理

公式を眺める

複数コンテナを持つPodだと、「Podが利用しているリソース」はどう計算されるでしょうか。
以下、メモリについて考えてみます。
公式を参考にすると、以下のような計算式になる。

HPAの計算方法
HPAの計算方法

数式をみるとウッ頭痛が...!となる人向けに少し解説します。
どちらもシンプルです。

podUsage でやっていることは、Pod内のコンテナが要求しているメモリ量の合計値と、同じくPod内コンテナが使用しているメモリ量の合計値を割ることでPod単位の使用率を求めているだけです。

scalledReplicasets は理想のreplicaset数を意味します。 計算方法は、HPAリソースで指定した使用率(averageUtilization)を分母にし、replicaset分の podUsage の総和を分子とした式を切り上げ(ceil関数)する、といったものになります。

具体例で考える

僕は式を出されても理解できないタイプなので、実際のケースに当てはめて考えてみたいと思います。
まず、

  • アプリケーションPod
    • Javaアプリケーションが載っているコンテナ(要求したメモリ量は 512Mi・使用中のメモリ量は360Mi)
    • cloudproxyコンテナ(要求したメモリ量は32Mi・使用中のメモリ量は12Mi)

を考えてみます。
このPodの合計要求メモリ量は 512 + 36= 548Mi、使用中の合計メモリ量は 360 + 12 = 372Miとなり、使用率に変換すると 372÷548 = 67%となります。( PodUsage )。

現在のreplicaset数は2とし、どのPodも同じメモリ使用率とします。
さらにHPAで設定した期待するメモリ使用率は 60%( averageUtilization )とします。
まず分子の計算をします。replicaset数分のPodのメモリ使用率を足していくと 134%となります。
最後に 134 ÷ 60 = 2.23。小数点切り上げをするので 3つのreplicasetが必要と算出されます。

本来はPodごとに使用率は変わってきますし、メモリ以外にもCPU使用率やカスタムメトリックスなどを使った複合的なスケール基準値を設定していると多少なり複雑になってくるはずです。