基本概念
動作原理
HPAは定期的に定義されたメトリクスを取得し、リソース使用率を監視します。コントロールマネージャーはscaleTargetRefで指定されたリソースを特定し、ラベルセレクタでPodを選択後、リソースメトリクスAPIからデータを収集します。
メトリクス取得は以下のAPI経由で行われます:
- metrics.k8s.io(通常Metrics Serverが提供)
- custom.metrics.k8s.io(Prometheus等が提供)
- external.metrics.k8s.io(クラウドプロバイダーが提供)
HPAはDeploymentおよびStatefulSetリソースのスケーリングをサポートします。
スケーリングアルゴリズム
計算式
希望レプリカ数 = ceil[現在のレプリカ数 × (現在のメトリクス値 / 目標メトリクス値)]
例:現在値が200mで目標値が100mの場合、レプリカ数は2倍になります。現在値が50mの場合は半減します。
追加の考慮事項:
- 削除タイムスタンプを持つPodは無視
- 失敗したPodは除外
- メトリクス欠損時は保守的処理(スケールダウン時は目標値と仮定)
- 複数メトリクス定義時は最大変化値が適用
パラメータ--horizontal-pod-autoscaler-downscale-stabilization(デフォルト5分)でスケーリング間隔を調整可能です。
スケーリング動作の設定
scaleUp/scaleDownで拡縮方向別に設定可能:
behavior:
scaleDown:
policies:
- type: Pods
value: 4
periodSeconds: 60
- type: Percent
value: 10
periodSeconds: 60
上記例では、Pod数が40未満で最初のポリシー(最大4Pod/分)、40以上で2番目のポリシー(最大10%/分)が優先されます。
安定化ウィンドウ
メトリクス変動による頻繁なスケーリングを防ぐための待機時間を設定します。
HPA設定手順
Metrics Serverの導入
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability.yaml
ノードメトリクス確認:
kubectl top nodes
サンプルアプリケーションのデプロイ
kubectl apply -f https://k8s.io/examples/application/nginx-sample.yaml
HPAの設定
kubectl autoscale deployment nginx-web --cpu-percent=40 --min=2 --max=15
ステータス確認:
kubectl get hpa nginx-web --watch
負荷テスト
kubectl run load-test --image=busybox -- /bin/sh -c "while true; do wget -qO- http://nginx-web; done"
カスタムメトリクス
CPU/メモリ以外の指標(ネットワークI/O、Ingressリクエスト数等)を使用したスケーリングが可能です。