Effectuez la mise à l'échelle des pods en vous basant sur des signaux de trafic réels plutôt que sur la seule utilisation du processeur. Pour ce faire, connectez 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éploiement d'une application Nginx, exposition via un Ingress, puis configuration du HPA pour une mise à l'échelle fondée sur le nombre de requêtes par seconde (QPS) et 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 du 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, y compris 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 s'interrompt.
Connectez-vous à la console Container Service Management. Dans le volet de navigation, 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.
Renseignez 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 Manage Ingress.
Étape 4 : Configurer le HPA
Le HPA prend en charge deux métriques Ingress SLS aux sémantiques de mise à l'échelle distinctes :
| Metric | Target type | Scaling behavior |
|---|---|---|
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 :Parameter Required Description sls.ingress.routeOui Format : <namespace>-<svc>-<port>. Exemple :default-nginx-80sls.logstoreOui Le Logstore dans Simple Log Service. Valeur par défaut : nginx-ingresssls.projectOui Le Project dans Simple Log Service. Valeur par défaut : k8s-log-<cluster-id>sls.internal.endpointNon Indique si l'accès à SLS s'effectue via le réseau interne. Valeur par défaut : true. Définissez cette 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 montée en charge :
# Send 10 concurrent requests for 300 seconds
ab -t 300 -c 10 <domain-name-configured-for-the-ingress>
Surveillez les statuts du HPA en temps réel :
kubectl get hpa ingress-hpa --watch
Voici un exemple de sortie attendu lorsque la montée en charge 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 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
kubectl describe hpa <hpa-name>et vérifiez le champConditions:Si
AbleToScalea la valeurFalse: vérifiez que le Deployment est sain.Si
ScalingActivea la valeurFalse: passez à l'étape suivante.
-
Exécutez la commande suivante pour vérifier la disponibilité de l'API External Metrics :
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 Collect and analyze Nginx Ingress access logs. -
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 Project 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 qu'il n'y a aucune donnée pour la métrique. Cela indique généralement que 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 Alibaba Cloud HPA Metrics. Métriques Ingress SLS courantes :
| Metric | Description | Required parameter |
|---|---|---|
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 personnalisation du 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 Collect container logs using a DaemonSet and a 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 Collect and analyze Nginx Ingress access logs.