Résolvez les problèmes courants liés à HPA et CronHPA, notamment les échecs de récupération des métriques, le surdimensionnement et le comportement des seuils.
Contenu
Pourquoi le champ current des métriques HPA affiche-t-il unknown ?
Pourquoi HPA crée-t-il des pods supplémentaires lors d'une mise à jour progressive ?
Pourquoi HPA ne se met-il pas à l'échelle lorsqu'un seuil est atteint ?
Comment configurer l'intervalle de collecte des métriques HPA
CronHPA est-il compatible avec HPA ? Comment cela fonctionne-t-il ?
Comment empêcher le surdimensionnement HPA dû aux pics de ressources initiaux
HPA peut-il contrôler l'ordre de réduction du nombre de pods ?
Que faire si la colonne target affiche unknown après avoir exécuté kubectl get hpa ?
Mise à l'échelle automatique avec des formats de journal Nginx Ingress personnalisés
Récupération de la métrique sls_ingress_qps à l'aide de la CLI
Comment gérer un VPA installé avec kubectl depuis la console ?
Échec du téléchargement de l'image alibaba-cloud-metrics-adapter
Pourquoi le champ current des métriques HPA affiche-t-il unknown ?
Lorsque le champ HPA current affiche unknown, kube-controller-manager ne peut pas accéder à la source de données des métriques, ce qui entraîne l'échec de la mise à l'échelle HPA.
Name: kubernetes-tutorial-deployment
Namespace: default
Labels: <none>
Annotations: <none>
CreationTimestamp: Mon, 10 Jun 2019 11:46:48 0530
Reference: Deployment/kubernetes-tutorial-deployment
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): <unknown> / 2%
Min replicas: 1
Max replicas: 4
Deployment pods: 1 current / 0 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True SucceededGetScale the HPA controller was able to get the target's current scale
ScalingActive False FailedGetResourceMetric the HPA was unable to compute the replica count: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server is currently unable to handle the request (get pods.metrics.k8s.io)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedGetResourceMetric 3m3s (x1009 over 4h18m) horizontal-pod-autoscaler unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server is currently unable to handle the request (get pods.metrics.k8s.io)
Cause 1 : La source de données des métriques de ressources n'est pas disponible
Exécutez kubectl top pod pour vérifier si des données sont renvoyées. Si aucun pod ne renvoie de données, exécutez kubectl get apiservice pour vérifier l'état de la source de données Resource Metrics. Exemple de sortie :
Si le service API pour v1beta1.metrics.k8s.io n'est pas kube-system/metrics-server, il a peut-être été écrasé par Prometheus Operator. Restaurez-le en déployant ce fichier YAML :
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1beta1.metrics.k8s.io
spec:
service:
name: metrics-server
namespace: kube-system
group: metrics.k8s.io
version: v1beta1
insecureSkipTLSVerify: true
groupPriorityMinimum: 100
versionPriority: 100
Si ce n'est pas le problème, accédez à Operations > Add-ons pour votre cluster et vérifiez que metrics-server est installé.
Cause 2 : Les métriques ne peuvent pas être récupérées lors d'une mise à jour progressive ou d'une montée en puissance
Après la création ou la mise à jour d'un pod, metrics-server a besoin de temps pour collecter les métriques. Attendez environ deux minutes avant de vérifier à nouveau.
Cause 3 : Le champ request n'est pas configuré
Par défaut, HPA utilise actual utilization/request comme valeur d'utilisation. Vérifiez si le champ resource du pod contient le champ request.
Cause 4 : Le nom de la métrique est incorrect
Vérifiez que le nom de la métrique et sa casse sont corrects. Par exemple, écrire cpu sous la forme CPU entraîne l'affichage de unknown dans le champ current.
Dépannage des échecs de mise à l'échelle HPA
Lorsque la récupération des métriques échoue, le champ HPA current affiche unknown et la mise à l'échelle s'arrête. Consultez la section FAQ sur la mise à l'échelle automatique des nœuds pour résoudre le problème.
Pourquoi HPA crée-t-il des pods supplémentaires lors d'une mise à jour progressive ?
Lors d'une mise à jour progressive, controller-manager signale des valeurs nulles pour les pods sans métriques, ce qui peut amener HPA à créer des pods excédentaires (surdimensionnement). Utilisez les configurations suivantes pour éviter cela.
Configuration au niveau du cluster
Mettez à niveau ACK metrics-server vers la dernière version et activez ce paramètre de démarrage.
Cela affecte toutes les charges de travail du cluster.
# Add the following option to the metrics-server startup parameters.
--enable-hpa-rolling-update-skipped=true
Configuration au niveau de la charge de travail
Pour éviter le surdimensionnement d'une charge de travail spécifique, utilisez l'une des méthodes suivantes.
-
Suspendez l'évaluation HPA pendant les mises à jour progressives en ajoutant cette annotation au modèle de pod :
# Add this annotation to spec.template.metadata.annotations of the workload to temporarily pause HPA evaluation during a rolling update. HPARollingUpdateSkipped: "true" -
Définissez une période de préchauffage après le démarrage de l'application en ajoutant cette annotation au modèle de pod :
# Add this annotation to spec.template.metadata.annotations of the workload to skip a set warm-up period. HPAScaleUpDelay: 3m # 3m is an example. Set the period based on your requirements.
Pourquoi HPA ne se met-il pas à l'échelle lorsqu'un seuil est atteint ?
HPA ne se base pas uniquement sur le dépassement d'un seuil CPU ou mémoire pour effectuer une mise à l'échelle. Il vérifie également si une action de mise à l'échelle serait immédiatement inversée, afin d'éviter les oscillations.
Par exemple, avec un seuil de montée en puissance de 80 % et deux pods utilisant chacun 70 % du CPU, HPA n'effectuera pas de réduction, car passer à un seul pod ferait dépasser les 80 % d'utilisation CPU et déclencherait immédiatement une nouvelle montée en puissance.
Comment configurer l'intervalle de collecte des métriques HPA
Pour les versions de metric-server supérieures à v0.2.1-b46d98c-aliyun, définissez le paramètre de démarrage --metric-resolution. Par exemple : --metric-resolution=15s.
CronHPA est-il compatible avec HPA ? Comment cela fonctionne-t-il ?
Oui. Dans ACK, CronHPA définit son scaleTargetRef sur HPA et effectue la mise à l'échelle par son intermédiaire plutôt qu'en ajustant directement le nombre de réplicas d'un Deployment, ce qui évite les conflits entre les deux mécanismes de mise à l'échelle automatique. Consultez la section Activer la collaboration entre CronHPA et HPA.
Comment empêcher le surdimensionnement HPA dû aux pics de ressources initiaux
Les applications développées dans des langages tels que Java peuvent connaître des pics de CPU et de mémoire lors du préchauffage après le démarrage du conteneur, ce qui déclenche des montées en puissance HPA inutiles. Pour éviter cela, mettez à niveau ACK metrics-server vers la version 0.3.9.6 ou ultérieure et ajoutez une annotation à la spécification de votre pod. Consultez la section Mettre à niveau le composant metrics-server avant de mettre à niveau votre cluster vers la version 1.12.
Exemple de Deployment avec l'annotation :
Pourquoi HPA a-t-il effectué une mise à l'échelle alors que la valeur de la métrique était inférieure au seuil dans les journaux d'audit ?
Cause
Horizontal Pod Autoscaler calcule le nombre souhaité de réplicas en fonction du rapport entre les métriques actuelles et souhaitées à l'aide de la formule suivante : desired number of replicas = ceil(current number of replicas × (current metric / desired metric)).
Le nombre de réplicas souhaité dépend du nombre actuel de réplicas, de la métrique actuelle et de la métrique souhaitée. Pour les métriques de ressources, HPA obtient la sous-ressource scale (subResources) de l'objet scaleTargetRef et convertit le Selector issu du statut (status) de l'objet scale en un labelselector pour faire correspondre les pods. Si les pods correspondants n'appartiennent pas tous à l'objet scaleTargetRef, le nombre de réplicas calculé peut être incorrect (par exemple, une montée en puissance alors que la métrique est inférieure au seuil).
Les raisons courantes d'un nombre de pods inexact incluent :
Une mise à jour progressive est en cours.
-
Des pods extérieurs à l'objet scaleTargetRef partagent le même libellé. Vérifiez leur présence :
kubectl get pods -n {namespace_name} -l {value_of_scale_subresource_status.selector}
Solution
Pour les problèmes liés aux mises à jour progressives, consultez la section Pourquoi HPA crée-t-il des pods supplémentaires lors d'une mise à jour progressive ?.
Si d'autres pods partagent les mêmes libellés, localisez-les. S'ils sont encore utilisés, modifiez leurs libellés. S'ils ne sont plus nécessaires, supprimez-les.
HPA peut-il contrôler l'ordre de réduction du nombre de pods ?
Non. HPA ajuste uniquement le nombre de réplicas, pas les pods à terminer. Le contrôleur gestionnaire (tel qu'un Deployment) détermine l'ordre de terminaison et l'arrêt gracieux.
Toutefois, dans des environnements mixtes comportant différents types de nœuds tels que ECS, ACS et ECI, ou plusieurs pools de nœuds, utilisez une ResourcePolicy pour contrôler la priorité de réduction — par exemple, réduire les pods ECI avant les pods ECS. Consultez la section Personnaliser la planification prioritaire des ressources élastiques.
Que signifient les unités des métriques d'utilisation HPA ?
Les métriques d'utilisation sont des entiers sans unité ou des entiers en unités m (1000m = 1). Par exemple, 70000m équivaut à 70.
Que faire si la colonne target affiche unknown après avoir exécuté kubectl get hpa ?
Pour résoudre le problème :
-
Exécutez
kubectl describe hpa <hpa_name>pour vérifier pourquoi HPA a échoué.Si le champ
Conditionsindique queAbleToScaleestFalse, vérifiez que le Deployment s'exécute correctement.Si le champ
Conditionsindique queScalingActiveestFalse, passez à l'étape suivante.
-
Exécutez
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/". Si le messageError from server (NotFound): the server could not find the requested resourceest renvoyé, vérifiez l'état de alibaba-cloud-metrics-adapter.Si alibaba-cloud-metrics-adapter s'exécute correctement, vérifiez si la métrique HPA est liée à Ingress. Si c'est le cas, déployez d'abord le composant SLS. Consultez la section Collecter et analyser les journaux d'accès Nginx Ingress.
-
Vérifiez que les métriques HPA sont saisies correctement. La valeur de sls.ingress.route est au format
<namespace>-<svc>-<port>.namespace: Le namespace de l'Ingress.svc: Le nom du service Ingress.port: Le nom du port du service Ingress.
Comment trouver les métriques prises en charge par HPA
Consultez la section Métriques HPA Alibaba Cloud pour obtenir la liste complète. Métriques courantes :
|
Métrique |
Description |
Paramètre supplémentaire |
|
sls_ingress_qps |
QPS pour la route Ingress spécifiée. |
sls.ingress.route |
|
sls_alb_ingress_qps |
QPS pour la route ALB Ingress spécifiée. |
sls.ingress.route |
|
sls_ingress_latency_avg |
Latence moyenne pour toutes les requêtes. |
sls.ingress.route |
|
sls_ingress_latency_p50 |
Latence au 50e percentile des requêtes. |
sls.ingress.route |
|
sls_ingress_latency_p95 |
Latence au 95e percentile des requêtes. |
sls.ingress.route |
|
sls_ingress_latency_p99 |
Latence au 99e percentile des requêtes. |
sls.ingress.route |
|
sls_ingress_latency_p9999 |
Latence au 99,99e percentile des requêtes. |
sls.ingress.route |
|
sls_ingress_inflow |
Bande passante entrante de l'Ingress. |
sls.ingress.route |
Mise à l'échelle automatique avec des formats de journal Nginx Ingress personnalisés
Pour utiliser les métriques SLS Ingress pour la mise à l'échelle horizontale des pods, consultez la section Mettre à l'échelle les pods en fonction des métriques Nginx Ingress. La collecte des journaux Nginx Ingress vers SLS doit être activée dans votre cluster.
SLS est activé par défaut lors de la création du cluster. Avec les paramètres par défaut, les tableaux de bord des journaux d'accès et la surveillance Nginx Ingress sont disponibles dans la console SLS.
Si vous avez désactivé SLS lors de la création du cluster, réactivez-le et configurez-le. Consultez la section Collecter et analyser les journaux d'accès Nginx Ingress.
Si vous avez personnalisé le format des journaux Nginx Ingress, mettez à jour la section
processor_regexdans la configuration CRD. Le CRD AliyunLogConfig par défaut ne correspond qu'au format de journal Ingress Controller par défaut. Consultez la section Collecter les journaux de conteneurs à l'aide d'un DaemonSet-CRD.
Comment récupérer la métrique QPS sls_ingress_qps à l'aide de la CLI ?
Récupérez la métrique sls_ingress_qps :
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingress"
{{SLS_Project}} est le nom du projet SLS pour le cluster ACK. Par défaut : k8s-log-{{ClusterId}}, où {{ClusterId}} est l'ID du cluster.
Si cette erreur est renvoyée :
Error from server: {
"httpCode": 400,
"errorCode": "ParameterInvalid",
"errorMessage": "key (slb_pool_name) is not config as key value config,if symbol : is in your log,please wrap : with quotation mark \"",
"requestID": "xxxxxxx"
}
Cela signifie qu'aucune donnée n'est disponible pour la métrique, ce qui se produit lors de l'interrogation d'une métrique ALB Ingress (telle que sls_alb_ingress_qps) sans ALB Ingress configuré.
Si un résultat similaire à celui-ci est renvoyé :
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "sls_ingress_qps",
"timestamp": "2025-02-26T16:45:00Z",
"value": "50", # The QPS value
"metricLabels": {
"sls.project": "your-sls-project-name",
"sls.logstore": "nginx-ingress"
}
}
]
}
Cela confirme que la métrique a été récupérée. value représente la valeur QPS.
Échec du téléchargement de l'image alibaba-cloud-metrics-adapter
Symptôme
Lorsque vous mettez à niveau le composant ack-alibaba-cloud-metrics-adapter vers la version 1.3.7, le téléchargement de l'image échoue avec l'erreur suivante :
Failed to pull image "registry-<region-id>-vpc.ack.aliyuncs.com/acs/alibaba-cloud-metrics-adapter-amd64:v0.2.9-ba634de-aliyun".
Cause
ack-alibaba-cloud-metrics-adapter ne prend pas actuellement en charge les mises à niveau sur place.
Solution
Pour effectuer la mise à niveau :
Sauvegardez la configuration actuelle du composant.
Désinstallez l'ancienne version du composant.
Installez la dernière version avec la configuration sauvegardée.
Pendant ce processus, la mise à l'échelle des objets HPA concernés est suspendue car la collecte des métriques s'arrête.