Quando la scalabilità automatica orizzontale dei pod non funziona come previsto in
Google Kubernetes Engine (GKE), i tuoi carichi di lavoro potrebbero non essere scalati correttamente. Questo problema può impedire alle applicazioni di gestire il carico, il che può causare problemi di prestazioni o interruzioni. Potresti notare che i pod non aumentano nonostante l'utilizzo elevato della CPU, i valori delle metriche
visualizzati come <unknown> nello stato di HorizontalPodAutoscaler o le operazioni di scalabilità
non vengono eseguite.
Utilizza questo documento per diagnosticare e risolvere i problemi comuni relativi alla scalabilità automatica pod orizzontale, dalle configurazioni errate iniziali negli oggetti HorizontalPodAutoscaler a errori più complessi all'interno della pipeline delle metriche. Seguendo questi passaggi per la risoluzione dei problemi, puoi assicurarti che le tue applicazioni scalino in modo efficiente e affidabile in base alla domanda, utilizzando in modo efficace la risorsa HorizontalPodAutoscaler.
Queste informazioni sono importanti per gli sviluppatori di applicazioni che configurano oggetti HorizontalPodAutoscaler e devono assicurarsi che le loro applicazioni vengano scalate correttamente. Aiuta inoltre gli amministratori e gli operatori della piattaforma a risolvere i problemi relativi alla pipeline delle metriche o alla configurazione del cluster che influiscono su tutti i carichi di lavoro con scalabilità automatica. Per saperne di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud , consulta Ruoli e attività comuni degli utenti GKE.
Prima di iniziare
- Assicurati di utilizzare gli oggetti HorizontalPodAutoscaler con workload scalabili, come Deployment e StatefulSet. Non puoi utilizzare la scalabilità automatica pod orizzontale con i workload che non possono essere scalati, ad esempio DaemonSet.
-
Per ottenere le autorizzazioni necessarie per risolvere i problemi relativi alla scalabilità automatica orizzontale dei pod in GKE, che include l'ispezione degli oggetti HorizontalPodAutoscaler e la visualizzazione dei log del cluster, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
Ispeziona le risorse GKE:
Visualizzatore GKE (
roles/container.viewer) -
Visualizza i log del cluster:
Visualizzatore log (
roles/logging.viewer)
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
-
Ispeziona le risorse GKE:
Visualizzatore GKE (
Configura lo strumento a riga di comando
kubectlper comunicare con il tuo cluster GKE:gcloud container clusters get-credentials CLUSTER_NAME \ --location LOCATION \ --project PROJECT_IDSostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.LOCATION: la regione o la zona di Compute Engine (ad esempious-central1ous-central1-a) per il cluster.PROJECT_ID: il tuo ID progetto Google Cloud .
Diagnosticare i problemi di HorizontalPodAutoscaler
Per diagnosticare i problemi relativi a un HorizontalPodAutoscaler, esamina lo stato e la configurazione utilizzando i comandi kubectl o la console Google Cloud .
Descrivi l'oggetto HorizontalPodAutoscaler
Per visualizzare i calcoli in tempo reale e le decisioni di scalabilità recenti, utilizza il
comando kubectl describe hpa:
kubectl describe hpa HPA_NAME -n NAMESPACE_NAME
Sostituisci quanto segue:
HPA_NAME: il nome dell'oggetto HorizontalPodAutoscaler.NAMESPACE_NAME: lo spazio dei nomi dell'oggetto HorizontalPodAutoscaler.
L'output è simile al seguente:
Name: php-apache-hpa
Namespace: default
Reference: Deployment/php-apache
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 1% (1m) / 50%
Min replicas: 1
Max replicas: 10
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HorizontalPodAutoscaler was able to successfully calculate a replica count
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 39m horizontal-pod-autoscaler New size: 4; reason: cpu resource utilization...
Normal SuccessfulRescale 26m horizontal-pod-autoscaler New size: 1; reason: cpu resource utilization...
Nell'output, le seguenti tre sezioni ti aiutano a diagnosticare il problema:
Metrics: mostra i valori attuali delle metriche rispetto ai relativi target. Un valore della metrica<unknown>indica che HorizontalPodAutoscaler non ha recuperato la metrica o che la pipeline delle metriche è interrotta.Conditions: indica se HorizontalPodAutoscaler può recuperare le metriche (AbleToScale) ed eseguire i calcoli di scalabilità (ScalingActive). Uno statoFalsein una di queste condizioni indica un errore.Events: registra le azioni di scalabilità, gli avvisi e gli errori recenti del controller HorizontalPodAutoscaler. Spesso è il primo posto in cui trovare messaggi o motivi di errore specifici, ad esempioFailedGetScaleoFailedGetResourceMetric.
Controlla il manifest HorizontalPodAutoscaler
Il manifest YAML dell'oggetto HorizontalPodAutoscaler ti consente di visualizzare informazioni sulla sua configurazione e sul suo stato attuale.
Per visualizzare il manifest YAML, seleziona una delle seguenti opzioni:
Console
Nella console Google Cloud , vai alla pagina Visualizzatore oggetti.
Nell'elenco Tipi di oggetti, seleziona la casella di controllo HorizontalPodAutoscaler e fai clic su Ok.
Vai al gruppo API autoscaling, quindi fai clic sulla freccia di espansione per HorizontalPodAutoscaler.
Fai clic sul nome dell'oggetto HorizontalPodAutoscaler che vuoi ispezionare.
Esamina la sezione YAML, che mostra la configurazione completa dell'oggetto HorizontalPodAutoscaler.
kubectl
Esegui questo comando:
kubectl get hpa HPA_NAME -n NAMESPACE_NAME -o yaml
Sostituisci quanto segue:
HPA_NAME: il nome dell'oggetto HorizontalPodAutoscaler.NAMESPACE_NAME: lo spazio dei nomi dell'oggetto HorizontalPodAutoscaler.
Dopo aver recuperato il manifest, cerca queste sezioni chiave:
spec(la tua configurazione):scaleTargetRef: il workload (ad esempio un deployment) per cui è configurato lo scale di HorizontalPodAutoscaler.minReplicasemaxReplicas: le impostazioni minime e massime delle repliche.metrics: le metriche configurate per lo scaling (ad esempio, utilizzo della CPU o metriche personalizzate).
status(lo stato live di HorizontalPodAutoscaler):currentMetrics: i valori delle metriche più recenti che HorizontalPodAutoscaler ha osservato.currentReplicasedesiredReplicas: il numero attuale di pod e il numero a cui HorizontalPodAutoscaler vuole scalare.conditions: mostra lo stato di integrità di HorizontalPodAutoscaler:AbleToScale: indica se HorizontalPodAutoscaler può trovare la destinazione e le metriche.ScalingActive: indica se HorizontalPodAutoscaler può calcolare ed eseguire lo scaling.ScalingLimited: indica se HorizontalPodAutoscaler vuole scalare, ma è limitato dalle impostazioni diminReplicasomaxReplicas.
Visualizzare i log eventi
Per ottenere informazioni più approfondite sull'oggetto HorizontalPodAutoscaler, utilizza i seguenti tipi di log:
Visualizza gli eventi HorizontalPodAutoscaler in Cloud Logging: utilizza un filtro log per trovare tutti gli eventi HorizontalPodAutoscaler per un cluster specifico. Ad esempio:
Nella console Google Cloud , vai alla pagina Esplora log.
Nel riquadro della query, inserisci la seguente query:
resource.type="k8s_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.location="LOCATION" logName="projects/PROJECT_ID/logs/events" jsonPayload.involvedObject.kind="HorizontalPodAutoscaler"Sostituisci quanto segue:
CLUSTER_NAME: il nome del cluster a cui appartiene HorizontalPodAutoscaler.LOCATION: la regione o la zona di Compute Engine (ad esempio,us-central1ous-central1-a) per il cluster.PROJECT_ID: il tuo ID progetto.
Fai clic su Esegui query e rivedi l'output.
Visualizza gli eventi di scalabilità automatica orizzontale dei pod: questi log forniscono log strutturati e leggibili che spiegano come HorizontalPodAutoscaler calcola un consiglio, offrendo informazioni dettagliate sul suo processo decisionale.
Risolvere gli errori di configurazione di HorizontalPodAutoscaler
Le sezioni seguenti riguardano le configurazioni errate nel manifest HorizontalPodAutoscaler, come campi digitati in modo errato, target delle metriche non validi o configurazioni in conflitto.
Carico di lavoro di destinazione non trovato
Sintomi
La sezione Events ha una condizione FailedGetScale con un messaggio simile
al seguente:
the HorizontalPodAutoscaler controller was unable to get the target's current scale: WORKLOAD_TYPE.apps "TARGET_WORKLOAD" not found
Questo output include i seguenti valori:
WORKLOAD_TYPE: il tipo di workload, ad esempioDeploymentoStatefulSet.TARGET_WORKLOAD: il nome del workload.
Causa
Il controller HorizontalPodAutoscaler non riesce a trovare il workload (ad esempio un deployment o uno StatefulSet) che è configurato per gestire. Questo problema si verifica a causa di una configurazione errata nel campo scaleTargetRef all'interno del manifest di HorizontalPodAutoscaler. La risorsa specificata potrebbe non esistere, essere stata eliminata o contenere un errore di ortografia.
Risoluzione
Prova le seguenti soluzioni:
- Verifica il campo
scaleTargetRefdel manifest HorizontalPodAutoscaler: assicurati che i valori diname,kindeapiVersionnel camposcaleTargetRefcorrispondano esattamente ai metadati corrispondenti del tuo workload di destinazione. Se il nome del workload non è corretto, aggiorna il camposcaleTargetRefdi HorizontalPodAutoscaler in modo che punti al nome corretto. - Verifica che il workload esista: verifica che il workload di destinazione esista nello stesso spazio dei nomi di HorizontalPodAutoscaler. Puoi verificarlo con un comando come
kubectl get deployment DEPLOYMENT_NAME. Se hai eliminato intenzionalmente il workload, elimina l'oggetto HorizontalPodAutoscaler corrispondente per pulire il cluster. Se devi ricreare il workload, HorizontalPodAutoscaler lo trova automaticamente dopo che è disponibile e l'errore viene risolto. - Verifica che HorizontalPodAutoscaler e il workload si trovino nello stesso
spazio dei nomi: HorizontalPodAutoscaler e il relativo workload di destinazione devono trovarsi
nello stesso spazio dei nomi. Se dimentichi di specificare uno spazio dei nomi quando crei un oggetto con i comandi
kubectl, Kubernetes inserisce l'oggetto nello spazio dei nomidefault. Questo comportamento può causare una mancata corrispondenza se l'oggetto HorizontalPodAutoscaler si trova nello spazio dei nomidefaulte il workload si trova in un altro spazio dei nomi o viceversa. Controlla lo spazio dei nomi per entrambi gli oggetti e verifica che corrispondano.
Dopo che HorizontalPodAutoscaler individua correttamente il target, la condizione
AbleToScale diventa True e il messaggio cambia in:
the HorizontalPodAutoscaler controller was able to get the target's current scale.
Metriche non valide
Sintomi
Se HorizontalPodAutoscaler non riesce a calcolare le repliche richieste a causa di un
problema di configurazione, la sezione Events mostra il motivo
FailedComputeMetricsReplicas con un messaggio simile al seguente:
invalid metrics (1 invalid out of 1)
Causa
Questo errore di solito indica una mancata corrispondenza tra la metrica type e il valore target definito nel manifest HorizontalPodAutoscaler. Ad esempio,
potresti aver specificato un type di Utilization, ma aver fornito un valore target
di averageValue anziché averageUtilization.
Risoluzione
Correggi il manifest di HorizontalPodAutoscaler in modo che il valore del campo target
sia allineato alla metrica type:
- Se
typeèUtilization, il valore nel campotargetdeve essereaverageUtilization. - Se
typeèAverageValue, il valore nel campotargetdeve essereaverageValue.
Etichetta della metrica non consentita
Sintomi
Viene visualizzato il seguente errore:
unable to fetch metrics from external metrics API: googleapi: Error 400: Metric label: 'LABEL_NAME' is not allowed
In questo output, LABEL_NAME è il nome dell'etichetta
non corretta.
Causa
Il manifest HorizontalPodAutoscaler specifica una chiave di etichetta non valida nella sezione metric.selector.matchLabels e Cloud Monitoring non riconosce o non consente questa chiave per la metrica.
Risoluzione
Per risolvere il problema, segui questi passaggi:
- Identifica il nome dell'etichetta non consentita dal messaggio di errore.
- Rimuovi o correggi questa chiave di etichetta nella sezione
metric.selector.matchLabelsdel manifest HorizontalPodAutoscaler. - Trova una chiave di etichetta valida e filtrabile consultando la documentazione di Cloud Monitoring per quella metrica.
Più HorizontalPodAutoscaler hanno come target lo stesso workload
Sintomi
Non esiste un Condition o un Reason specifico nello stato di HorizontalPodAutoscaler
che indichi direttamente questo conflitto. Potresti invece osservare i
seguenti sintomi:
- Il numero di repliche del workload può variare in modo imprevisto.
- Le decisioni di scalabilità potrebbero non sembrare corrispondenti alle metriche definite in un singolo HorizontalPodAutoscaler.
- Quando visualizzi gli eventi, potresti vedere eventi
SuccessfulRescalealternati o contraddittori provenienti da diversi oggetti HorizontalPodAutoscaler.
Causa
Questo problema si verifica perché più di un oggetto HorizontalPodAutoscaler all'interno dello stesso spazio dei nomi specifica esattamente lo stesso carico di lavoro nel campo spec.scaleTargetRef. Ogni HorizontalPodAutoscaler calcola in modo indipendente i conteggi delle repliche e tenta di scalare il workload in base al proprio insieme di metriche e target. Kubernetes non blocca questa configurazione, ma
porta ad aggiustamenti di scalabilità irregolari perché gli HorizontalPodAutoscaler
competono tra loro.
Risoluzione
Per evitare conflitti, definisci tutte le metriche di scalabilità in un unico oggetto HorizontalPodAutoscaler. Ogni HorizontalPodAutoscaler calcola le esigenze di scalabilità
dal proprio campo spec.metrics, quindi l'unione consente all'oggetto
HorizontalPodAutoscaler scelto di considerare tutti i fattori, come CPU e
richieste al secondo, insieme:
Per identificare gli oggetti HorizontalPodAutoscaler che hanno come target lo stesso workload, recupera il manifest YAML per ogni oggetto HorizontalPodAutoscaler. Presta molta attenzione al campo
spec.scaleTargetRefnell'output.kubectl get hpa -n NAMESPACE_NAME -o yamlSostituisci
NAMESPACE_NAMEcon lo spazio dei nomi dell'oggetto HorizontalPodAutoscaler.Cerca le istanze in cui diverse risorse HorizontalPodAutoscaler hanno gli stessi valori per
apiVersion,kindenamenel camposcaleTargetRef.Consolida le metriche in un unico oggetto HorizontalPodAutoscaler:
- Scegli un oggetto HorizontalPodAutoscaler da conservare. Questo HorizontalPodAutoscaler sarà quello che modificherai.
- Esamina la sezione
spec.metricsnel manifest di ciascuno degli altri oggetti HorizontalPodAutoscaler che hanno come target lo stesso workload. - Copia le definizioni delle metriche che vuoi conservare dalle sezioni
spec.metricsdegli oggetti HorizontalPodAutoscaler duplicati. - Incolla queste definizioni di metriche copiate nell'array
spec.metricsdi HorizontalPodAutoscaler che hai deciso di conservare.
Applica le modifiche:
kubectl apply -f MANIFEST_NAMESostituisci
MANIFEST_NAMEcon il nome del manifest HorizontalPodAutoscaler che hai deciso di conservare.Elimina gli altri oggetti HorizontalPodAutoscaler che avevano come target lo stesso carico di lavoro:
kubectl delete hpa DUPLICATE_MANIFEST_NAME -n NAMESPACE_NAMESostituisci
DUPLICATE_MANIFEST_NAMEcon il nome dell'oggetto HorizontalPodAutoscaler ridondante che vuoi eliminare.
Risolvi i problemi relativi agli errori di workload e servizio
Le sezioni seguenti trattano gli errori causati dal carico di lavoro di destinazione o dai relativi servizi associati, anziché dall'oggetto HorizontalPodAutoscaler stesso.
Richieste di risorse mancanti per il calcolo dello scaling
Sintomi
La condizione ScalingActive è False con un Reason di
FailedGetResourceMetric. In genere viene visualizzato anche un messaggio simile al seguente:
the HorizontalPodAutoscaler was unable to compute the replica count
Causa
HorizontalPodAutoscaler deve calcolare l'utilizzo delle risorse come percentuale per scalare il workload, ma non può eseguire questo calcolo perché almeno un container all'interno della specifica del pod non ha una definizione resources.requests per la risorsa corrispondente (cpu o memory).
Risoluzione
Per risolvere il problema, aggiorna il manifest del pod all'interno del deployment, di StatefulSet o di un altro controller in modo da includere un campo resources.requests per la risorsa (cpu o memory) su cui HorizontalPodAutoscaler sta tentando di scalare per tutti i container nel pod. Ad esempio:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
# Multiple lines are omitted here
spec:
containers:
- name: example-container
resources:
requests:
cpu: "100m"
memory: "128Mi"
Impossibile recuperare le metriche dei pod
Sintomi
Viene visualizzato un messaggio persistente simile al seguente:
unable to fetch pod metrics for pod
È normale visualizzare temporaneamente questo messaggio all'avvio del server delle metriche.
Causa
Per scalare in base alla percentuale di utilizzo delle risorse (ad esempio cpu o memory),
ogni container all'interno dei pod scelti come target dall'oggetto HorizontalPodAutoscaler
deve avere il campo resources.requests definito per quella risorsa specifica.
In caso contrario, HorizontalPodAutoscaler non può eseguire i calcoli necessari e non esegue alcuna azione correlata a questa metrica.
Risoluzione
Se questi messaggi di errore persistono e noti che i pod non vengono scalati per il tuo workload, verifica di aver specificato le richieste di risorse per ogni container nel tuo workload.
Più servizi selezionano la stessa destinazione
Sintomi
Viene visualizzato il seguente errore:
multiple services selecting the same target of HPA_NAME: SERVICE_NAME
Questo output include i seguenti valori:
HPA_NAME: il nome di HorizontalPodAutoscaler.SERVICE_NAME: il nome di un servizio.
Causa
La scalabilità automatica basata sul traffico è configurata, ma più di un servizio Kubernetes
ha come target il campo scaleTargetRef di HorizontalPodAutoscaler. La scalabilità automatica basata sul traffico supporta solo una relazione uno a uno tra il servizio e il workload sottoposto a scalabilità automatica.
Risoluzione
Per risolvere il problema, assicurati che solo il selettore etichetta di un servizio corrisponda ai pod del tuo workload:
Trova le etichette dei pod del tuo workload:
kubectl get deployment HPA_TARGET_DEPLOYMENT \ -n NAMESPACE \ -o jsonpath='{.spec.template.metadata.labels}'Sostituisci quanto segue:
HPA_TARGET_DEPLOYMENT: il nome del deployment scelto come target da HorizontalPodAutoscaler.NAMESPACE: lo spazio dei nomi del deployment.
L'output è simile al seguente:
{"app":"my-app", "env":"prod"}Trova tutti i servizi che corrispondono a queste etichette esaminando il campo
spec.selectorper tutti i servizi nello spazio dei nomi.kubectl get services -n NAMESPACE -o yamlIdentifica ogni servizio il cui selettore corrisponde alle etichette del passaggio precedente. Ad esempio, sia
{"app": "my-app"}sia{"app": "my-app", "env": "prod"}corrispondono alle etichette dei pod di esempio.Risolvi il conflitto scegliendo una delle seguenti opzioni:
- Rendi univoco il selettore del servizio previsto aggiungendo una nuova etichetta univoca al campo
spec.template.metadata.labelsdel tuo deployment. Poi, aggiorna il campospec.selectordel singolo servizio previsto in modo da includere questa nuova etichetta. - Rendi più restrittivi gli altri selettori di servizio modificando il campo
spec.selectordi tutti gli altri servizi in conflitto in modo che siano più restrittivi e non corrispondano più ai pod del tuo carico di lavoro.
- Rendi univoco il selettore del servizio previsto aggiungendo una nuova etichetta univoca al campo
Applica le modifiche:
kubectl apply -f MANIFEST_NAMESostituisci
MANIFEST_NAMEcon il nome del file YAML contenente il manifest aggiornato del servizio o del deployment.
Risolvi i problemi relativi all'API Metrics e alla disponibilità dei dati
Le sezioni seguenti ti aiutano a risolvere gli errori che si verificano quando HorizontalPodAutoscaler tenta di comunicare con un'API Metrics o di eseguire query su un backend delle metriche.
Risolvi i problemi relativi alle metriche personalizzate ed esterne
Quando HorizontalPodAutoscaler si basa su metriche provenienti da fonti diverse da CPU o memoria predefinite, possono verificarsi problemi nella pipeline delle metriche personalizzate o esterne. Questa pipeline è costituita dal controller HorizontalPodAutoscaler, dal server API delle metriche di Kubernetes, dall'adattatore delle metriche e dall'origine delle metriche (ad esempio Cloud Monitoring o Prometheus), come mostrato nel seguente diagramma:
Sintomi
I sintomi più comuni di un problema nella pipeline delle metriche sono i seguenti:
- Il valore della metrica viene visualizzato come
<unknown>. - Gli eventi HorizontalPodAutoscaler mostrano errori come
FailedGetExternalMetricoFailedGetCustomMetric.
Causa
Esiste un problema nella pipeline delle metriche personalizzate o esterne.
Risoluzione
Per eseguire il debug della pipeline:
Verifica se l'adattatore delle metriche è registrato e disponibile: l'adattatore delle metriche deve registrarsi presso il server API Kubernetes principale per fornire le metriche. Questa azione è il modo più diretto per verificare se l'adattatore è in esecuzione e raggiungibile dal server API:
kubectl get apiservice | grep -E 'NAME|metrics.k8s.io'Nell'output dovresti vedere le voci
v1beta1.custom.metrics.k8s.ioov1beta1.external.metrics.k8s.ioe un valore diTruenella colonnaAvailable. Ad esempio:NAME SERVICE AVAILABLE AGE v1beta1.metrics.k8s.io kube-system/metrics-server True 18dSe il valore nella colonna
AvailableèFalseo mancante, è probabile che l'adattatore si sia arrestato in modo anomalo o sia configurato in modo errato. Controlla i log del pod dell'adattatore nello spazio dei nomikube-systemocustom-metricsper errori relativi a autorizzazioni, connettività di rete all'origine metrica o messaggi che indicano che la metrica non è stata trovata.Se il valore è
True, vai al passaggio successivo.
Interroga direttamente l'API Metrics: se l'adattatore è disponibile, ignora HorizontalPodAutoscaler e chiedi direttamente all'API Kubernetes la metrica. Questo comando testa l'intera pipeline, dal server API all'adattatore delle metriche fino all'origine dati.
Per eseguire query sulle metriche esterne, esegui questo comando:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/NAMESPACE_NAME/METRIC_NAME" | jq .Per eseguire query sulle metriche dei pod personalizzati, esegui questo comando:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/NAMESPACE_NAME/pods/*/METRIC_NAME" | jq .Sostituisci quanto segue:
NAMESPACE_NAME: lo spazio dei nomi in cui sono in esecuzione i tuoi pod.METRIC_NAME: il nome della metrica personalizzata o esterna che stai tentando di interrogare. Ad esempio,requests_per_secondoqueue_depth.
Analizza l'output del comando: il risultato dei comandi precedenti indica dove si trova il problema. Scegli lo scenario che corrisponde al tuo output:
- Risposta JSON riuscita con un valore: la pipeline delle metriche funziona correttamente. Il problema è probabilmente dovuto a un problema di configurazione nel manifest
HorizontalPodAutoscaler. Controlla la presenza di errori ortografici nel nome della metrica o di
matchLabelserrati. Error: Error from server (Service Unavailable): questo errore in genere indica un problema di connettività di rete, spesso un problema del firewall nei cluster che utilizzano l'isolamento di rete.Identifica il servizio dell'adattatore delle metriche. Di solito si trova nello spazio dei nomi
custom-metricsokube-system:kubectl get service -n custom-metrics,kube-system | grep -E 'adapter|metrics'Trova la porta su cui è in ascolto l'adattatore:
kubectl get service ADAPTER_SERVICE -n ADAPTER_NAMESPACE -o yamlSostituisci quanto segue:
ADAPTER_SERVICE: il nome del servizio Kubernetes associato all'adattatore delle metriche che hai eseguito il deployment. Questo servizio è quello che hai trovato nel passaggio precedente. Questo servizio espone la funzionalità dell'adattatore ad altre parti del cluster, incluso il server API Kubernetes.ADAPTER_NAMESPACE: lo spazio dei nomi in cui si trova il servizio dell'adattatore (ad esempio,custom-metricsokube-system).
Trova le regole firewall in entrata per il control plane del cluster:
gcloud compute firewall-rules list \ --filter="name~gke-CLUSTER_NAME-[0-9a-z]*-master"Sostituisci
CLUSTER_NAMEcon il nome del tuo cluster.Aggiungi
targetPortdell'adattatore alla regola:Descrivi la regola attuale per visualizzare le porte consentite esistenti:
gcloud compute firewall-rules describe FIREWALL_RULE_NAMESostituisci
FIREWALL_RULE_NAMEcon il nome della regola firewall che regola il traffico di rete verso il control plane del tuo cluster Kubernetes.Aggiorna la regola per aggiungere la porta dell'adattatore all'elenco:
gcloud compute firewall-rules update FIREWALL_RULE_NAME \ --allow tcp:443,tcp:10250,tcp:ADAPTER_PORTSostituisci
ADAPTER_PORTcon la porta di rete su cui è in ascolto l'adattatore delle metriche.
Assicurati che le policy di rete di Kubernetes non blocchino il traffico verso i pod dell'adattatore delle metriche:
kubectl get networkpolicy -n custom-metrics,kube-systemEsamina le policy per verificare che consentano il traffico in entrata dal control plane o dal server API a
ADAPTER_SERVICEsuADAPTER_PORT.
Un elenco vuoto
[]: questo output indica che l'adattatore è in esecuzione, ma non riesce a recuperare la metrica specifica, il che indica un problema con la configurazione dell'adattatore o con l'origine della metrica stessa.Problemi relativi ai pod dell'adattatore: controlla i log del pod o dei pod dell'adattatore di metriche per individuare errori relativi alle chiamate API, all'autenticazione o al recupero delle metriche. Per esaminare i log:
Trova il nome del pod dell'adattatore:
kubectl get pods -n ADAPTER_NAMESPACEVisualizza i relativi log:
kubectl logs ADAPTER_POD_NAME \ -n ADAPTER_NAMESPACESostituisci quanto segue:
ADAPTER_POD_NAME: il nome del pod dell'adattatore che hai identificato nel passaggio precedente.ADAPTER_NAMESPACE: lo spazio dei nomi in cui si trova il pod dell'adattatore (ad esempio,custom-metricsokube-system).
Nessun dato nell'origine: la metrica potrebbe non esistere nel sistema di origine. Utilizza uno strumento di monitoraggio, come Metrics Explorer, per verificare che la metrica esista e abbia il nome e le etichette corretti.
- Risposta JSON riuscita con un valore: la pipeline delle metriche funziona correttamente. Il problema è probabilmente dovuto a un problema di configurazione nel manifest
HorizontalPodAutoscaler. Controlla la presenza di errori ortografici nel nome della metrica o di
Versioni della metrica non trovate o adattatore non disponibile
Sintomi
Viene visualizzato il seguente errore:
unable to fetch metrics from custom metrics API: no known available metric versions found
Causa
Questo errore indica un'interruzione della comunicazione all'interno del cluster, non un problema con l'origine delle metriche (ad esempio Cloud Monitoring). Di seguito sono elencate alcune delle possibili cause:
- Il server API Kubernetes è temporaneamente non disponibile (ad esempio, durante un upgrade del cluster o una riparazione del control plane).
- I pod dell'adattatore delle metriche (ad esempio
custom-metrics-stackdriver-adapter) non sono integri, non sono in esecuzione o non sono registrati correttamente con il server API.
Risoluzione
Questo problema è spesso temporaneo. Se il problema persiste, prova le seguenti soluzioni:
Controlla lo stato del control plane Kubernetes:
Nella console Google Cloud , visualizza l'integrità e lo stato del cluster.
Vai alla pagina Cluster Kubernetes.
Controlla le colonne Stato e Notifiche del tuo cluster.
Fai clic su Notifiche per cercare operazioni in corso come upgrade o riparazioni. Il server API potrebbe non essere disponibile per un breve periodo durante questi orari.
Esamina Cloud Audit Logs per verificare la presenza di errori relativi ai componenti del control plane. Per informazioni su come visualizzare questi log, consulta Informazioni sui log di controllo di GKE.
Controlla lo stato e i log dei pod dell'adattatore delle metriche: assicurati che i pod dell'adattatore delle metriche siano nello stato
Runninge non abbiano riavvii recenti:kubectl get pods -n custom-metrics,kube-system -o wideSe lo stato di un pod è diverso da
Runningo se ha un numero elevato di riavvii, esamina il pod per trovare la causa principale. Per suggerimenti per la risoluzione dei problemi, vedi Debug dei pod nella documentazione di Kubernetes.Verifica che le API Metrics siano registrate e disponibili:
kubectl get apiservice | grep metrics.k8s.ioSe le API Metrics sono integre, l'output è simile al seguente:
NAME SERVICE AVAILABLE AGE v1beta1.custom.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 18d v1beta1.external.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 18d v1beta1.metrics.k8s.io kube-system/metrics-server True 18dSe la colonna
AVAILABLEha un valoreFalse, la colonnaMessagenel manifest APIService completo potrebbe fornire ulteriori dettagli.Puoi visualizzare il manifest completo con il seguente comando:
kubectl get apiservice API_SERVICE_NAME -o yamlSostituisci
API_SERVICE_NAMEcon il nome dell'oggetto APIService, ad esempiov1beta1.custom.metrics.k8s.io.
La query della metrica non restituisce serie temporali
Sintomi
Viene visualizzato il seguente errore:
unable to fetch metrics from custom or external metrics API: googleapi: Error
400: The supplied filter [...] query will not return any time series
Causa
La query inviata a Cloud Monitoring era valida, ma non ha restituito dati. Ciò significa che non esistono punti dati che corrispondono al filtro (che è diverso dalla ricerca di una metrica con un valore pari a 0). Il motivo più probabile di questo problema è che l'applicazione o il workload responsabile della generazione della metrica personalizzata non scriveva dati in Cloud Monitoring durante il periodo in cui sono stati segnalati gli errori.
Risoluzione
Prova le seguenti soluzioni:
- Verifica della configurazione: assicurati che i nomi e le etichette delle metriche nell'oggetto HorizontalPodAutoscaler corrispondano esattamente a quelli emessi dall'applicazione.
- Controlla le autorizzazioni: verifica che l'applicazione sia configurata correttamente con le autorizzazioni e gli endpoint API necessari per pubblicare le metriche in Cloud Monitoring.
- Conferma l'attività dell'applicazione: verifica che l'applicazione responsabile della metrica fosse operativa e tentasse di inviare dati a Cloud Monitoring durante il periodo di tempo in cui si sono verificati gli avvisi di HorizontalPodAutoscaler.
- Verifica la presenza di errori: controlla i log dell'applicazione nello stesso periodo di tempo per verificare la presenza di errori espliciti relativi all'emissione di metriche, ad esempio errori di connessione, credenziali non valide o problemi di formattazione.
Risolvi i problemi relativi a comportamenti di scalabilità integri, ma imprevisti
Le sezioni seguenti descrivono gli scenari in cui la configurazione di HorizontalPodAutoscaler è valida e le metriche sono disponibili, ma le azioni di scalabilità non si verificano come previsto.
HorizontalPodAutoscaler è integro, ma non esegue lo scale
Sintomi
HorizontalPodAutoscaler sembra integro, le sue condizioni riportano True e
non mostra errori nei suoi eventi. Tuttavia, non esegue ancora alcuna azione di scalabilità.
Causa
Diversi fattori possono causare questo comportamento previsto:
- Limiti di replica: il numero attuale di repliche si trova già al limite impostato dal campo
minReplicasomaxReplicasnella configurazione HorizontalPodAutoscaler. - Finestra di tolleranza: Kubernetes utilizza una finestra di tolleranza predefinita del 10% per impedire lo scaling in caso di piccole fluttuazioni delle metriche. Lo scaling si verifica solo se il rapporto tra la metrica attuale e la metrica target non rientra nell'intervallo compreso tra 0,9 e 1,1. Ad esempio, se il target è l'85% di CPU e l'utilizzo attuale è del 93%, il rapporto è circa 1,094 (93/85≈1,094). Poiché questo valore è inferiore a 1,1, HorizontalPodAutoscaler non esegue lo scale up.
- Pod non pronti: HorizontalPodAutoscaler include solo i pod con stato
Readynei calcoli di scalabilità. I pod bloccati con uno statoPendingo che non diventanoReady(a causa di controlli di integrità non riusciti o problemi di risorse) vengono ignorati e possono impedire lo scaling. - Ritardo del periodo di sincronizzazione: il controller HorizontalPodAutoscaler controlla le metriche periodicamente. Un ritardo di 15-30 secondi tra il superamento della soglia da parte di una metrica e l'avvio di un'azione di scalabilità è normale.
- Nuova latenza metrica: quando un HorizontalPodAutoscaler utilizza una nuova metrica personalizzata per la prima volta, potresti notare una latenza una tantum di diversi minuti. Questo ritardo si verifica perché il sistema di monitoraggio (ad esempio Cloud Monitoring) deve creare la nuova serie temporale quando viene scritto il primo punto dati.
- Calcolo di più metriche: quando configuri più metriche, HorizontalPodAutoscaler calcola il numero di repliche richiesto per ogni metrica in modo indipendente e poi sceglie il valore calcolato più alto come numero finale di repliche. A causa di questo comportamento, il tuo workload viene scalato per soddisfare le esigenze della metrica con i requisiti più elevati. Ad esempio, se le metriche della CPU calcolano la necessità di 9 repliche, ma una metrica delle richieste al secondo calcola la necessità di 15, HorizontalPodAutoscaler scala il deployment a 15 repliche.
Risoluzione
Prova le seguenti soluzioni:
- Limiti delle repliche: controlla i valori
minReplicasemaxReplicasnel manifest HorizontalPodAutoscaler o nell'output del comandokubectl describe. Modifica questi limiti se impediscono la scalabilità necessaria. - Finestra di tolleranza: se è richiesta la scalabilità all'interno della tolleranza predefinita, configura un valore di tolleranza diverso. In caso contrario, attendi che la metrica esca dall'intervallo compreso tra 0,9 e 1,1.
- Pod non pronti: indaga sul motivo per cui i pod sono
Pendingo nonReadye risolvi i problemi di fondo (ad esempio, vincoli delle risorse, probe di idoneità non riusciti). Per suggerimenti sulla risoluzione dei problemi, consulta Debug dei pod nella documentazione di Kubernetes. - Ritardo del periodo di sincronizzazione e latenza della nuova metrica: queste latenze sono normali. Attendi il completamento del periodo di sincronizzazione o la creazione della nuova serie temporale della metrica personalizzata.
- Calcolo di più metriche: questo è il comportamento previsto. Se lo scale up si verifica in base a una metrica (ad esempio le richieste al secondo), esegue l'override corretto del calcolo inferiore di un'altra metrica (ad esempio la CPU).
HorizontalPodAutoscaler non riesce a eseguire fare lo scale down
Sintomi
HorizontalPodAutoscaler esegue lo scale up del workload, ma non riesce a eseguire lo scale down anche quando le metriche come l'utilizzo della CPU sono basse.
Causa
Questo comportamento è progettato per impedire lo scale up e lo scale down rapidi o lo scale down in base a informazioni incomplete. I motivi principali sono i seguenti:
- Utilizzo di più metriche: HorizontalPodAutoscaler scala in base alla metrica che richiede il maggior numero di repliche. Se hai più metriche, il carico di lavoro non farà fare lo scale down a meno che tutte le metriche non indichino che sono necessarie meno repliche. Una metrica che richiede un numero elevato di repliche impedisce di fare lo scale down, anche se le altre sono basse.
- Metriche non disponibili: se una metrica non è disponibile (spesso viene visualizzata come
<unknown>), HorizontalPodAutoscaler rifiuta in modo conservativo di fare lo scale down del workload. Non è in grado di determinare se la metrica non è presente perché l'utilizzo è effettivamente pari a zero o perché la pipeline delle metriche non funziona. Questo problema è comune con le metriche personalizzate basate sulla frequenza (ad esempiomessages_per_second), che possono interrompere la generazione di report sui dati quando non è presente alcuna attività, facendo sì che HorizontalPodAutoscaler consideri la metrica come non disponibile e interrompa le operazioni di scale down. - Ritardo di scale down dalla policy di scalabilità: il campo
behaviordi HorizontalPodAutoscaler consente di configurare le policy di scalabilità. La policy predefinita per fare lo scale down include una finestra di stabilizzazione di 300 secondi (cinque minuti). Durante questa finestra, HorizontalPodAutoscaler non ridurrà il numero di repliche, anche quando i valori delle metriche sono scesi al di sotto della soglia target. Questa finestra impedisce fluttuazioni rapide, ma può rendere la riduzione delle risorse più lenta del previsto.
Risoluzione
Prova le seguenti soluzioni:
Per più metriche e metriche non disponibili, diagnostica la metrica che causa problemi:
kubectl describe hpa HPA_NAME -n NAMESPACE_NAMENell'output, cerca nella sezione
Metricseventuali metriche con stato<unknown>e nella sezioneEventsavvisi comeFailedGetCustomMetricoFailedGetExternalMetric. Per il debug dettagliato della pipeline, consulta la sezione Risolvere i problemi relativi alle metriche personalizzate ed esterne.Per le metriche non disponibili, se una metrica non è disponibile durante i periodi di traffico ridotto (comune con le metriche basate sulla frequenza), prova una delle seguenti soluzioni:
- Se possibile, utilizza metriche basate su indicatori anziché su frequenze. Una
metrica di tipo indicatore, ad esempio il numero totale di messaggi in una coda (ad esempio,
subscriptiononum_undelivered_messages), segnala in modo coerente un valore, anche se questo è0, consentendo a HorizontalPodAutoscaler di prendere decisioni di scalabilità in modo affidabile. - Assicurati che l'origine della metrica restituisca valori pari a zero. Se
controlli la metrica personalizzata, configurala in modo che pubblichi un
0durante i periodi di inattività anziché non inviare alcun dato.
- Se possibile, utilizza metriche basate su indicatori anziché su frequenze. Una
metrica di tipo indicatore, ad esempio il numero totale di messaggi in una coda (ad esempio,
Per i ritardi di scale down della policy di scalabilità, se il periodo di stabilizzazione predefinito di cinque minuti per lo scale down è troppo lungo, personalizzalo. Analizza la sezione
spec.behavior.scaleDowndel manifest HorizontalPodAutoscaler. Puoi abbassare il valore distabilizationWindowSecondsper consentire al gestore della scalabilità automatica di fare lo scale down più rapidamente dopo la diminuzione delle metriche. Per ulteriori informazioni sulla configurazione di queste policy, consulta Policy di scalabilità nella documentazione di Kubernetes.
Risolvi i problemi di scalabilità dei workload GKE da e verso zero utilizzando HPA
Questa sezione ti aiuta a diagnosticare i problemi durante la configurazione dei workload per scalare da e verso zero utilizzando HPA (minReplicas: 0) in GKE 1.37 o versioni successive.
Il workload non viene scalato a zero
Se il tuo workload rimane a una o più repliche quando la domanda scende a zero, controlla quanto segue:
- Controlla
minReplicas: assicurati che la coppia campo-valoreminReplicas: 0sia impostata nel manifest HorizontalPodAutoscaler. - Controlla i tipi di metriche: l'HPA non può scalare a zero se utilizza solo metriche relative alla CPU o alla memoria (
Resource). Devi configurare almeno una metricaExternaloObject. - Controlla più metriche: HPA esegue lo scale in base alla metrica che richiede il conteggio di repliche più elevato. Se configuri più metriche, il workload non viene scalato a zero a meno che ogni metrica monitorata non restituisca zero.
- Attendi la finestra di stabilizzazione della riduzione delle risorse: per impostazione predefinita, GKE attende cinque minuti (
scaleDown.stabilizationWindowSeconds: 300) di domanda continua pari a zero prima di scalare da una a zero repliche. - Controlla le metriche non disponibili: se il valore di una metrica viene visualizzato come
<unknown>, HPA mette in pausa le operazioni di fare lo scale down per evitare una riduzione prematura. Per saperne di più, consulta Risolvi i problemi relativi alla mancata riduzione della scalabilità automatica orizzontale dei pod.
Il workload non viene scalato da zero
Se il tuo workload rimane a zero repliche quando la domanda aumenta, controlla quanto segue:
Ispeziona HorizontalPodAutoscaler: esegui il comando
kubectl describe hpa HPA_NAMEe controlla le seguenti sezioni nell'output:- Sezione Metriche: verifica che il valore della metrica sia maggiore di zero e non venga visualizzato come
<unknown>. Se la metrica non è presente o non viene aggiornata, verifica che l'origine esterna (ad esempio Pub/Sub) stia pubblicando eventi e che Cloud Monitoring li stia ricevendo. - Sezione Condizioni:
- Stato integro con zero repliche: verifica che le condizioni mostrino
AbleToScale: True,ScalingActive: TrueeScaledToZero: True(con motivoScaledToZero). In questo stato, GKE scala automaticamente il workload quando la domanda aumenta. - Override esterno rilevato: verifica se il valore della condizione
ScalingActiveèFalsecon il motivoScalingDisabledExternalScaleToZerooScalingDisabledReplicaCountZero, il che indica che il workload è stato scalato manualmente a zero. Ad esempio, il workload è stato scalato manualmente con il comandokubectl scale, che mette in pausa la scalabilità automatica per evitare modifiche in conflitto.
- Stato integro con zero repliche: verifica che le condizioni mostrino
Risoluzione: per riprendere la scalabilità automatica, ridimensiona manualmente il deployment a una o più repliche:
kubectl scale deployment DEPLOYMENT_NAME --replicas=1
- Sezione Metriche: verifica che il valore della metrica sia maggiore di zero e non venga visualizzato come
Verifica la latenza di avvio a freddo: se il workload si avvia lentamente, il provisioning dei nodi potrebbe aggiungere ritardi. Per assicurarti che la capacità di calcolo di standby sia pronta durante lo scale da zero, valuta la possibilità di utilizzare i buffer di capacità.
Passaggi successivi
Se non riesci a trovare una soluzione al tuo problema nella documentazione, consulta Assistenza per ulteriore aiuto, inclusi consigli sui seguenti argomenti:
- Aprire una richiesta di assistenza contattando l'assistenza clienti Google Cloud.
- Ricevere assistenza dalla community ponendo domande su Stack Overflow e utilizzando il tag
google-kubernetes-engineper cercare problemi simili. Puoi anche unirti al canale Slack#kubernetes-engineper assistenza dalla community. - Apertura di problemi o richieste di funzionalità utilizzando l'Issue Tracker pubblico.