広告

kubernetes – HorizontalPodAutoscaler

infrastructure as code

HorizontalPodAutoscaler-Podのスケーリング

前回で、GCPが提供しているNodePoolの機能による、Nodeのオートスケーリングについてご紹介しました。
今回はPodのオートスケーリングについて、ご紹介していきたいと思います。
Nodeのオートスケーリングと違って、Podのオートスケーリングはk8sが持っている機能です。

HorizontalPodAutoscalerとは

manifestのリソース指定:
kind: ResourceQuota
metadata.namespace

公式ドキュメントではHorizontalPodAutoscalerを以下のように定義しています。

The Horizontal Pod Autoscaler automatically scales the number of pods in a replication controller, deployment, replica set or stateful set based on observed CPU utilization (or, with custom metrics support, on some other application-provided metrics). Note that Horizontal Pod Autoscaling does not apply to objects that can’t be scaled, for example, DaemonSets.

HorizontalPodAutoscalerは、Deployment、ReplicaSetのレプリカ(Pod)数をCPUなどの負荷に応じて、スケールさせるためのリソースです。
※Podの設定にRequestを定義しない場合、動作しませんのでご注意ください。

スケールの基本動作

  • 操作対象:Deployment、ReplicaSet
  • 指定できる内容
    • スケール条件
    • 最低レプリカ数
    • 最高レプリカ数
  • デフォルトでは、15秒一回状態をチェックする
  • 目標指標:
    • targetAverageUtilization:目標平均使用率
    • targetAverageValue:目標平均使用数
  • スケール時のレプリカ必要数の計算式(CPUを例とする)
    • 必要レプリカ数 = ceil[現在レプリカ数 * (レプリカリソースの平均使用量 / 目標平均使用量)]
  • スケール条件:(デフォルトでは、0.1以内の差はスケジューリングしない)
    • スケールアウト:レプリカリソースの平均使用量 / 目標平均使用量 > 1.1
    • スケールイン:レプリカリソースの平均使用量 / 目標平均使用量 < 0.9
  • スケールアウト頻度:最大3分1回
  • スケールイン頻度:最大5分1回

HorizontalPodAutoscalerはDeploymentなどで定義したspec.replicasの設定より優先度が高い

※ceil演算子は、小数部が何であれ、整数部に+1で進数する計算
※スケールアウト:レプリカ(Pod)数を増やす
※スケールイン:レプリカ(Pod)数を減らす

例での説明

スケールの計算がちょっと理解しづらいところがあると思いますので、以下例を挙げて説明します。

レプリカ数3個のDeploymentがあるとします。レプリカのCPUのtargetAverageUtilization(目標平均使用数)を60%に設定しています。普段レプリカの平均CPU使用率が60%だとします(レプリカはロードバランシングしているので、どのレプリカも同じぐらいの使用率になるはず)。
ある時、アクセスが集中して、レプリカのCPU平均使用率が70%に上がった場合、目標使用率を維持するために、スケールアウトして負荷分散します。
また、スケール条件をこの例で説明すると、CPUの平均使用率が54%(0.9)~66%(1.1)の範囲内でしたら、スケールしません。

指定可能なメトリクス種類

スケール判断基準として指定可能なメトリクス(指標)は以下のものがあります。

  • Resource:CPU/メモリー
  • Pods:Podのコネクション数など
  • Object:k8s Object のメトリクス
  • External:k8s外部のメトリクス(LBのQPS、Cloud Pub/subに溜まっているメッセージ数など)

External参考

HorizontalPodAutoscaler 例

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: sample-hpa  # HorizontalPodAutoscaler名
  namespace: default  # Namespace指定
spec:
  minReplicas: 3  # 最小レプリカ(Pod)数
  maxReplicas: 10  # 最大レプリカ(Pod)数
  scaleTargetRef:  # 管理対象指定
    apiVersion: apps/v1
    kind: Deployment  # kind指定
    name: sample-development  # リソース名指定
  metrics:  # メトリクス
  - type: Pods  # Pods type
    pods:
      metricName: open_connections  # 接続数
      targetAverageValue: 100  # 目標平均使用数 100
  - type: Resource
    resource:
      name: cpu  # cpuメトリクス
      targetAverageUtilization: 60  # 目標平均使用率 60%
  - type: Resource
    resource:
      name: memory  # memoryメトリクス
      targetAverageValue: 100Mi  # 目標平均memory使用量100MiB

VerticalPodAutoscaler-Podのスケーリング

HorizontalPodAutoscalerと違って、PodのCPUやメモリの制限を動的に制御する機能です。
この機能はまだ新しくて、kubernetesバージョン 1.12.6以降でサポートされるようになります。

この機能を使用するにあたって、制限事項などもありますので、詳細はこちらでご確認していただければと思います。

最後に

今回はPodのオート(自動)スケジューリング(数を増やす/減らす)についてご紹介しました。
WEBサーバなどで、アクセスが時間帯によって、激しい変化のある大きなシステムですと、この機能は結構有能な機能です。
ここまで読んでいただいて、お疲れ様でした。

コメント

タイトルとURLをコピーしました