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に溜まっているメッセージ数など)
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サーバなどで、アクセスが時間帯によって、激しい変化のある大きなシステムですと、この機能は結構有能な機能です。
ここまで読んでいただいて、お疲れ様でした。
コメント