Le déploiement de plusieurs instances améliore la stabilité des applications, mais peut laisser des ressources inutilisées et augmenter les coûts du cluster. La mise à l’échelle manuelle est fastidieuse et lente à réagir. Utilisez Nginx Ingress pour appliquer l’Auto Scaling horizontal des pods (HPA) à plusieurs applications : ajustez dynamiquement le nombre de réplicas de pod en fonction de la charge afin de maintenir la stabilité et la réactivité tout en optimisant l’utilisation des ressources et les coûts. Cette rubrique explique comment mettre en œuvre un HPA multi-applications avec Nginx Ingress.
Prérequis
Assurez-vous que :
Alibaba Cloud Prometheus est déployé dans votre cluster.
-
Le module complémentaire ack-alibaba-cloud-metrics-adapter est déployé avec
prometheus.urlconfiguré. -
Apache Benchmark (
ab) est installé.
Fonctionnement
Un Ingress transfère les requêtes externes vers un Service, qui les achemine vers le pod correspondant. Le contrôleur d’entrée NGINX enregistre le nombre de requêtes par service dans la métrique Prometheus nginx_ingress_controller_requests.
Le HPA ne peut pas consommer directement les métriques Prometheus ; il nécessite des métriques exposées via l’API de métriques externes de Kubernetes. L’adaptateur ack-alibaba-cloud-metrics-adapter comble cette lacune en traitant nginx_ingress_controller_requests en quatre étapes :
|
Étape |
Champ |
Rôle |
Valeur utilisée ici |
|
1. Découverte |
|
Identifie la métrique Prometheus à exposer |
|
|
2. Association |
|
Spécifie si cette métrique est limitée à un namespace |
|
|
3. Nomination |
|
Renomme la métrique dans l’API externe |
Supprime |
|
4. Interrogation |
|
Définit le modèle PromQL utilisé pour calculer la valeur |
|
L’adaptateur remplit ces variables de modèle metricsQuery au moment de la requête :
<<.Series>>— remplacé par le nom de la série Prometheus correspondante (nginx_ingress_controller_requests)<<.LabelMatchers>>— remplacé par les sélecteurs d’étiquettes issus de la spécification HPA (par exemple,service="sample-app")
Chaque HPA utilise selector.matchLabels.service pour filtrer cette métrique sur une seule application, garantissant ainsi que la mise à l’échelle de sample-app et de test-app reste indépendante.
Étape 1 : Créer les applications et les services
Créez deux déploiements et leurs services correspondants.
-
Créez
nginx1.yamlavec le contenu suivant :Appliquez le manifeste :
kubectl apply -f nginx1.yaml -
Créez
nginx2.yamlavec le contenu suivant :Appliquez le manifeste :
kubectl apply -f nginx2.yaml
Étape 2 : Créer un Ingress
-
Créez
ingress.yamlavec le contenu suivant :Champ
Description
hostNom de domaine pour l’accès au service. Défini sur
test.example.comdans cet exemple.pathChemin URL. Les requêtes correspondant à ce chemin sont acheminées vers le service correspondant.
backendNom et port du service cible pour chaque chemin.
/est acheminé verssample-app;/homeest acheminé verstest-app.Appliquez le manifeste :
kubectl apply -f ingress.yaml -
Vérifiez que l’Ingress est en cours d’exécution :
kubectl get ingress -o wideSortie attendue :
NAME CLASS HOSTS ADDRESS PORTS AGE test-ingress nginx test.example.com 10.XX.XX.10 80 55sLe contrôleur d’entrée NGINX achemine
test.example.com/verssample-appettest.example.com/homeverstest-app. Les deux flux de requêtes sont enregistrés dans la métrique Prometheusnginx_ingress_controller_requests, étiquetés par nom de service.
Étape 3 : Convertir les métriques Prometheus en métriques compatibles avec le HPA
Le HPA lit les métriques à partir de l’API de métriques externes de Kubernetes, et non directement depuis Prometheus. L’adaptateur ack-alibaba-cloud-metrics-adapter traduit les métriques Prometheus dans ce format via des règles définies dans la ConfigMap adapter-config.
Modifier le fichier adapter-config
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, localisez le cluster souhaité et cliquez sur son nom. Dans le volet de gauche, choisissez Applications > Helm.
Sur la page Helm, cliquez sur ack-alibaba-cloud-metrics-adapter. Dans la section Resource, cliquez sur adapter-config, puis cliquez sur Edit YAML file dans le coin supérieur droit.
-
Remplacez les règles existantes par les suivantes, puis cliquez sur OK :
Toutes les options de configuration de l’adaptateur sont documentées dans Autoscaling horizontal des pods basé sur les métriques Alibaba Cloud Prometheus .
rules: - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) name: as: ${1}_per_second matches: ^(.*)_requests resources: namespaced: false seriesQuery: nginx_ingress_controller_requests
Vérifier la disponibilité de la métrique
Confirmez que l’adaptateur sert la métrique convertie :
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_per_second" | jq .
Sortie attendue :
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "nginx_ingress_controller_per_second",
"metricLabels": {},
"timestamp": "2025-07-25T07:56:04Z",
"value": "0"
}
]
}
Une value de "0" est normale : il n’y a pas encore de trafic.
Étape 4 : Créer les HPA
Les deux HPA utilisent la même métrique externe nginx_ingress_controller_per_second mais la filtrent pour leur service respectif en utilisant selector.matchLabels.service. L’adaptateur transmet ces étiquettes en tant que <<.LabelMatchers>> dans la requête PromQL, garantissant ainsi l’indépendance des décisions de mise à l’échelle pour chaque application.
-
Créez
hpa.yamlavec le contenu suivant :Appliquez le manifeste :
kubectl apply -f hpa.yaml -
Vérifiez que les deux HPA sont prêts :
kubectl get hpaSortie attendue :
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 0/30 (avg) 1 10 1 74s test-hpa Deployment/test-app 0/30 (avg) 1 10 1 59mLes deux HPA affichent
0/30 (avg), ce qui signifie que le taux de requêtes actuel est inférieur au seuil de mise à l’échelle horizontale de 30 requêtes par seconde par pod.
Étape 5 : Vérifier l’autoscaling
Utilisez Apache Benchmark pour générer du trafic et observer la réponse indépendante de chaque HPA.
-
Envoyez 5 000 requêtes vers le chemin
/home(acheminé verstest-app) :ab -c 50 -n 5000 test.example.com/home -
Surveillez l’état du HPA en temps réel :
kubectl get hpa --watchAprès la charge,
test-hpaeffectue une mise à l’échelle horizontale tandis quesample-hpareste à un seul réplica :NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 0/30 (avg) 1 10 1 22m test-hpa Deployment/test-app 22096m/30 (avg) 1 10 3 80mAppuyez sur Ctrl+C pour arrêter la surveillance.
-
Envoyez 5 000 requêtes vers le chemin racine (acheminé vers
sample-app) :ab -c 50 -n 5000 test.example.com/ -
Vérifiez à nouveau l’état du HPA :
kubectl get hpaSortie attendue :
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 27778m/30 (avg) 1 10 2 38m test-hpa Deployment/test-app 0/30 (avg) 1 10 1 96msample-hpaa effectué une mise à l’échelle horizontale sous la charge, tandis quetest-hpaa réduit ses ressources après l’arrêt du trafic vers/home. Chaque application a été mise à l’échelle indépendamment en fonction de son propre trafic.
Étapes suivantes
Mise à l’échelle multi-zones : Mettre à l’échelle simultanément sur plusieurs zones pour les services à forte intensité de données et haute disponibilité.
Images OS personnalisées pour la mise à l’échelle élastique : Simplifiez l’autoscaling dans les environnements ayant des exigences spécifiques en matière de nœuds en utilisant des images personnalisées.