導入
昼間はアクセスが多く、夜は少ない。そんなサービスで 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 が動きません。
やってみよう
kubectl apply -f deploy.yaml のあと kubectl autoscale で HPA を作り、kubectl get hpa で最小・最大レプリカ数と目標 CPU 使用率がどう登録されるか見てみましょう。
演習
web-deploy に、CPU 使用率50%を目標・最小2・最大10の HPA を付けてください。
ヒント1を見る
kubectl autoscale deployment <名前> --cpu-percent=<%> --min=<数> --max=<数> の形です。
ヒント2を見る
kubectl autoscale deployment web-deploy --cpu-percent=50 --min=2 --max=10 です。kubectl get hpa で TARGETS と MINPODS/MAXPODS が確認できます。