Container Service for Kubernetes は Advanced Horizontal Pod Autoscaler (AHPA) をサポートしています。AHPA は履歴データを学習・分析して将来のリソース需要を予測し、Pod のレプリカ数を動的に調整します。これにより、需要のピーク前にリソースがスケールアウトおよびプリフェッチされ、システムの応答速度と安定性が向上します。トラフィックが少ない期間が予測される場合、AHPA は適切なタイミングでリソースをスケールインしてコストを削減します。
前提条件
ACK マネージドクラスターまたはACK サーバーレスクラスターを作成済みであること。詳細については、「ACK マネージドクラスターの作成」または「クラスターの作成」をご参照ください。
Managed Service for Prometheus を有効化済みであること。Managed Service for Prometheus が、CPU やメモリ使用量など、少なくとも 7 日間のアプリケーション履歴データを収集していることを確認してください。Managed Service for Prometheus を有効にする方法の詳細については、「Managed Service for Prometheus への接続と設定」をご参照ください。
ステップ 1:AHPA Controller のインストール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、管理対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、アドオン管理 をクリックします。
[コンポーネント管理] ページで、[AHPA Controller] コンポーネントを見つけ、そのカード上の [インストール] をクリックし、画面の指示に従ってインストールを完了します。
ステップ 2:Prometheus データソースの設定
ARMS コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
[インスタンス] ページの上部で、Prometheus インスタンスのリージョンを選択し、対象インスタンスの名前をクリックします。インスタンス名は ACK クラスター名と同じです。
[設定] ページの [HTTP API URL (Grafana Read URL)] セクションで、次の設定項目の値を記録します。
(任意) トークンが有効になっている場合は、アクセストークンを記録します。
[内部ネットワーク] エンドポイント (Prometheus URL) を記録してください。
ACK クラスターで Prometheus クエリエンドポイントを設定します。
次の内容で `application-intelligence.yaml` という名前のファイルを作成します。
prometheusUrl:Managed Service for Prometheus のエンドポイント。token:Prometheus のアクセストークン。
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"説明Managed Service for Prometheus で AHPA ダッシュボードを表示するには、この ConfigMap で次のフィールドも設定する必要があります:
詳細については、「AHPA の Prometheus ダッシュボードの有効化」をご参照ください。
次のコマンドを実行して、`application-intelligence` 構成をデプロイします。
kubectl apply -f application-intelligence.yaml
ステップ 3:テストサービスのデプロイ
テストサービスには、リクエストのピークと谷をシミュレートする `fib-deployment`、`fib-svc`、`fib-loader` が含まれます。また、Horizontal Pod Autoscaler (HPA) リソースもデプロイされ、そのスケーリング結果を AHPA の結果と比較します。
次の内容で `demo.yaml` という名前のファイルを作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: fib-deployment
namespace: default
annotations:
k8s.aliyun.com/eci-use-specs: "1-2Gi"
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
---ステップ 4:AHPA のデプロイ
`AdvancedHorizontalPodAutoscaler` リソースを送信して、弾性ポリシーを設定します。
次の内容で `ahpa-demo.yaml` という名前のファイルを作成します。
apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: AdvancedHorizontalPodAutoscaler metadata: name: ahpa-demo spec: scaleStrategy: observer metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 40 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: fib-deployment maxReplicas: 100 minReplicas: 2 stabilizationWindowSeconds: 300 prediction: quantile: 0.95 scaleUpForward: 180 instanceBounds: - startTime: "2021-12-16 00:00:00" endTime: "2031-12-16 00:00:00" bounds: - cron: "* 0-8 ? * MON-FRI" maxReplicas: 15 minReplicas: 4 - cron: "* 9-15 ? * MON-FRI" maxReplicas: 15 minReplicas: 10 - cron: "* 16-23 ? * MON-FRI" maxReplicas: 20 minReplicas: 15以下に一部のパラメーターを説明します:
パラメーター
必須
説明
scaleTargetRef
はい
ターゲットの Deployment を指定します。
metrics
はい
スケーリングメトリックを設定します。サポートされているメトリックには、CPU、GPU、メモリ、QPS、RT があります。
target
はい
ターゲットのしきい値。たとえば、
averageUtilization: 40は、ターゲットの CPU 使用率が 40% であることを示します。scaleStrategy
いいえ
スケーリングモードを設定します。デフォルト値は observer です。
auto:AHPA がスケーリング操作を実行します。
observer:AHPA は観測のみを行い、スケーリング操作は実行しません。このモードを使用して、AHPA が期待どおりに動作するかどうかを確認できます。
proactive:プロアクティブな予測のみが有効になります。
reactive:リアクティブな予測のみが有効になります。
maxReplicas
はい
スケールアウト時のレプリカの最大数。
minReplicas
はい
スケールイン時のレプリカの最小数。
stabilizationWindowSeconds
いいえ
スケールインのクールダウン時間。デフォルト値は 300 秒です。
prediction. quantile
はい
予測分位数。値が大きいほど、より保守的な予測となり、実際のメトリック値がターゲット値を下回る確率が高くなります。値は 0 から 1 の間で、小数点以下 2 桁までサポートされます。デフォルト値は 0.99 です。0.90 から 0.99 の値が推奨されます。
prediction. scaleUpForward
はい
Pod が Ready 状態になるまでに必要な時間 (コールドスタート時間)。
instanceBounds
いいえ
スケーリング期間中のインスタンス数の範囲。
startTime:開始時刻。
endTime:終了時刻。
instanceBounds. bounds. cron
いいえ
定期タスクを設定します。cron 式は時間のセットを表します。スペースで区切られた 5 つのフィールドを使用します。たとえば、
- cron: "* 0-8 ? * MON-FRI"は、タスクが毎週月曜日から金曜日の 00:00 から 08:59 まで実行されることを示します。次の表に、cron 式のフィールドを示します。詳細については、「定期タスク」をご参照ください。
フィールド名
必須
有効値
使用可能な特殊文字
分
はい
0~59
* / , -
時
はい
0~23
* / , -
日
はい
1~31
* / , – ?
月
はい
1~12 または JAN~DEC
* / , -
曜日
いいえ
0~6 または SUN~SAT
* / , – ?
説明月と曜日のフィールドの値では、大文字と小文字は区別されません。たとえば、
SUN、Sun、sunは同じ効果を持ちます。曜日のフィールドが設定されていない場合、デフォルト値は
*です。特殊文字:
*:すべての有効な値を示します。/:数値の増分を指定します。,:列挙値をリストします。-:範囲を示します。?:特定の値が指定されていないことを示します。
次のコマンドを実行して、AHPA 弾性ポリシーを作成します。
kubectl apply -f ahpa-demo.yaml
ステップ 5:予測結果の表示
AHPA の弾性予測結果を表示するには、「AHPA の Prometheus ダッシュボードの有効化」をご参照ください。
予測には 7 日間の履歴データが必要なため、サンプルデプロイメントが少なくとも 7 日間実行された後にのみ予測結果を表示できます。既存のオンラインアプリケーションがある場合は、AHPA 構成で直接指定できます。
このトピックでは、observer モードを例として使用します。このモードでは、結果が HPA ポリシーと比較されます。この比較は、アプリケーションが必要とする実際のリソースの参考となり、AHPA の予測結果が期待を満たしているかどうかを確認するのに役立ちます。

実際の CPU 使用率と予測された CPU 使用率:緑色の曲線は HPA での実際の CPU 使用率を表します。黄色の曲線は AHPA によって予測された CPU 使用率を表します。
黄色の曲線が緑色の曲線を上回っており、予測された CPU 容量が十分であることを示しています。
黄色の曲線が緑色の曲線より先行しており、必要なリソースが事前に準備されていることを示しています。
Pod の傾向:緑色の曲線は HPA によってスケーリングされた実際の Pod 数を表します。黄色の曲線は AHPA によって予測された Pod 数を表します。
黄色の曲線が緑色の曲線を下回っており、AHPA がより少ない Pod 数を予測していることを示しています。
黄色の曲線が緑色の曲線よりも滑らかであり、AHPA によるスケーリングが変動を少なくし、サービスの安定性を向上させることを示しています。
予測の傾向は期待どおりです。一定期間の観測の後、結果が期待どおりであれば、スケーリングモードを auto に設定して AHPA にスケーリングを管理させることができます。
関連ドキュメント
Managed Service for Prometheus を使用して GPU メトリックをモニターし、GPU メトリックに基づいて AHPA で予測スケーリングを実装する方法については、「AHPA を使用した GPU メトリックに基づく予測スケーリングの実行」をご参照ください。
Managed Service for Prometheus が提供するダッシュボードを表示する方法については、「AHPA の Prometheus ダッシュボードの有効化」をご参照ください。