Advanced Horizontal Pod Autoscaler (AHPA) は、過去 7 日間の履歴データに基づき、機械学習を用いてアプリケーションの今後 24 時間におけるリソース需要を予測します。予測された需要ピーク到来前にポッドをスケールアウトし、谷間(需要低下期)到来前にスケールインすることで、トラフィックスパイクへの対応を可能にしつつ、閑散期における過剰なリソース割り当てを回避します。
本チュートリアルでは、AHPA の完全なデプロイ手順を説明します。具体的には、コントローラーのインストール、Prometheus をデータソースとして接続、テストワークロードのデプロイ、AHPA ポリシーの作成、および予測結果の確認を行います。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
ACS クラスター。詳細については、「ACS クラスターの作成」をご参照ください。
クラスターに対して Managed Service for Prometheus が有効化されていること。詳細については、「Managed Service for Prometheus を使用した ACS クラスターのモニタリング」をご参照ください。
仕組み
AHPA は、Managed Service for Prometheus を通じて履歴メトリックデータを収集し、機械学習アルゴリズムを適用して、今後 24 時間における必要なポッド数を予測します。この予測には、相互に補完し合う 2 種類のモードが提供されます。
能動的予測(Proactive prediction) — 予測される需要ピーク到来前にポッドをスケールアウトし、コールドスタート遅延を吸収するためにリソースをプリフェッチします。
リアクティブ予測 — 標準 HPA と同様に、リアルタイムのメトリック信号に応答します。
任意の時点において、AHPA は能動的予測、受動的予測、および現在のタイムウィンドウ内で instanceBounds に定義された最大・最小ポッド数に基づき、推奨されるポッド数を提示します。この推奨値は、自動スケーリングを有効化する前に AHPA ダッシュボードで確認できます。
ステップ 1:AHPA コントローラーのインストール
ACS コンソールにログインします。左側ナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの ID をクリックします。クラスターの詳細ページの左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。
[アドオン] ページで、[その他] タブをクリックします。[AHPA コントローラー] を見つけ、[インストール] をクリックします。画面上の指示に従って、インストールを完了します。
ステップ 2:Prometheus を AHPA のデータソースとして追加
AHPA は、Managed Service for Prometheus インスタンスの内部エンドポイントを用いて履歴メトリックデータを取得します。本ステップでは、このエンドポイントを記録し、クラスター内に ConfigMap を作成してエンドポイントを登録したうえで、Prometheus に AHPA を監視対象コンポーネントとして登録します。
Prometheus エンドポイントの記録
ARMS コンソールにログインします。左側ナビゲーションウィンドウで、[Managed Service for Prometheus] > [インスタンス] を選択します。
[インスタンス] ページで、Prometheus インスタンスがデプロイされているリージョンを選択します。ACS クラスターと同じ名前のインスタンスを探します。その [インスタンスタイプ] 列には [汎用] と表示されています。
[操作] 列で、[設定項目] をクリックします。[HTTP API URL (Grafana Read URL)] セクションで、内部 エンドポイントを記録します。アクセストークンが有効な場合は、アクセストークンも記録します。
application-intelligence ConfigMap の作成
この ConfigMap は、AHPA が Prometheus インスタンスを検出するための情報を提供します。
以下の内容で
application-intelligence.yamlというファイルを作成します。apiVersion: v1 kind: ConfigMap metadata: name: application-intelligence namespace: kube-system data: prometheusUrl: "http://cn-hangzhou-intranet.arms.aliyuncs.com:9443/api/v1/prometheus/da9d7dece901db4c9fc7f5b9c40****/158120454317****/cc6df477a982145d986e3f79c985a****/cn-hangzhou" token: "eyJhxxxxx"prometheusUrlの値を、先ほど記録した内部エンドポイントに置き換えます。アクセストークンが有効化されている場合は、tokenの値を、ご使用のアクセストークンに置き換えます。AHPA ダッシュボード上で Prometheus メトリックを表示するには、ConfigMap に以下のキーを追加します。 -
prometheus_writer_url— Prometheus インスタンスの内部リモートライティングエンドポイント -prometheus_writer_ak— Alibaba Cloud アカウントの AccessKey ID -prometheus_writer_sk— Alibaba Cloud アカウントの AccessKey SecretConfigMap を適用します。
kubectl apply -f application-intelligence.yaml
AHPA の Prometheus モニタリングの有効化
本ステップでは、AHPA を監視対象コンポーネントとして登録し、Prometheus が AHPA のメトリックを収集できるようにします。
「ARMS コンソール」にログオンします。左側のナビゲーションウィンドウで、Managed Service for Prometheus > インスタンス を選択します。
上部ナビゲーションバーで、[他のコンポーネントとの統合] をクリックし、[インテグレーションセンター] ページに移動します。[AHPA] を検索し、AHPA カードをクリックします。
「ACK AHPA」ページで、「Kubernetes クラスターの選択」>「クラスターの選択」を選択します。ドロップダウンリストから ACS クラスターを選択します。
「設定情報」セクションで、以下のパラメーターを設定し、[OK] をクリックします:
パラメーター 説明 Exporter 名 AHPA からモニタリングデータを収集する Exporter の間で一意である名前 メトリック収集間隔(秒) サービスがモニタリングデータを収集する間隔 「[統合ステータスの確認]」ステップが完了したら、「[統合管理]」をクリックし、Managed Service for Prometheus が AHPA に対して有効になっていることを確認します。
ステップ 3:テストサービスのデプロイ
AHPA の予測結果と標準 HPA のスケーリング動作を比較可能なテスト環境を構築します。この環境には以下の要素が含まれます。
fib-deployment— スケーリング対象のワークロードfib-svc—fib-deploymentを公開するサービスfib-loader— トラフィック変動をシミュレートするロードジェネレーターfib-hpa— CPU 使用率 50% のときにfib-deploymentをスケールする標準的な HPA。ベースラインとして使用されます。
以下の内容で
demo.yamlというファイルを作成します。apiVersion: apps/v1 kind: Deployment metadata: name: fib-deployment namespace: default spec: replicas: 1 selector: matchLabels: app: fib-deployment strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: creationTimestamp: null labels: app: fib-deployment spec: containers: - image: registry.cn-huhehaote.aliyuncs.com/kubeway/knative-sample-fib-server:20200820-171837 imagePullPolicy: IfNotPresent name: user-container ports: - containerPort: 8080 name: user-port protocol: TCP resources: limits: cpu: "1" memory: 2000Mi requests: cpu: "1" memory: 2000Mi --- apiVersion: v1 kind: Service metadata: name: fib-svc namespace: default spec: ports: - name: http port: 80 protocol: TCP targetPort: 8080 selector: app: fib-deployment sessionAffinity: None type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: fib-loader namespace: default spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: fib-loader strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: creationTimestamp: null labels: app: fib-loader spec: containers: - args: - -c - | /ko-app/fib-loader --service-url="http://fib-svc.${NAMESPACE}?size=35&interval=0" --save-path=/tmp/fib-loader-chart.html command: - sh env: - name: NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace image: registry.cn-huhehaote.aliyuncs.com/kubeway/knative-sample-fib-loader:20201126-110434 imagePullPolicy: IfNotPresent name: loader ports: - containerPort: 8090 name: chart protocol: TCP resources: limits: cpu: "8" memory: 16000Mi requests: cpu: "2" memory: 4000Mi --- apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: fib-hpa namespace: default spec: maxReplicas: 50 minReplicas: 1 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: fib-deployment targetCPUUtilizationPercentage: 50テストサービスをデプロイします。
kubectl apply -f demo.yaml続行する前に、すべてのポッドが実行中であることを確認します。
kubectl get pods期待される出力(すべてのポッドが
Running状態であること):NAME READY STATUS RESTARTS AGE fib-deployment-xxx 1/1 Running 0 1m fib-loader-xxx 1/1 Running 0 1m
ステップ 4:AHPA ポリシーの作成
AHPA ポリシーは、AdvancedHorizontalPodAutoscaler という種類のカスタムリソースです。以下に示す例では、observer モードで開始します。このモードでは、AHPA が予測を生成しますが、実際にスケーリングは実行しません。自動スケーリングを有効化する前に、予測の妥当性を検証する際にこのモードを使用します。
以下の内容で
ahpa-demo.yamlというファイルを作成します。apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: AdvancedHorizontalPodAutoscaler metadata: name: ahpa-demo spec: scaleTargetRef: # 必須。管理対象の Deployment。 apiVersion: apps/v1 kind: Deployment name: fib-deployment metrics: # 必須。スケーリング判断の根拠となるメトリック。 - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 40 # 必須。平均 CPU 使用率が 40 % を超えるとスケーリングを実行。 maxReplicas: 100 # 必須。ポッド数の上限(ハード制限)。 minReplicas: 2 # 必須。ポッド数の下限(ハード制限)。 scaleStrategy: observer # 任意。デフォルト:observer。 # auto:AHPA が自動的にスケーリングを実行。 # observer:スケーリングを実行せず、予測のみを観測。 # scalingUpOnly:スケールアウトのみ実行し、スケールインは実行しない。 # proactive:能動的予測のみ実行。 # reactive:受動的予測のみ実行。 stabilizationWindowSeconds: 300 # 任意。デフォルト:300 秒。スケールインのクールダウン期間。 prediction: quantile: 95 # 必須。デフォルト:0.99。範囲:0–1(小数点以下 2 桁)。 # 値が大きいほど保守的(誤ったスケールアウトが少なくなる)。 # 推奨範囲:0.90–0.99。 scaleUpForward: 180 # 必須。ポッドのコールドスタート所要時間(秒)。 # (ポッド作成から Ready 状態になるまでの時間)。 instanceBounds: # 任意。スケジュール済みのレプリカ制限。 - startTime: "2021-12-16 00:00:00" endTime: "2031-12-16 00:00:00" bounds: - cron: "* 0-8 ? * MON-FRI" # 月~金、00:00–08:59 maxReplicas: 15 minReplicas: 4 - cron: "* 9-15 ? * MON-FRI" # 月~金、09:00–15:59 maxReplicas: 15 minReplicas: 10 - cron: "* 16-23 ? * MON-FRI" # 月~金、16:00–23:59 maxReplicas: 20 minReplicas: 15以下の表に、主なパラメーターを示します。
パラメーター 必須 デフォルト 説明 scaleTargetRefはい — 管理対象の Deployment metricsはい — スケーリングを駆動するメトリック。サポート対象:CPU、GPU、メモリ、クエリ/秒(QPS)、応答時間(RT) averageUtilizationはい — スケーリングしきい値。 averageUtilization: 40は、平均 CPU 使用率が 40 % を超えると AHPA がスケーリングを実行することを意味します。maxReplicasはい — 最大ポッド数 minReplicasはい — 最小ポッド数 scaleStrategyいいえ observerスケーリングモード stabilizationWindowSecondsいいえ 300スケールインのクールダウン期間(秒) prediction.quantileはい 0.99予測されたメトリックがスケーリングしきい値を超えない確率のしきい値。範囲:0–1。推奨値:0.90–0.99 prediction.scaleUpForwardはい — ポッドのコールドスタート所要時間:ポッド作成から Ready 状態になるまでの時間(秒) instanceBoundsいいえ — スケジュール済みの maxReplicasおよびminReplicasのオーバーライドを指定するタイムウィンドウinstanceBounds.bounds.cronいいえ — レプリカ制限ウィンドウの Cron スケジュール instanceBounds.bounds.cron内の Cron 式は、スペースで区切られた 5 フィールド形式(Quartz 互換)を使用します。各フィールドは以下のとおりです。フィールド 必須 有効値 特殊文字 分 はい 0–59 */,-時 はい 0–23 */,-日 はい 1–31 */,-?月 はい 1–12 または JAN–DEC */,-曜日 いいえ 0–6 または SUN–SAT(デフォルト: *)*/,-?特殊文字の意味:
*— 任意の値/— 増分(例:*/5は「5 単位ごと」を意味),— リストの区切り文字-— 範囲?— プレースホルダー(「日(月)」または「曜日」のいずれか一方が指定されている場合に、他方のフィールドで使用)
「月」および「曜日」フィールドは大文字小文字を区別しません。たとえば、
SUN、Sun、sunはすべて有効です。詳細については、「Cron 式」をご参照ください。
AHPA ポリシーを適用します。
kubectl apply -f ahpa-demo.yaml
ステップ 5:予測結果の確認
AHPA は過去 7 日間の履歴データに基づいて予測を構築します。予測精度を評価するには、ポリシー適用後少なくとも 7 日間待つ必要があります。既存のアプリケーションの場合は、AHPA ダッシュボードで該当する Deployment を選択してください。
AHPA ダッシュボードを開く
[統合管理] ページで、[コンテナサービス] タブで、クラスターの名前をクリックします。[アドオンタイプ] セクションで、[ACK AHPA] を選択します。[ダッシュボード] タブをクリックし、その後 [ahpa-dashboard] をクリックします。
ダッシュボードチャートの読み取り
ダッシュボードには 3 つのチャートが表示されます。
[CPU 使用率 & 実際の POD 数] — Deployment の平均 CPU 使用率と現在のポッド数を表示します。fib-loader が想定通りの CPU 負荷を生成しているかを確認するために使用します。
[実際の CPU 使用量と予測 CPU 使用量] — 実際の CPU 使用量(緑色の線、HPA によって駆動)と AHPA の予測 CPU 使用量(黄色の線)を比較します。黄色の線が緑色の線より高い位置にある場合、AHPA が十分な余裕容量を確保していることを意味します。また、黄色の線が緑色の線より早く上昇する場合、AHPA が実際の需要増加に先立ってリソースを準備していることを意味します。
[ポッド数の傾向] — 以下の 3 つのポッド数系列を表示します。
| 系列 | 説明 |
|---|---|
| 現在のポッド数 | 現在実行中の Pods |
| 推奨ポッド数 | AHPA が推奨するポッド数。能動的予測、受動的予測、および現在のタイムウィンドウ内の最大・最小ポッド数に基づいて生成されます。 |
| 能動的に予測されたポッド数 | AHPA が過去のパターンに基づいて予測したポッド数 |
サンプル結果の解釈
本サンプルでは、scaleStrategy が observer に設定されているため、AHPA は予測を生成しますが、実際にスケーリングは実行しません。以下の図は、AHPA の予測と HPA ベースラインを比較したものです。

図から得られる主な知見は以下のとおりです。
[実際の CPU 使用量と予測 CPU 使用量]: 予測 CPU 使用量(黄色)は実際の使用量(緑色)よりも一貫して高く、AHPA が保守的なキャパシティ設計を行っていることが確認できます。また、黄色の線が緑色の線より先に上昇しており、需要到来前にリソースが準備されていることも確認できます。
[ポッド数の傾向]: 予測ポッド数(黄色)は HPA が提供するポッド数(緑色)より低く、かつ黄色の曲線は滑らかです。これは、AHPA の推奨により急激なスケーリングイベントが減少し、ワークロードの安定性が向上することを意味します。
AHPA の主要メトリック
| メトリック | 説明 |
|---|---|
ahpa_proactive_pods | 能動的に予測されたポッド数 |
ahpa_reactive_pods | リアクティブに予測された Pod 数 |
ahpa_requested_pods | 推奨ポッド数 |
ahpa_max_pods | 最大ポッド数 |
ahpa_min_pods | 最小ポッド数 |
ahpa_target_metric | スケーリングしきい値 |
自動スケーリングの有効化
予測結果が期待通りであることを確認した後、scaleStrategy を auto に設定し、ahpa-demo.yaml を再適用します。
kubectl apply -f ahpa-demo.yamlAHPA はその後、自身の予測に基づいて fib-deployment を自動的にスケーリングします。