導入
昼間はアクセスが多く、夜は少ない。そんなサービスで Pod の数をずっと固定にするのは無駄も危険もあります。HorizontalPodAutoscaler(水平ポッドオートスケーラー、HPA) は、負荷に応じて Pod の数を自動で増やしたり減らしたりしてくれる仕組みです。
説明
水平スケール(horizontal scaling) とは「Pod の数を増減させて処理能力を変えること」です(1つの Pod を大きくする垂直スケールと対比されます)。HPA は、CPU 使用率などの**メトリクス(測定値)**を監視し、目標値を保つように Deployment の replicas(Pod 数)を調整します。
ここで前レッスンの requests が効いてきます。「CPU 使用率50%」の基準は、requests に対する割合で計算されるからです。requests が未指定だと HPA は使用率を計算できません。
# webという名前のDeploymentに対してHPAを設定
# CPU使用率50%を目標に、Podを最小2〜最大10の範囲で自動調整
$ kubectl autoscale deployment web --cpu-percent=50 --min=2 --max=10
flowchart TD
M["メトリクスを監視<br/>(CPU使用率など)"] --> C{"目標50%より<br/>高い? 低い?"}
C -->|高い| UP["replicasを増やす<br/>Pod追加"]
C -->|低い| DOWN["replicasを減らす<br/>Pod削減"]
UP --> M
DOWN --> M
この監視と調整のループにより、アクセス急増時は Pod が自動で増えて耐え、落ち着けば減ってコストを抑えます。
HPA が CPU やメモリの使用率を知るには、クラスタに metrics-server(メトリクスサーバー) という「各 Pod の使用量を集めて配る部品」が入っている必要があります。マネージド k8s では最初から入っていることが多いですが、自前クラスタでは導入を忘れると HPA が動きません。