Risoluzione dei problemi relativi alla scalabilità automatica verticale dei pod

Quando la scalabilità automatica verticale dei pod non funziona come previsto in Google Kubernetes Engine (GKE), i workload potrebbero non scalare correttamente. Questi problemi possono impedire alle applicazioni di gestire il carico, il che potrebbe causare problemi di prestazioni o interruzioni. Potresti notare che i pod non vengono riavviati con i nuovi suggerimenti sulle risorse o che i suggerimenti non corrispondono all'utilizzo effettivo.

Utilizza questo documento per risolvere i problemi comuni relativi alla configurazione di VerticalPodAutoscaler o ai suggerimenti imprevisti. Seguire questi passaggi per la risoluzione dei problemi può aiutare le tue applicazioni a scalare in modo efficiente e affidabile in base alla domanda.

Queste informazioni sono importanti per gli sviluppatori di applicazioni che configurano le risorse VerticalPodAutoscaler e devono assicurarsi che le loro applicazioni scalino correttamente. Aiutano anche gli amministratori e gli operatori della piattaforma a risolvere i problemi di configurazione del cluster che influiscono sui workload con scalabilità automatica. Per ulteriori informazioni sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Cloud de Confiance by S3NS contenuti, consulta Ruoli e attività comuni degli utenti di GKE.

Diagnosticare i problemi di VerticalPodAutoscaler

Per diagnosticare i problemi relativi a un VerticalPodAutoscaler, esamina lo stato e la configurazione utilizzando kubectl o la Cloud de Confiance console.

Descrivere VerticalPodAutoscaler

Per visualizzare i calcoli in tempo reale e le decisioni di scalabilità recenti, utilizza il comando kubectl describe vpa:

kubectl describe vpa VPA_NAME -n NAMESPACE_NAME

Sostituisci quanto segue:

  • VPA_NAME: il nome di VerticalPodAutoscaler.
  • NAMESPACE_NAME: lo spazio dei nomi di VerticalPodAutoscaler.

L'output è simile al seguente:

Name:         sample-deployment-vpa
Namespace:    default
API Version:  autoscaling.k8s.io/v1
Kind:         VerticalPodAutoscaler
# Multiple lines are omitted here
Spec:
  Target Ref:
    API Version:  apps/v1
    Kind:         Deployment
    Name:         sample-deployment
  Update Policy:
    Update Mode:  Auto
Status:
  Conditions:
    Last Transition Time:  2025-10-09T10:00:00Z
    Message:               VPA is fetching history in order to provide recommendation
    Reason:                FetchingHistory
    Status:                True
    Type:                  FetchingHistory
    Last Transition Time:  2025-10-09T10:05:00Z
    Message:               VPA pod metrics aren't available yet
    Reason:                NoMetrics
    Status:                True
    Type:                  LowConfidence
    Last Transition Time:  2025-10-09T10:10:00Z
    Message:               VPA is able to provide a recommendation
    Reason:                RecommendationProvided
    Status:                True
    Type:                  RecommendationProvided
  Recommendation:
    Container Recommendations:
      Container Name:  sample-container
      Lower Bound:
        Cpu:     100m
        Memory:  128Mi
      Target:
        Cpu:     200m
        Memory:  256Mi
      Upper Bound:
        Cpu:     500m
        Memory:  512Mi
Events:          <none>

Nell'output, esamina queste sezioni principali:

  • Spec: mostra i dettagli della configurazione, inclusi il campo targetRef (il workload di destinazione) e il campo updatePolicy (la modalità di applicazione degli aggiornamenti).
  • Status: mostra la sezione Conditions (integrità operativa) e la sezione Recommendation (valori delle risorse CPU e memoria generati per ogni container).
  • Events: elenca le azioni o gli errori recenti relativi all'oggetto VerticalPodAutoscaler.

Visualizzare il manifest di VerticalPodAutoscaler

Per visualizzare la configurazione e lo stato completi di un VerticalPodAutoscaler, esamina il relativo manifest YAML utilizzando kubectl o la Cloud de Confiance console:

Console

  1. Nella Cloud de Confiance console, vai alla pagina Browser oggetti.

    Vai al browser oggetti

  2. Fai clic sull'elenco dei filtri Tipo di oggetto.

  3. Cancella le selezioni esistenti.

  4. Seleziona VerticalPodAutoscaler e fai clic su Ok.

  5. Nell'elenco filtrato, seleziona il gruppo API autoscaling.k8s.io.

  6. Seleziona il tipo di oggetto VerticalPodAutoscaler.

  7. Fai clic sul nome di VerticalPodAutoscaler che vuoi esaminare.

kubectl

kubectl get vpa VPA_NAME \
    -n NAMESPACE_NAME \
    -o yaml

Sostituisci quanto segue:

  • VPA_NAME: il nome di VerticalPodAutoscaler.
  • NAMESPACE_NAME: lo spazio dei nomi di VerticalPodAutoscaler.

Controllare lo stato di VerticalPodAutoscaler nella Cloud de Confiance console

Per esaminare lo stato di VerticalPodAutoscaler per i workload nella Cloud de Confiance console:

  1. Vai alla pagina Workload.

    Vai a Workload

  2. Fai clic sul nome del workload.

  3. Vai alla scheda Dettagli e individua la sezione Gestore della scalabilità automatica.

  4. Esamina la riga Gestore della scalabilità automatica pod verticale per i messaggi di stato relativi alla raccolta delle metriche e all'integrità della configurazione.

Raccogliere i log delle decisioni

Per informazioni dettagliate sui calcoli e sulle decisioni di VerticalPodAutoscaler, abilita i log delle decisioni del gestore della scalabilità automatica verticale dei pod (anteprima) in Cloud Logging.

Questi log acquisiscono eventi come UPDATE_RECOMMENDATION, EVICT_POD, APPLY_RECOMMENDATION_IN_PLACE e APPLY_RECOMMENDATION_ON_EVICTION.

Per abilitare ed esaminare i log delle decisioni, consulta Raccogliere i log degli eventi del gestore della scalabilità automatica verticale dei pod.

Risolvere i problemi relativi ai suggerimenti di VerticalPodAutoscaler

Le sezioni seguenti trattano i problemi in cui un VerticalPodAutoscaler non riesce a produrre suggerimenti o genera suggerimenti diversi dalle aspettative.

VerticalPodAutoscaler non fornisce suggerimenti

Sintomi:

  • Il campo Status.Recommendation nel manifest di VerticalPodAutoscaler è vuoto.
  • Le condizioni nel manifest di VerticalPodAutoscaler mostrano le condizioni di stato NoPodsMatched, FetchingHistory o LowConfidence.

Causa:

  • Destinazione errata: il campo spec.targetRef nel manifest di VerticalPodAutoscaler non punta a un workload esistente nello stesso spazio dei nomi.
  • Raccolta iniziale delle metriche: VerticalPodAutoscaler è stato creato di recente e sta ancora raccogliendo i dati sull'utilizzo storico delle risorse.
  • Problemi del componente metrics-server: VerticalPodAutoscaler si basa sulle metriche del componente metrics-server. Se il componente metrics-server non funziona correttamente, VerticalPodAutoscaler non può recuperare i dati di utilizzo.
  • Nessun pod in esecuzione: il workload di destinazione non ha pod in esecuzione o pronti da osservare per VerticalPodAutoscaler.

Risoluzione:

  • Verifica il campo targetRef: controlla i valori dei campi kind, name, e apiVersion nella sezione spec.targetRef. Assicurati che tutti i valori corrispondano al workload di destinazione. Per verificare che il workload esista, esegui:

    kubectl get KIND WORKLOAD_NAME \
        -n NAMESPACE_NAME
    

    Sostituisci quanto segue:

    • KIND: il tipo di workload, ad esempio deployment o statefulset.
    • WORKLOAD_NAME: il nome del workload.
    • NAMESPACE_NAME: lo spazio dei nomi del workload.
  • Concedi tempo per la raccolta delle metriche: le nuove risorse VerticalPodAutoscaler richiedono tempo per raccogliere i dati. Monitora il campo Status.Conditions per una transizione alla condizione di stato RecommendationProvided.

  • Controlla il componente metrics-server:

    1. Verifica che il pod per il componente metrics-server sia in esecuzione:

      kubectl get pods -n kube-system | grep metrics-server
      
    2. Se il pod non è in esecuzione o ha un numero elevato di riavvii, controlla i relativi log:

      kubectl logs -n kube-system -l k8s-app=metrics-server
      

      Le voci di log che contengono parole come error, failed o unable to fetch indicano problemi con la raccolta delle metriche.

  • Assicurati che i pod siano in esecuzione: verifica che il workload di destinazione abbia almeno un pod in esecuzione e pronto.

I suggerimenti di VerticalPodAutoscaler sono imprevisti

Sintomi:

  • I valori di CPU o memoria nella sezione Status.Recommendation sono superiori o inferiori al previsto.
  • I suggerimenti non corrispondono al consumo di risorse del workload osservato.

Causa:

  • Modifiche del comportamento del workload: i suggerimenti di VerticalPodAutoscaler si basano sull'utilizzo storico. Le recenti modifiche ai pattern di consumo delle applicazioni potrebbero non essere ancora riflesse.
  • Caratteristiche del workload: i job di breve durata o i workload con pattern di utilizzo molto irregolari potrebbero non ricevere suggerimenti ottimali.
  • Risorse VerticalPodAutoscaler in conflitto: potrebbero essere configurate più risorse VerticalPodAutoscaler per il targeting dello stesso workload.

Risoluzione:

  • Concedi tempo per la regolazione: concedi a VerticalPodAutoscaler il tempo necessario per apprendere nuovi pattern di utilizzo dopo le modifiche dell'applicazione.
  • Valuta l'idoneità: valuta se un VerticalPodAutoscaler o un Horizontal Pod Autoscaler è più adatto al tipo di workload.
  • Verifica la presenza di risorse VerticalPodAutoscaler in conflitto:

    1. Elenca tutte le risorse VerticalPodAutoscaler nel cluster:

      kubectl get vpa --all-namespaces
      
    2. Esamina il campo spec.targetRef per ogni risorsa. Se più risorse VerticalPodAutoscaler hanno come target lo stesso workload, rimuovi o modifica le risorse in conflitto in modo che un solo VerticalPodAutoscaler abbia come target un determinato workload.

Risolvere i problemi relativi agli aggiornamenti delle risorse dei pod

Le sezioni seguenti trattano i problemi in cui esistono suggerimenti, ma non vengono applicati ai pod di destinazione.

Le richieste di risorse dei pod non vengono aggiornate

Sintomi:

  • Il manifest di VerticalPodAutoscaler mostra i suggerimenti nella sezione Status, ma il campo resources.requests nel manifest del pod non viene aggiornato.
  • I pod non vengono riavviati per applicare i suggerimenti quando si utilizza la modalità di aggiornamento Auto o Recreate.

Causa:

  • Il campo updateMode è Off: quando il campo spec.updatePolicy.updateMode è impostato su Off, VerticalPodAutoscaler genera suggerimenti, ma non li applica.
  • Il workload ha una sola replica: nella modalità di aggiornamento Auto o Recreate, VerticalPodAutoscaler evita di eliminare i workload a replica singola per evitare tempi di inattività.

Risoluzione:

  • Controlla il campo updateMode: modifica il manifest di VerticalPodAutoscaler per impostare il campo spec.updatePolicy.updateMode su Auto, Recreate o InPlaceOrRecreate.
  • Aumenta il numero di repliche: per i workload che utilizzano la modalità di aggiornamento Auto o Recreate, assicurati che il deployment o lo StatefulSet abbia più di una replica.

Gli aggiornamenti in loco non vanno a buon fine o rimangono posticipati

Sintomi:

  • Il ridimensionamento in loco del container non viene completato o rimane posticipato.

Causa:

  • Capacità del nodo insufficiente: se il nodo non ha capacità sufficiente per le richieste di risorse aggiornate, l'operazione di ridimensionamento in loco viene posticipata.

Risoluzione:

  • Verifica lo stato del ridimensionamento posticipato e la capacità del nodo:

    Se il ridimensionamento rimane posticipato per più di cinque minuti, VerticalPodAutoscaler torna all'eliminazione e alla ricreazione del pod per applicare il suggerimento. Per controllare lo stato dell'aggiornamento posticipato:

    1. Esamina le annotazioni dei pod per verificare se l'annotazione vpaInPlaceUpdated è impostata su "true":

      metadata:
        annotations:
          vpaInPlaceUpdated: "true"
          vpaUpdates: 'Pod resources updated by sample-deployment-vpa: container 0: cpu request, memory request'
      
    2. Controlla lo stato posticipato esaminando il campo status.conditions per gli eventi di ridimensionamento posticipato:

      status:
        conditions:
        - type: PodResizePending
          status: "True"
          reason: Deferred
          message: "Node didn't have enough resource: ..."
      
    3. Esamina gli eventi Kubernetes per il pod:

      kubectl get events -n NAMESPACE_NAME --field-selector involvedObject.kind=Pod,involvedObject.name=POD_NAME
      

      Sostituisci quanto segue:

      • NAMESPACE_NAME: lo spazio dei nomi del pod.
      • POD_NAME: il nome del pod.

      Cerca gli eventi con uno dei seguenti motivi: ResizedPod (aggiornamento in loco riuscito) o EvictedByVPA (ritorno alla ricreazione).

Passaggi successivi