HPA prend en charge nativement le processeur et la mémoire, ce qui peut ne pas couvrir des scénarios plus complexes. Cette rubrique explique comment convertir les Custom Metrics et les External Metrics de Managed Service for Prometheus en métriques compatibles avec HPA, et configurer la mise à l'échelle automatique pour un scale-out et un scale-in plus flexibles.
Fonctionnement
Les données transitent par trois couches :
Prometheus Service collecte les métriques de vos charges de travail et de votre infrastructure.
ack-alibaba-cloud-metrics-adapter lit les métriques Prometheus, les transforme selon des règles configurables et les expose via l'API Kubernetes Custom Metrics (
custom.metrics.k8s.io) ou l'API External Metrics (external.metrics.k8s.io).HPA interroge périodiquement l'adaptateur et ajuste le nombre de réplicas de la charge de travail cible.
Deux types de métriques sont disponibles :
Custom Metric : une métrique associée à un objet Kubernetes, tel qu'un pod. Utilisez-la pour la mise à l'échelle par pod (par exemple, l'ensemble de travail mémoire ou le taux de requêtes).
External Metric : une métrique non liée à un objet Kubernetes. Utilisez-la pour la mise à l'échelle globale, comme le nombre total de requêtes par seconde (QPS) sur tous les pods.
Lorsque cela est possible, privilégiez les Custom Metrics aux External Metrics. L'API Custom Metrics est plus facile à sécuriser pour les administrateurs ; l'API External Metrics peut exposer n'importe quelle métrique Prometheus.
Prérequis
Un composant de surveillance Prometheus est déployé. Consultez Se connecter et configurer Prometheus Service.
Le module complémentaire ack-alibaba-cloud-metrics-adapter est déployé. Consultez Installer ack-alibaba-cloud-metrics-adapter.
Le module complémentaire ack-arms-prometheus est mis à jour vers la dernière version. Pour effectuer la mise à jour, accédez à Components and Add-ons dans la console ACK. Consultez Mises à jour des composants et notes de version.
Pour déployer ack-alibaba-cloud-metrics-adapter, connectez-vous à la console ACK et accédez à Marketplace > Marketplace .
Étape 1 : Obtenir les données de surveillance Prometheus
Option A : Utiliser les métriques ACK intégrées
Prometheus Service est installé par défaut dans ACK et collecte des métriques, notamment :
Les métriques de conteneurs cAdvisor
Les métriques d'infrastructure Node Exporter
Les métriques GPU Exporter
Toutes les métriques supplémentaires que vous avez connectées à Prometheus Service
Pour afficher toutes les métriques connectées :
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, choisissez Operations > Prometheus Monitoring.
Dans le coin supérieur droit, cliquez sur Alert Settings . Si le lien n'apparaît pas, mettez à jour Managed Service for Prometheus vers la dernière version. Consultez Prérequis.
Dans la console Prometheus Service, cliquez sur Settings dans le volet de navigation de gauche pour afficher toutes les métriques connectées.
Option B : Exposer des métriques personnalisées depuis un pod
Si votre application expose des métriques au format Prometheus, récupérez-les à l'aide d'un ServiceMonitor. Cet exemple déploie une application exemple qui expose http_requests_total et configure la collecte.
Déployer l'application exemple
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur Workloads > Deployments.
-
Sur la page Deployments, cliquez sur Create from YAML. Sur la page Create from YAML, définissez Sample Template sur Custom, collez le code YAML suivant, puis cliquez sur Create.
Ajouter un ServiceMonitor
Connectez-vous à la console Application Real-Time Monitoring Service (ARMS).
Dans le volet de navigation de gauche, cliquez sur Integration Management. Sur la page Integration Management, sous l'onglet Integrated Environments, sélectionnez votre Region et cliquez sur l'environnement correspondant à votre cluster.
-
Sur la page de l'environnement de conteneur, cliquez sur l'onglet Metric Scraping . Dans le volet de navigation de gauche, cliquez sur Service Monitor , puis cliquez sur Create . Dans le panneau Add ServiceMonitor Configuration, cliquez sur YAML, collez le code YAML suivant et suivez les instructions à l'écran pour créer le ServiceMonitor.
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: annotations: arms.prometheus.io/discovery: 'true' name: sample-app namespace: default spec: endpoints: - interval: 30s port: http path: /metrics namespaceSelector: any: true selector: matchLabels: app: sample-app
Vérifier l'état de la surveillance
Cliquez sur l'onglet Self-Monitoring. Sous l'onglet Targets, vérifiez que
default/sample-app/0(1/1 up)s'affiche. Cela confirme que Prometheus collecte les données de l'application.Dans le tableau de bord Prometheus, interrogez
http_requests_totalpour confirmer que les données circulent.
Étape 2 : Configurer ack-alibaba-cloud-metrics-adapter
L'adaptateur convertit les métriques Prometheus en métriques lisibles par HPA Kubernetes grâce à quatre opérations par règle : découverte, association, nommage et interrogation. Les sections suivantes construisent une règle complète de manière incrémentielle.
Mettre à jour la configuration de l'adaptateur
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur Applications > Helm.
Recherchez ack-alibaba-cloud-metrics-adapter et cliquez sur Update dans la colonne Actions.
-
Dans le panneau Update Release, mettez à jour le YAML avec votre configuration et cliquez sur OK.
Le tableau suivant répertorie les champs clés de l'adaptateur. Pour la référence complète, consultez Référence de configuration de l'adaptateur.
|
Champ |
Description |
|
|
Règles de conversion des métriques. Modifiez-les pour correspondre aux exemples ci-dessus. |
|
|
L'URL de requête Prometheus. Consultez Obtenir l'URL de requête de données Prometheus. |
|
|
En-tête d'authentification. Prometheus V1 (si l'authentification par jeton est activée) : utilisez |
|
|
Définissez sur |
Vérifier le fonctionnement de l'adaptateur
Exécutez ces commandes pour confirmer que l'adaptateur expose les métriques via l'API d'agrégation Kubernetes.
Vérifier les Custom Metrics :
# List all available Custom Metrics
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | jq .
# Query container_memory_working_set_bytes_per_second for pods in kube-system
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_memory_working_set_bytes_per_second" | jq .
# Query container_cpu_usage_core_per_second for pods in kube-system
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_cpu_usage_core_per_second" | jq .
Une réponse réussie se présente comme suit :
{
"kind": "MetricValueList",
"apiVersion": "custom.metrics.k8s.io/v1beta1",
"metadata": {
"selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/%2A/container_cpu_usage_core_per_second"
},
"items": [
{
"describedObject": {
"kind": "Pod",
"namespace": "kube-system",
"name": "ack-cost-exporter-7f44d55c66-cgtz7",
"apiVersion": "/v1"
},
"metricName": "container_cpu_usage_core_per_second",
"timestamp": "2025-12-30T03:30:21Z",
"value": "4m",
"selector": null
}
]
}
La réponse confirme que l'adaptateur a découvert la métrique et l'a associée au bon pod. Le tableau items répertorie une entrée par pod. Le champ value utilise le suffixe m (milli-unités), ce qui signifie que 4m correspond à 0,004 cœur CPU par seconde.
Vérifier les External Metrics :
# List all available External Metrics
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/" | jq .
# Query http_requests_per_second in the default namespace
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/http_requests_per_second" | jq .
Une réponse réussie se présente comme suit :
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "http_requests_per_second",
"metricLabels": {},
"timestamp": "2025-12-30T03:29:40Z",
"value": "328m"
}
]
}
Contrairement aux Custom Metrics, la réponse des External Metrics contient une seule valeur agrégée (et non une valeur par pod), car la métrique n'est pas limitée à un objet Kubernetes spécifique.
Étape 3 : Déployer le HPA
L'adaptateur expose à la fois les Custom Metrics et les External Metrics. Choisissez le type correspondant à votre stratégie de mise à l'échelle.
Custom Metrics
Utilisez les Custom Metrics pour effectuer une mise à l'échelle basée sur des mesures individuelles par pod.
-
Créez le fichier
hpa.yamlavec le contenu suivant.Les métriques de type
Podsne prennent en charge que les ciblesAverageValue. Le HPA divise la valeur totale de la métrique entre tous les pods et la compare àaverageValuepour décider s'il faut procéder à la mise à l'échelle.kind: HorizontalPodAutoscaler apiVersion: autoscaling/v2 metadata: name: sample-app-memory-high spec: scaleTargetRef: # The workload HPA controls. apiVersion: apps/v1 kind: Deployment name: sample-app minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: container_memory_working_set_bytes_per_second target: type: AverageValue averageValue: 1024000m # Target: 1 KB/s average per pod. # The unit is bytes/s. Kubernetes uses 'm' for milli-units: # 1024000m = 1024 bytes = 1 KB. -
Appliquez le HPA.
kubectl apply -f hpa.yaml -
Exécutez un test de charge pour déclencher la mise à l'échelle. Commencez par exposer le service sample-app via une instance Server Load Balancer (SLB).
ab -c 50 -n 2000 http://<EXTERNAL-IP>:8080/ -
Vérifiez l'état du HPA.
kubectl get hpa sample-app-memory-highSortie attendue :
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-app-memory-high Deployment/sample-app 40886272/1024 1 10 1 22sLa colonne
TARGETSaffichecurrent/desired. Lorsque la valeur actuelle dépasse le seuil, le HPA ajoute des pods.
External Metrics
Utilisez les External Metrics pour effectuer une mise à l'échelle basée sur une mesure globale non liée à des pods individuels.
-
Créez le fichier
hpa.yamlavec le contenu suivant.Les métriques de type
Externalprennent en charge les ciblesValueetAverageValue.apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: sample-app spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-app minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metric: name: http_requests_per_second selector: matchLabels: job: "sample-app" target: type: AverageValue averageValue: 500m # Target: 0.5 requests/s average per pod. -
Appliquez le HPA.
kubectl apply -f hpa.yaml -
Exécutez un test de charge (identique à celui de l'onglet Custom Metrics, en utilisant l'
<EXTERNAL-IP>du servicesample-app).ab -c 50 -n 2000 http://<EXTERNAL-IP>:8080/ -
Vérifiez l'état du HPA.
kubectl get hpa sample-appSortie attendue :
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-app Deployment/sample-app 33m/500m 1 10 1 7m
Référence de configuration de l'adaptateur
L'adaptateur convertit une métrique Prometheus en une métrique compatible HPA grâce à quatre champs : seriesQuery, resources, name et metricsQuery. Les sections ci-dessous détaillent la construction d'une règle complète permettant de convertir http_requests_total en http_requests_per_second.
Variables de modèle dans metricsQuery
Le champ metricsQuery est un modèle Go, et non du PromQL brut. L'adaptateur le renseigne avec les valeurs issues de la requête HPA avant d'interroger Prometheus. Les délimiteurs sont << et >> (et non {{ et }}) afin d'éviter les conflits avec la syntaxe PromQL.
|
Variable |
Rempli avec |
|
|
Le nom de la métrique Prometheus issu de |
|
|
Les sélecteurs d'étiquettes issus de la requête HPA, par exemple |
|
|
L'étiquette de ressource Kubernetes utilisée pour regrouper les résultats, par exemple |
Découverte
seriesQuery spécifie la métrique Prometheus à convertir et accepte tout sélecteur PromQL valide, y compris les filtres d'étiquettes.
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
Les filtres d'étiquettes namespace!="" et pod!="" limitent la métrique aux pods disposant des deux étiquettes, condition requise pour l'association des ressources à l'étape suivante.
Pour affiner la correspondance des séries, ajoutez un bloc seriesFilters :
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
seriesFilters:
- isNot: "^container_.*_seconds_total"
seriesFilters accepte deux opérateurs :
is:<regex>: conserve uniquement les séries dont le nom correspond à l'expression régulière.isNot:<regex>: exclut les séries dont le nom correspond à l'expression régulière.
Association
resources.overrides mappe les noms d'étiquettes Prometheus aux ressources de l'API Kubernetes. Cela indique à l'adaptateur quelle étiquette faire correspondre lorsque le HPA demande une métrique pour un pod ou un namespace spécifique.
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
Les clés (namespace, pod) correspondent aux noms d'étiquettes Prometheus. Les valeurs ("namespace", "pod") représentent les types de ressources de l'API Kubernetes, tels que listés par kubectl api-resources -o wide. Chaque clé doit exister en tant qu'étiquette dans vos données Prometheus.
Dénomination
Le champ name convertit le nom de la métrique Prometheus en nom de métrique HPA à l'aide d'une expression régulière. Le nom original de la métrique Prometheus reste inchangé.
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "^(.*)_total"
as: "${1}_per_second"
L'expression matches est une regex qui capture une partie du nom de la métrique Prometheus. Le champ as définit le nom de la métrique HPA, en utilisant ${1} pour faire référence au premier groupe de capture. Ici, http_requests_total devient http_requests_per_second.
Pour les External Metrics, convertissez les lettres majuscules du nom de la métrique Prometheus en minuscules dans le nom de la métrique HPA.
Pour lister tous les noms de métriques HPA disponibles :
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
Interrogation
Le champ metricsQuery définit l'expression PromQL que l'adaptateur envoie à Prometheus après substitution des variables de modèle.
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "^(.*)_total"
as: "${1}_per_second"
metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
Les sélecteurs d'étiquettes dansmetricsQuerysont injectés via<<.LabelMatchers>>au moment de la requête et n'héritent pas des filtres deseriesQuery.
Obtenir l'URL de requête de données Prometheus
Alibaba Cloud Prometheus Service
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, choisissez Operations > Prometheus Monitoring.
Dans le coin supérieur droit, cliquez sur Alert Settings . Si le lien n'apparaît pas, mettez à jour ack-arms-prometheus vers la dernière version. Consultez la section Prérequis.
-
Dans la console Prometheus Service, cliquez sur Settings > Settings pour trouver l'adresse HTTP API Address (Grafana Read URL) . Utilisez l'adresse Internal Network lorsqu'elle est disponible ; sinon, utilisez l'adresse Internet.

-
Configurez l'authentification pour votre version de Prometheus.
-
Prometheus V1 (authentification par jeton désactivée par défaut) : si elle est activée, copiez le jeton depuis la console Prometheus et configurez l'adaptateur.

prometheus: prometheusHeader: - Authorization: {Token} -
Prometheus V2 (authentification AccessKey activée par défaut) : si l'accès sans mot de passe n'est pas activé, encodez en Base64 votre ID AccessKey et votre secret AccessKey.
-
Générez une chaîne encodée en Base64.
Concaténez votre ID AccessKey et votre secret AccessKey sous la forme
AccessKey:AccessSecret, puis encodez en Base64 :echo -n 'accessKey:secretKey' | base64 -
Configurez le composant.
Saisissez la chaîne générée au format
Basic <chaîne encodée>dans le champAuthorizationdeprometheusHeader.... prometheus: prometheusHeader: - Authorization: Basic YWxxxxeQ== ...
-
-
Prometheus open source
Pour un Prometheus auto-géré, exposez son API via un service Kubernetes et définissez l'URL du service dans la configuration de l'adaptateur.
Cet exemple utilise le chart Helm ack-prometheus-operator disponible sur ACK Marketplace. Consultez la section Surveillance Prometheus open source.
-
Déployez ack-prometheus-operator.
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, choisissez Marketplace > Marketplace.
Recherchez ack-prometheus-operator, cliquez sur sa vignette, puis cliquez sur Deploy.
Sélectionnez le Cluster et le Namespace, définissez le Release Name, puis cliquez sur Next. Ajustez les Parameters selon vos besoins et cliquez sur OK.
-
Vérifiez le déploiement.
Exposez l'API Prometheus via un service. Cet exemple utilise le service
ack-prometheus-operator-prometheus.Dans un navigateur, accédez à
ServiceIP:9090. Pour un accès public, exposez le service via une instance SLB.Dans la console Prometheus, cliquez sur Status > Targets pour afficher toutes les tâches de collecte.
Si toutes les tâches affichent un State défini sur UP, la collecte fonctionne correctement. 
Notez le nom du service et l'espace de noms à partir de la colonne Labels. Ici, le service est
ack-prometheus-operator-prometheusdans l'espace de nomsmonitoring.
-
Définissez l'URL Prometheus dans l'adaptateur. Pour un accès interne :
AlibabaCloudMetricsAdapter: prometheus: enabled: true url: http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090Pour un accès public :
AlibabaCloudMetricsAdapter: prometheus: enabled: true url: http://your_domain.com:9090 # Replace with your public IP address or domain.
Pour ajouter une source de données Prometheus, consultez la section Ajouter une source de données Prometheus dans Grafana.
Étapes suivantes
Pour effectuer un scaling basé sur des métriques externes telles que le taux de requêtes HTTP ou le QPS Ingress, consultez la section Autoscaling horizontal des pods basé sur les métriques des composants Alibaba Cloud.
Pour mettre à l'échelle plusieurs applications en utilisant les métriques de trafic Nginx Ingress, consultez la section Mise à l'échelle horizontale de plusieurs applications basée sur les métriques de trafic Nginx Ingress.