Kubernetes HPAの詳細解説

基本概念

動作原理

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リクエスト数等)を使用したスケーリングが可能です。

タグ: Kubernetes hpa metrics-server 自動スケーリング カスタムメトリクス

7月24日 19:44 投稿