Quando la scalabilità automatica orizzontale dei pod non funziona come previsto in
Google Kubernetes Engine (GKE), i tuoi carichi di lavoro potrebbero non scalare 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 questa pagina 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. Se segui questi passaggi per la risoluzione dei problemi, puoi contribuire a garantire che le tue applicazioni vengano scalate in modo efficiente e affidabile in base alla domanda, utilizzando in modo efficace la risorsa di Horizontal Pod Autoscaler.
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 maggiori informazioni sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud , consulta Ruoli utente e attività comuni di GKE.
Se hai già riscontrato sintomi o visualizzato un messaggio di errore, utilizza la tabella seguente per trovare le indicazioni giuste:
Sintomo | Possibile risoluzione |
---|---|
Nessuna scalabilità, ma le condizioni di HorizontalPodAutoscaler sono True |
Risolvere i problemi relativi a un HorizontalPodAutoscaler integro ma che non risponde |
Visualizzi un messaggio di errore specifico negli eventi HorizontalPodAutoscaler | Risolvi gli errori comuni di Horizontal Pod Autoscaler |
Metrica <unknown> |
Risolvere i problemi relativi alle metriche personalizzate ed esterne |
Non viene eseguito lo scale down | Risolvere i problemi relativi al mancato scale down di Horizontal Pod Autoscaler |
Prima di iniziare
- Assicurati di utilizzare oggetti HorizontalPodAutoscaler con workload scalabili, come Deployment e StatefulSet. Non puoi utilizzare la scalabilità automatica orizzontale dei pod con carichi di lavoro che non possono essere scalati, ad esempio DaemonSet.
-
Per ottenere le autorizzazioni necessarie per risolvere i problemi di 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 ulteriori informazioni 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
kubectl
per comunicare con il cluster GKE:gcloud container clusters get-credentials CLUSTER_NAME \ --location LOCATION \ --project PROJECT_ID
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del tuo cluster.LOCATION
: la regione o la zona di Compute Engine (ad esempio,us-central1
ous-central1-a
) per il cluster.PROJECT_ID
: il tuo ID progetto Google Cloud .
Verifica lo stato e la configurazione di Horizontal Pod Autoscaler
Inizia la risoluzione dei problemi esaminando lo stato e la configurazione dell'oggetto HorizontalPodAutoscaler. Questo controllo iniziale ti aiuta a identificare e risolvere errori di configurazione di base, che sono una causa principale comune dei problemi di scalabilità.
Descrivi HorizontalPodAutoscaler
Per visualizzare i calcoli in tempo reale e le recenti decisioni di scalabilità di HorizontalPodAutoscaler, utilizza il comando kubectl describe hpa
. Questo comando fornisce un
riepilogo dell'oggetto HorizontalPodAutoscaler e un log Events
utile per
diagnosticare i problemi:
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
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
: questa sezione mostra i valori attuali delle metriche rispetto ai relativi target. Controlla qui per vedere se HorizontalPodAutoscaler riceve dati. Un valore della metrica<unknown>
indica che HorizontalPodAutoscaler non ha recuperato la metrica o che la pipeline delle metriche è interrotta.Conditions
: questo controllo di integrità di alto livello mostra se HorizontalPodAutoscaler può recuperare le metriche (AbleToScale
) ed eseguire i calcoli di scalabilità (ScalingActive
). Lo statoFalse
in una di queste condizioni indica un errore.Events
: questa sezione registra le azioni di scalabilità recenti, gli avvisi e gli errori del controller HorizontalPodAutoscaler. Spesso è il primo posto in cui trovare messaggi di errore o motivi specifici, comeFailedGetScale
oFailedGetResourceMetric
, che ti aiutano a scoprire l'origine del problema.
Controlla lo stato di HorizontalPodAutoscaler nei deployment
Per controllare lo stato degli oggetti HorizontalPodAutoscaler utilizzati con i tuoi Deployment, utilizza la console Google Cloud :
Nella console Google Cloud , vai alla pagina Workload.
Fai clic sul nome del deployment.
Vai alla scheda Dettagli e individua la sezione Scalabilità automatica.
Controlla il valore nella riga Stato:
- Un segno di spunta verde indica che HorizontalPodAutoscaler è configurato e può leggere le sue metriche.
- Un triangolo giallo indica che HorizontalPodAutoscaler è configurato, ma ha difficoltà a leggere le metriche. Si tratta di un problema comune con le metriche personalizzate o esterne. Per risolvere il problema, diagnostica perché le metriche non sono disponibili. Per maggiori informazioni, consulta la sezione Risoluzione dei problemi relativi a metriche personalizzate ed esterne.
Per altri tipi di carichi di lavoro come StatefulSet o per maggiori dettagli, controlla il manifest dell'oggetto HorizontalPodAutoscaler.
Controlla il manifest di 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 Browser 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, in cui viene visualizzata 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) che HorizontalPodAutoscaler deve scalare.minReplicas
emaxReplicas
: le impostazioni minime e massime delle repliche.metrics
: le metriche che hai configurato per la scalabilità (ad esempio, utilizzo della CPU o metriche personalizzate).
status
(lo stato live di HorizontalPodAutoscaler):currentMetrics
: i valori delle metriche più recenti osservati da HorizontalPodAutoscaler.currentReplicas
edesiredReplicas
: il numero attuale di pod e il numero a cui HorizontalPodAutoscaler vuole scalare.conditions
: la sezione più utile per la risoluzione dei problemi. Questa sezione mostra lo stato 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 diminReplicas
omaxReplicas
.
Utilizzare le funzionalità di logging avanzate
Per ottenere informazioni più dettagliate sull'oggetto HorizontalPodAutoscaler, utilizza i seguenti tipi di log:
Visualizza gli eventi di scalabilità automatica pod orizzontale in Cloud Logging: utilizza un filtro dei log per trovare tutti gli eventi di Horizontal Pod Autoscaler 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 esempious-central1
ous-central1-a
) per il cluster.PROJECT_ID
: il tuo ID progetto.
Fai clic su Esegui query e rivedi l'output.
Visualizza gli eventi di Horizontal Pod Autoscaler: questi log forniscono log strutturati e leggibili che spiegano come HorizontalPodAutoscaler calcola un consiglio, offrendo informazioni dettagliate sul suo processo decisionale.
Risolvere i problemi relativi a un HorizontalPodAutoscaler integro ma che non risponde
Questa sezione ti aiuta a diagnosticare il motivo per cui HorizontalPodAutoscaler potrebbe non attivare alcuna azione di scalabilità, anche quando sembra integro e non segnala errori nel suo stato o nei suoi eventi.
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 ha già raggiunto il limite impostato dal campo
minReplicas
omaxReplicas
nella 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% della CPU e l'utilizzo attuale è del 93%, il rapporto è circa 1,094 (93/85≈1,094). Poiché questo valore è inferiore a 1,1, la scalabilità Horizontal Pod Autoscaler non viene eseguita.
- Pod non pronti: Horizontal Pod Autoscaler include solo i pod con stato
Ready
nei suoi calcoli di scalabilità. I pod bloccati con lo statoPending
o 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.
- Latenza della nuova 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, Horizontal Pod Autoscaler 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 di richieste al secondo calcola la necessità di 15, Horizontal Pod Autoscaler esegue lo scaling del deployment a 15 repliche.
Risoluzione:
Prova le seguenti soluzioni:
- Limiti delle repliche: controlla i valori
minReplicas
emaxReplicas
nel manifest HorizontalPodAutoscaler o nell'output del comandokubectl describe
. Modifica questi limiti se impediscono lo scaling necessario. - Finestra di tolleranza: se è necessario lo scaling all'interno della tolleranza predefinita, configura un valore di tolleranza diverso. In caso contrario, attendi che la metrica esca dal rapporto compreso tra 0,9 e 1,1.
- Pod non pronti: analizza perché i pod sono
Pending
o nonReady
e risolvi i problemi sottostanti (ad esempio, vincoli delle risorse, probe di readiness non riusciti). Per suggerimenti per la risoluzione dei problemi, consulta Debug Pods 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 correttamente l'override del calcolo inferiore di un'altra metrica (ad esempio la CPU).
Risolvere i problemi comuni di Horizontal Pod Autoscaler
Le sezioni seguenti forniscono soluzioni per messaggi di errore specifici e motivi
dell'evento che potresti riscontrare quando esamini lo stato di HorizontalPodAutoscaler. In genere, questi messaggi si trovano nella sezione Events
dell'output
del comando kubectl describe hpa
.
Risolvere gli errori di configurazione di Horizontal Pod Autoscaler
Una configurazione errata nel manifest HorizontalPodAutoscaler, ad esempio un campo digitato in modo errato o configurazioni in conflitto, causa gli errori in questa sezione.
Errore: metriche non valide
Potresti visualizzare questo errore quando la configurazione di una metrica all'interno di un HorizontalPodAutoscaler non è sintatticamente corretta o è incoerente.
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
target
che hai 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 campotarget
deve essereaverageUtilization
. - Se
type
èAverageValue
, il valore nel campotarget
deve essereaverageValue
.
Errore: più servizi selezionano la stessa destinazione
Potresti visualizzare questo errore quando utilizzi la scalabilità automatica basata sul traffico che ha una configurazione del servizio errata per HorizontalPodAutoscaler.
Sintomi:
Visualizzi 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 carico di lavoro sottoposto a scalabilità automatica.
Risoluzione:
Per risolvere il problema, assicurati che solo un selettore di etichette del servizio corrisponda ai pod del tuo workload:
Trova le etichette dei pod del carico di lavoro:
kubectl get deployment HPA_TARGET_DEPLOYMENT \ -n NAMESPACE \ -o jsonpath='{.spec.template.metadata.labels}'
Sostituisci quanto segue:
HPA_TARGET_DEPLOYMENT
: il nome del deployment a cui è destinato 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.selector
per tutti i servizi nello spazio dei nomi.kubectl get services -n NAMESPACE -o yaml
Identifica ogni servizio il cui selettore corrisponde alle etichette del passaggio precedente. Ad esempio, sia
{"app": "my-app"}
che{"app": "my-app", "env": "prod"}
corrisponderebbero 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.labels
del deployment. Poi, aggiorna il campospec.selector
del servizio previsto per includere questa nuova etichetta. - Rendi più restrittivi gli altri selettori di servizi modificando il campo
spec.selector
di tutti gli altri servizi in conflitto in modo che siano più restrittivi e non corrispondano più ai pod del tuo workload.
- Rendi univoco il selettore del servizio previsto aggiungendo una nuova etichetta univoca
al campo
Applica le modifiche:
kubectl apply -f MANIFEST_NAME
Sostituisci
MANIFEST_NAME
con il nome del file YAML contenente il manifest di servizio o di deployment aggiornato.
Errore: l'etichetta non è consentita
Sintomi:
Visualizzi 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
errata.
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 consentito dal messaggio di errore.
- Rimuovi o correggi questa chiave dell'etichetta nella sezione
metric.selector.matchLabels
del manifest HorizontalPodAutoscaler. - Trova una chiave di etichetta valida e filtrabile consultando la documentazione di Cloud Monitoring per quella metrica.
Problema: più HorizontalPodAutoscaler che hanno come target lo stesso carico di lavoro
La configurazione di più oggetti HorizontalPodAutoscaler per gestire lo stesso carico di lavoro causa un comportamento di scalabilità in conflitto e imprevedibile.
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 conteggio delle repliche del workload può variare in modo imprevisto.
- Le decisioni di scalabilità potrebbero non corrispondere alle metriche definite in un singolo HorizontalPodAutoscaler.
- Quando visualizzi gli eventi, potresti vedere eventi
SuccessfulRescale
alternati o contraddittori 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 workload 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
comporta aggiustamenti di scalabilità irregolari perché gli HorizontalPodAutoscaler
sono in competizione 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 quali HorizontalPodAutoscaler hanno come target lo stesso carico di lavoro, recupera il manifest YAML per ogni oggetto HorizontalPodAutoscaler. Presta molta attenzione al campo
spec.scaleTargetRef
nell'output.kubectl get hpa -n NAMESPACE_NAME -o yaml
Sostituisci
NAMESPACE_NAME
con lo spazio dei nomi dell'oggetto HorizontalPodAutoscaler.Cerca le istanze in cui diverse risorse HorizontalPodAutoscaler hanno gli stessi valori per
apiVersion
,kind
ename
all'interno del 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.metrics
nel 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.metrics
degli oggetti HorizontalPodAutoscaler duplicati. - Incolla queste definizioni di metriche copiate nell'array
spec.metrics
dell'HorizontalPodAutoscaler che hai deciso di conservare.
Applica le modifiche:
kubectl apply -f MANIFEST_NAME
Sostituisci
MANIFEST_NAME
con 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_NAME
Sostituisci
DUPLICATE_MANIFEST_NAME
con il nome dell'oggetto HorizontalPodAutoscaler ridondante che vuoi eliminare.
Risolvere i problemi relativi al workload e al target
Gli errori in questa sezione sono causati dallo scaling di Deployment, StatefulSet o Pod, non dall'oggetto HorizontalPodAutoscaler stesso.
Errore: impossibile ottenere la scala attuale della destinazione
Potresti visualizzare questo errore quando HorizontalPodAutoscaler non riesce a trovare o accedere al workload che dovrebbe scalare.
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 esempioDeployment
oStatefulSet
.TARGET_WORKLOAD
: il nome del workload.
Causa:
Il controller HorizontalPodAutoscaler non riesce a trovare il workload (ad esempio un
deployment o un StatefulSet) che è configurato per gestire. Questo problema è
causato da un problema nel campo scaleTargetRef
all'interno del
manifest di HorizontalPodAutoscaler. La risorsa specificata potrebbe non esistere,
potrebbe essere stata eliminata o potrebbe contenere un errore ortografico.
Risoluzione:
Prova le seguenti soluzioni:
- Verifica il campo
scaleTargetRef
del manifest di HorizontalPodAutoscaler: assicurati che il valore diname
,kind
eapiVersion
nel camposcaleTargetRef
corrisponda esattamente ai metadati corrispondenti del tuo carico di lavoro di destinazione. Se il nome del carico di lavoro non è corretto, aggiorna il camposcaleTargetRef
di HorizontalPodAutoscaler in modo che punti al nome corretto. - Verifica che il workload esista: assicurati 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 carico di lavoro, elimina l'oggetto HorizontalPodAutoscaler corrispondente per pulire il cluster. Se devi ricreare il carico di lavoro, 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 HorizontalPodAutoscaler si trova nello spazio dei nomidefault
mentre il workload si trova in un altro spazio dei nomi o viceversa. Controlla lo spazio dei nomi di entrambi gli oggetti e assicurati che corrispondano.
Una volta che HorizontalPodAutoscaler individua correttamente la destinazione, la condizione
AbleToScale
diventa True
e il messaggio cambia in: the
HorizontalPodAutoscaler controller was able to get the target's current scale
.
Errore: impossibile calcolare il conteggio delle repliche
Potresti visualizzare questo errore quando HorizontalPodAutoscaler deve calcolare lo scaling in base all'utilizzo delle risorse, ma non dispone delle informazioni di base necessarie dai pod.
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:
Horizontal Pod Autoscaler 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,
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
spec:
containers:
- name: example-container
...
resources:
requests:
cpu: "100m"
memory: "128Mi"
Errore: impossibile recuperare le metriche del pod per il pod
Potresti visualizzare questo errore quando si verifica un problema durante il recupero delle metriche necessarie per consentire a HorizontalPodAutoscaler di prendere decisioni di scalabilità. Spesso è correlato alle definizioni delle risorse 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 di destinazione dell'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, assicurati di aver specificato le richieste di risorse per ogni container nel tuo workload.
Risolvi i problemi relativi all'API Metrics e agli errori di disponibilità dei dati
Le seguenti sezioni ti aiutano a risolvere gli errori che si verificano quando
HorizontalPodAutoscaler tenta di recuperare i dati da un'API di metriche. Questi problemi possono
variare da errori di comunicazione del cluster interno, in cui l'API Metrics
non è disponibile, a query non valide rifiutate dal fornitore di metriche (spesso visualizzate come
errori HTTP di livello 400
).
Errore: nessuna versione della metrica disponibile trovata
Sintomi:
Visualizzi 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). Le cause più comuni includono quanto segue:
- Il server API Kubernetes non è temporaneamente 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 per il tuo cluster.
Fai clic su
Notifiche per cercare operazioni in corso come upgrade o riparazioni. Il server API potrebbe non essere disponibile per brevi periodi durante questi orari.
Esamina Cloud Audit Logs per eventuali errori relativi ai componenti del control plane. Per informazioni su come visualizzare questi log, vedi 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
Running
e non abbiano riavvii recenti:kubectl get pods -n custom-metrics,kube-system -o wide
Se lo stato di un pod è diverso da
Running
o se ha un numero elevato di riavvii, esamina il pod per trovare la causa principale. Per suggerimenti per la risoluzione dei problemi, consulta Debug Pods nella documentazione di Kubernetes.Verifica che le API delle metriche siano registrate e disponibili:
kubectl get apiservice | grep metrics.k8s.io
Se le API delle metriche 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 18d
Se la colonna
AVAILABLE
ha il valoreFalse
, la colonnaMessage
nel manifest APIService completo potrebbe fornire maggiori dettagli.Puoi visualizzare il manifest completo con il seguente comando:
kubectl get apiservice API_SERVICE_NAME -o yaml
Sostituisci
API_SERVICE_NAME
con il nome dell'oggetto APIService, ad esempiov1beta1.custom.metrics.k8s.io
.
Errore: la query non restituirà alcuna serie temporale
Sintomi:
Visualizzi 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 (il che è diverso dal
trovare una metrica con un valore di 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 Horizontal Pod Autoscaler.
- 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.
Risolvere 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:
Questa sezione descrive in dettaglio come eseguire il debug di questa pipeline, dall'adattatore delle metriche all'origine delle metriche.
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
FailedGetExternalMetric
oFailedGetCustomMetric
.
Causa:
Esiste un problema nella pipeline delle metriche personalizzate o esterne.
Risoluzione:
Per eseguire il debug della pipeline, segui questi passaggi:
Verifica che l'adattatore delle metriche sia registrato e disponibile: l'adattatore delle metriche deve registrarsi con il server dell'API Kubernetes principale per pubblicare 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 visualizzare le voci
v1beta1.custom.metrics.k8s.io
ov1beta1.external.metrics.k8s.io
e un valore diTrue
nella colonnaAvailable
. Ad esempio:NAME SERVICE AVAILABLE AGE v1beta1.metrics.k8s.io kube-system/metrics-server True 18d
Se il valore nella colonna
Available
èFalse
o non è presente, è probabile che l'adattatore si sia arrestato in modo anomalo o sia configurato in modo errato. Controlla i log dei pod dell'adattatore nello spazio dei nomikube-system
ocustom-metrics
per errori relativi a permessi, connettività di rete all'origine della 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 la metrica all'API Kubernetes. Questo comando testa l'intera pipeline, dal server API all'adattatore delle metriche 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 personalizzate dei pod, 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 vengono eseguiti i pod.METRIC_NAME
: il nome della metrica personalizzata o esterna che stai tentando di interrogare. Ad esempio,requests_per_second
oqueue_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
matchLabels
errati. 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-metrics
okube-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 yaml
Sostituisci 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 adattatore (ad esempiocustom-metrics
okube-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_NAME
con il nome del tuo cluster.Aggiungi l'
targetPort
dell'adattatore alla regola:Descrivi la regola attuale per visualizzare le porte consentite esistenti:
gcloud compute firewall-rules describe FIREWALL_RULE_NAME
Sostituisci
FIREWALL_RULE_NAME
con 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_PORT
Sostituisci
ADAPTER_PORT
con la porta di rete su cui è in ascolto l'adattatore delle metriche.
Assicurati che i criteri di rete di Kubernetes non blocchino il traffico verso i pod dell'adattatore delle metriche:
kubectl get networkpolicy -n custom-metrics,kube-system
Esamina le norme per assicurarti che consentano il traffico in entrata dal control plane o dal server API al
ADAPTER_SERVICE
sulADAPTER_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 al pod dell'adattatore: esamina i log del pod dell'adattatore delle metriche o dei pod per individuare errori relativi a chiamate API, autenticazione o recupero delle metriche. Per controllare i log:
Trova il nome del pod dell'adattatore:
kubectl get pods -n ADAPTER_NAMESPACE
Visualizza i relativi log:
kubectl logs ADAPTER_POD_NAME \ -n ADAPTER_NAMESPACE
Sostituisci 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 risiede il pod dell'adattatore (ad esempiocustom-metrics
okube-system
).
Nessun dato nell'origine: la metrica potrebbe non esistere nel sistema di origine. Utilizza uno strumento di monitoraggio, ad esempio 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
Risolvere i problemi relativi al mancato fare lo scale down di Horizontal Pod Autoscaler
Questa sezione ti aiuta a capire perché un HorizontalPodAutoscaler potrebbe non ridurre il tuo workload come previsto.
Sintomi:
HorizontalPodAutoscaler esegue correttamente lo scale up del workload, ma non riesce a eseguire lo scale down anche quando metriche come l'utilizzo della CPU sono basse.
Causa:
Questo comportamento è progettato per impedire l'aumento e la riduzione rapida o la riduzione in base a informazioni incomplete. I due motivi principali sono i seguenti:
- Utilizzo di più metriche: Horizontal Pod Autoscaler esegue lo scale up in base alla metrica che richiede il maggior numero di repliche. Se hai più metriche, il carico di lavoro non verràfare lo scale downo a meno che tutte le metriche indichino che sono necessarie meno repliche. Una metrica che richiede un numero elevato di repliche impedisce la riduzione della scalabilità, anche se le altre sono basse.
- Metriche non disponibili: se una metrica non è più disponibile (spesso visualizzata come
<unknown>
), Horizontal Pod Autoscaler si rifiuta in modo conservativo di ridurre il workload. Non è in grado di determinare se la metrica è mancante perché l'utilizzo è effettivamente pari a zero o perché la pipeline delle metriche è interrotta. Questo problema è comune con le metriche personalizzate basate sulla frequenza (ad esempiomessages_per_second
), che possono interrompere la generazione di report sui dati in assenza di attività, facendo sì che Horizontal Pod Autoscaler consideri la metrica non disponibile e interrompa le operazioni di scale down. - Ritardo di riduzione della scalabilità dal criterio di scalabilità: il campo
behavior
di HorizontalPodAutoscaler consente di configurare i criteri di scalabilità. Il criterio predefinito per lo scale down include una finestra di stabilizzazione di 300 secondi (5 minuti). Durante questa finestra, HorizontalPodAutoscaler non riduce il conteggio delle 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 della scalabilità 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_NAME
Nell'output, cerca nella sezione
Metrics
eventuali metriche con stato<unknown>
e nella sezioneEvents
avvisi comeFailedGetCustomMetric
oFailedGetExternalMetric
. 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 le metriche basate sul misuratore anziché quelle basate sulla frequenza. Una metrica
di tipo indicatore, ad esempio il numero totale di messaggi in una coda (ad esempio,
subscription
onum_undelivered_messages
), riporta costantemente un valore, anche se questo valore è0
, consentendo all'Horizontal Pod Autoscaler di prendere decisioni di scalabilità in modo affidabile. - Assicurati che l'origine della metrica riporti valori pari a zero. Se controlli la metrica personalizzata, configurala in modo che pubblichi un
0
durante i periodi di inattività anziché non inviare alcun dato.
- Se possibile, utilizza le metriche basate sul misuratore anziché quelle basate sulla frequenza. Una metrica
di tipo indicatore, ad esempio il numero totale di messaggi in una coda (ad esempio,
Per i ritardi di riduzione della scalabilità della policy di scalabilità, se la finestra di stabilizzazione predefinita di cinque minuti per le riduzioni della scalabilità è troppo lunga, personalizzala. Analizza la sezione
spec.behavior.scaleDown
del manifest HorizontalPodAutoscaler. Puoi abbassare il valore distabilizationWindowSeconds
per consentire al gestore della scalabilità automatica di fare lo scale downà più rapidamente dopo il calo delle metriche. Per ulteriori informazioni sulla configurazione di queste policy, consulta Policy di scalabilità nella documentazione di Kubernetes.
Passaggi successivi
Se non riesci a trovare una soluzione al tuo problema nella documentazione, consulta la sezione Richiedere assistenza per ulteriore aiuto, inclusi consigli sui seguenti argomenti:
- Aprire una richiesta di assistenza contattando l'assistenza clienti cloud.
- Ricevere assistenza dalla community
ponendo domande su StackOverflow e utilizzando il tag
google-kubernetes-engine
per cercare problemi simili. Puoi anche unirti al canale Slack#kubernetes-engine
per ulteriore assistenza della community. - Apertura di bug o richieste di funzionalità utilizzando lo strumento di monitoraggio dei problemi pubblico.