Mettez à l'échelle les pods en vous basant sur des signaux de trafic réels, et non uniquement sur l'utilisation du processeur, en connectant les métriques Ingress de Simple Log Service (SLS) à la mise à l'échelle horizontale des pods Kubernetes (HPA) via l'API External Metrics. Ce guide présente un exemple complet : déployez une application Nginx, exposez-la via un Ingress, puis configurez le HPA pour qu'il s'adapte en fonction du nombre de requêtes par seconde (QPS) et de la latence au 99,99e centile.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster ACK avec kubectl configuré
Un contrôleur Ingress avec la collecte de journaux SLS activée (activée par défaut lors de la création d'un cluster)
Les permissions nécessaires pour installer des charts Helm et créer des ressources HPA
Fonctionnement
Le composant ack-alibaba-cloud-metrics-adapter fait le lien entre les services de surveillance Alibaba Cloud et l'API External Metrics de Kubernetes. Une fois installé, le HPA peut interroger les métriques Ingress SLS, telles que sls_ingress_qps et sls_ingress_latency_p9999, et ajuster le nombre de réplicas de votre Deployment en conséquence.
Étape 1 : Installer ack-alibaba-cloud-metrics-adapter
Le composant ack-alibaba-cloud-metrics-adapter permet à Kubernetes de récupérer les données de surveillance des services Alibaba Cloud, notamment ECS, SLB et RDS, via l'API External Metrics.
Ce composant ne prend pas en charge les mises à niveau sur place. Pour effectuer une mise à niveau, désinstallez d'abord la version actuelle, puis installez la dernière version. Pendant la désinstallation et la réinstallation, les HPA associés suspendent la mise à l'échelle, car la récupération des données de surveillance est interrompue.
Connectez-vous à la Console de gestion Container Service. 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 Applications > Helm.
Sur la page Helm, cliquez sur Create. Renseignez la configuration des Basic Information, sélectionnez ack-alibaba-cloud-metrics-adapter, puis cliquez sur Next.
Sur la page Parameter Settings, sélectionnez une Chart Version et cliquez sur OK.
Étape 3 : Créer un Ingress
Dans le volet de navigation de gauche de la page de gestion du cluster, choisissez Network > Ingress. Sur la page Ingress, cliquez sur Create Ingress.
Remplissez les champs obligatoires et cliquez sur OK. La console vous redirige vers la page Ingress.
Dans la colonne Name, cliquez sur le nom de l'Ingress pour afficher ses règles de routage. Pour plus de détails, consultez la rubrique Gérer Ingress.
Étape 4 : Configurer le HPA
Le HPA prend en charge deux métriques Ingress SLS aux sémantiques de mise à l'échelle différentes :
| Métrique | Type de cible | Comportement de mise à l'échelle |
|---|---|---|
sls_ingress_qps |
AverageValue |
Le QPS est divisé par le nombre actuel de pods avant comparaison |
sls_ingress_latency_p9999 |
Value |
La valeur brute de latence est comparée directement |
-
Créez le fichier
ingress-hpa.yamlavec le contenu suivant :Paramètre Obligatoire Description sls.ingress.routeOui Format : <namespace>-<svc>-<port>. Exemple :default-nginx-80sls.logstoreOui Le Logstore dans Simple Log Service. Par défaut : nginx-ingresssls.projectOui Le Project dans Simple Log Service. Par défaut : k8s-log-<cluster-id>sls.internal.endpointNon Indique si l'accès à SLS se fait via le réseau interne. Par défaut : true. Définissez la valeur surfalsepour utiliser le réseau public.apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: ingress-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment-basic minReplicas: 2 maxReplicas: 10 metrics: - type: External external: metric: name: sls_ingress_qps selector: matchLabels: sls.project: "<your-sls-project>" # Default: k8s-log-<cluster-id> sls.logstore: "nginx-ingress" # Default SLS Logstore for Nginx Ingress logs sls.ingress.route: "default-nginx-80" # Format: <namespace>-<svc>-<port> target: type: AverageValue averageValue: 10 # Scale up when average QPS per pod exceeds 10 - type: External external: metric: name: sls_ingress_latency_p9999 selector: matchLabels: sls.project: "<your-sls-project>" sls.logstore: "nginx-ingress" sls.ingress.route: "default-nginx-80" # sls.internal.endpoint: "true" # true = internal network (default); false = public network target: type: Value value: 10 # Scale up when 99.99th-percentile latency exceeds 10 msLe tableau suivant décrit les paramètres utilisés dans la configuration du HPA.
-
Appliquez la configuration :
kubectl apply -f ingress-hpa.yaml
Vérifier la mise à l'échelle
Exécutez un test de charge de 5 minutes sur le domaine de votre Ingress pour déclencher la mise à l'échelle ascendante :
# Send 10 concurrent requests for 300 seconds
ab -t 300 -c 10 <domain-name-configured-for-the-ingress>
Surveillez l'état du HPA en temps réel :
kubectl get hpa ingress-hpa --watch
Sortie attendue lorsque la mise à l'échelle ascendante réussit (REPLICAS atteint MAXPODS) :
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
ingress-hpa Deployment/nginx-deployment-basic 21/10 (avg) 2 10 10 7m49s
Lorsque le trafic retombe sous le seuil, la valeur de REPLICAS revient au minimum.
Dépannage
Commencez le dépannage en exécutant la commande kubectl describe hpa ingress-hpa et en vérifiant le champ Conditions . Utilisez les colonnes Type et Status pour identifier le problème, puis suivez les étapes ci-dessous.
La colonne target affiche unknown
-
Exécutez la commande
kubectl describe hpa <hpa-name>et vérifiez le champConditions:Si
AbleToScaleest défini surFalse: vérifiez que le Deployment est sain.Si
ScalingActiveest défini surFalse: passez à l'étape suivante.
-
Exécutez la commande suivante pour vérifier si l'API External Metrics est disponible :
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/"Si la réponse est
Error from server (NotFound), vérifiez l'état de démarrage dealibaba-cloud-metrics-adapter. Si l'adaptateur fonctionne normalement et que les métriques HPA sont liées à Ingress, déployez d'abord le composant SLS. Pour plus de détails, consultez la rubrique Collecter et analyser les journaux d'accès Nginx Ingress. -
Vérifiez le format de
sls.ingress.route. La valeur doit être<namespace>-<svc>-<port>, où :namespace: le namespace où réside l'Ingresssvc: le nom du Service associé à l'Ingressport: le nom du port de ce Service
Échec du téléchargement de l'image ack-alibaba-cloud-metrics-adapter (version 1.3.7)
Lors de la mise à niveau vers la version 1.3.7, le message d'erreur suivant peut s'afficher :
Failed to pull image "registry-<region-id>-vpc.ack.aliyuncs.com/acs/alibaba-cloud-metrics-adapter-amd64:v0.2.9-ba634de-aliyun".
Ce problème survient car le composant ne prend pas en charge les mises à jour directes. Pour le résoudre :
Sauvegardez la configuration actuelle du composant.
Désinstallez l'ancienne version.
Installez la dernière version en utilisant la configuration sauvegardée.
FAQ
Comment interroger sls_ingress_qps depuis la ligne de commande ?
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingress"
Remplacez {{SLS_Project}} par le nom de votre projet SLS. Si vous n'avez pas défini de nom personnalisé lors de la création du cluster, la valeur par défaut est k8s-log-{{ClusterId}}.
Une réponse réussie renvoie une liste ExternalMetricValueList avec le QPS actuel dans le champ value. Si vous obtenez une erreur ParameterInvalid, cela signifie que la métrique ne contient aucune donnée ; cela indique généralement qu'ALB Ingress n'est pas configuré, mais que sls_alb_ingress_qps a été interrogé au lieu de sls_ingress_qps.
Quelles métriques le HPA prend-il en charge ?
Pour la liste complète, consultez la rubrique Métriques HPA Alibaba Cloud. Métriques Ingress SLS courantes :
| Métrique | Description | Paramètre requis |
|---|---|---|
sls_ingress_qps |
QPS pour la route Ingress spécifiée | sls.ingress.route |
sls_alb_ingress_qps |
QPS pour la route ALB Ingress | sls.ingress.route |
sls_ingress_latency_avg |
Latence moyenne pour toutes les requêtes | sls.ingress.route |
sls_ingress_latency_p50 |
Latence au 50e centile | sls.ingress.route |
sls_ingress_latency_p95 |
Latence au 95e centile | sls.ingress.route |
sls_ingress_latency_p99 |
Latence au 99e centile | sls.ingress.route |
sls_ingress_latency_p9999 |
Latence au 99,99e centile | sls.ingress.route |
sls_ingress_inflow |
Bande passante entrante pour Ingress | sls.ingress.route |
Comment adapter le HPA après avoir personnalisé le format des journaux Nginx Ingress ?
La collecte des journaux SLS s'appuie sur la définition de ressource personnalisée (CRD) AliyunLogConfig déployée lors de la première activation de SLS. Cette CRD est optimisée pour le format de journal par défaut du contrôleur Ingress ACK. Si vous avez modifié le format des journaux d'accès du contrôleur Ingress, mettez à jour la section processor_regex dans la configuration de la CRD pour qu'elle corresponde à votre format personnalisé. Pour plus de détails, consultez la rubrique Collecter les journaux de conteneurs à l'aide d'un DaemonSet et d'une CRD.
Si SLS était désactivé lors de la création du cluster et que vous avez besoin des métriques Ingress pour le HPA, réactivez ou configurez d'abord SLS. Pour plus de détails, consultez la rubrique Collecter et analyser les journaux d'accès Nginx Ingress.