ここではKubernetesのスケーリングの仕組みの一つ、HPAを紹介します。
Contents
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ごとの値か」です。