【k8s】HPAとは?概要と設定例を紹介

ここではKubernetesのスケーリングの仕組みの一つ、HPAを紹介します。

HPAとは

HPA(Horizontal Pod Autoscaller)とは、Horizontal(水平の)という語の通り、「水平方向に」Podの数をスケールさせる仕組みです。横並びになっているPodたちが増えたり減ったりするイメージですね。

ちなみにPod単体のリソーススペックを調整する「垂直方向の」オートスケーラー(VPA: Vertical Pod Autoscaller)もあるのですが、こちらは2022年時点では原則としてPodの再起動が必要となるため、無停止が求められるサービスには向かないかもしれません。

HPAの設定例

それではここから、実際の設定例を紹介しつつざっくりと解説していきたいと思います。

apiVersion: autoscaling/v1kind: HorizontalPodAutoscalermetadata:  name: sample-hpa  namespace: sample-hpa-namespacespec:  maxReplicas: 10  minReplicas: 3  scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-hpa  targetCPUUtilizationPercentage: 55  metrics:  - external:metric:  name: pubsub.googleapis.com|subscription|num_undelivered_messages  selector: matchLabels:resource.labels.subscription_id: 'sample-pubsub-subscription'target:  type: AverageValue  averageValue: 0.8 type: External

.spec.maxReplicasおよび.spec.minReplicasではPodをスケールさせる幅を指定します。上の例では、3Pod〜10Podまでオートスケールします。minReplicasを指定しない場合のデフォルト値は1です。

.spec.scaleTargetRefではどのk8sリソースをオートスケールするか、その参照先を指定します。ここではsample-hpaという名前のDeploymentを参照先にしています。

.spec.targetCPUUtilizationPercentageは、スケールされたPodの平均CPU使用率の目標値を指定します。単位は%です。ここではCPU使用率55%を指定しています。

そして.spec.metricsは、HPAがどこを見てオートスケールするかを指定する部分です。大きく分けてInternal metricsとExternal metricsがあり、ここではGoogle CloudのPub/SubにたまったMessageの数に応じてオートスケールするように設定しています。

ちなみに、Pub/Subの指標として上で設定しているnum_undelivered_messagesと似たものにnum_outstanding_messagesがありますが、num_undelivered_messagesはsubscribeされていないメッセージおよびackされていないメッセージ双方を見るのに対して、num_outstanding_messagesはsubscribeされているがackされていないmessageを見るという違いがあります。つまり、undeliveredは「未処理、処理中」のmessageを対象とする一方で、outstandingは「処理中」のmessageのみを対象としています。

.spec.metrics.external.target.typeにはValueかAverageValueが指定可能です。

Valueでは、ターゲットはAPIから返ってきたメトリクスと直接比較されます。AverageValueでは、カスタムメトリクスAPIから返ってきた値はターゲットと比較される前にPodの数で除算されます。

Horizontal Pod Autoscalerウォークスルー

要するに、ValueとAverageValueの違いは「全体の値か、Podごとの値か」です。

参考