Scala le richieste e i limiti delle risorse dei contenitori


Questa pagina spiega come analizzare e regolare le richieste di CPU e le richieste di memoria di un container in un cluster Google Kubernetes Engine (GKE) utilizzando la scalabilità automatica pod verticale.

Puoi scalare manualmente le risorse dei container tramite la console Google Cloud , analizzare le risorse utilizzando un oggetto VerticalPodAutoscaler o configurare la scalabilità automatica utilizzando la scalabilità automatica verticale dei pod.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installala e poi inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo gcloud components update.

Analizzare le richieste di risorse

Il gestore della scalabilità automatica pod verticale analizza automaticamente i tuoi container e fornisce richieste di risorse suggerite. Puoi visualizzare queste richieste di risorse utilizzando la consoleGoogle Cloud , Cloud Monitoring o Google Cloud CLI.

Console

Per visualizzare le richieste di risorse suggerite nella console Google Cloud , devi avere un workload esistente di almeno 24 ore. Alcuni suggerimenti potrebbero non essere disponibili o pertinenti per determinati carichi di lavoro, ad esempio quelli creati nelle ultime 24 ore, i pod autonomi e le app scritte in Java.

  1. Vai alla pagina Workload nella console Google Cloud .

    Vai a Carichi di lavoro

  2. Nell'elenco dei workload, fai clic sul nome del workload da scalare.

  3. Fai clic su Azioni > Scala > Modifica richieste di risorse.

    La sezione Analizza i dati di utilizzo delle risorse mostra i dati di utilizzo storici che il controller di scalabilità automatica pod verticale ha analizzato per creare le richieste di risorse suggerite nella sezione Modifica le richieste e i limiti delle risorse.

Cloud Monitoring

Per visualizzare le richieste di risorse suggerite in Cloud Monitoring, devi avere un carico di lavoro esistente di cui è stato eseguito il deployment.

  1. Vai alla pagina Esplora metriche nella console Google Cloud .

    Vai a Esplora metriche

  2. Fai clic su Configurazione.

  3. Espandi il menu Seleziona una metrica.

  4. Nel menu Risorsa, seleziona Scalabilità Kubernetes.

  5. Nel menu Categoria metrica, seleziona Scalabilità automatica.

  6. Nel menu Metrica, seleziona Byte per richiesta di replica consigliati e Core per richiesta di replica consigliati.

  7. Fai clic su Applica.

Interfaccia a riga di comando gcloud

Per visualizzare le richieste di risorse suggerite, devi creare un oggetto VerticalPodAutoscaler e un deployment.

  1. Per i cluster Standard, abilita la scalabilità automatica del pod verticale per il tuo cluster. Per i cluster Autopilot, la scalabilità automatica pod verticale è abilitata per impostazione predefinita.

    gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
    

    Sostituisci CLUSTER_NAME con il nome del cluster.

  2. Salva il seguente manifest come my-rec-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-rec-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-rec-deployment
      template:
        metadata:
          labels:
            app: my-rec-deployment
        spec:
          containers:
          - name: my-rec-container
            image: nginx
    

    Questo manifest descrive un Deployment che non ha richieste di CPU o memoria. Il valore containers.name di my-rec-deployment specifica che tutti i pod nel deployment appartengono a VerticalPodAutoscaler.

  3. Applica il manifest al cluster:

    kubectl create -f my-rec-deployment.yaml
    
  4. Salva il seguente manifest come my-rec-vpa.yaml:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: my-rec-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       my-rec-deployment
      updatePolicy:
        updateMode: "Off"
    

    Questo manifest descrive un VerticalPodAutoscaler. Il valore updateMode di Off indica che quando vengono creati i pod, il controller di scalabilità automatica pod verticale analizza le esigenze di CPU e memoria dei container e registra questi suggerimenti nel campo status della risorsa. Il controller di scalabilità automatica pod verticale non aggiorna automaticamente le richieste di risorse per i container in esecuzione.

  5. Applica il manifest al cluster:

    kubectl create -f my-rec-vpa.yaml
    
  6. Dopo un po' di tempo, visualizza VerticalPodAutoscaler:

    kubectl get vpa my-rec-vpa --output yaml
    

    L'output è simile al seguente:

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-rec-container
          lowerBound:
            cpu: 25m
            memory: 262144k
          target:
            cpu: 25m
            memory: 262144k
          upperBound:
            cpu: 7931m
            memory: 8291500k
    ...
    

    Questo output mostra i consigli per le richieste di CPU e memoria.

Imposta manualmente le richieste di risorse del pod

Puoi impostare manualmente le richieste di risorse pod utilizzando la console Google Cloud o kubectl. Utilizza le seguenti best practice per impostare le richieste e i limiti delle risorse del container:

  • Memoria: imposta la stessa quantità di memoria per la richiesta e il limite.
  • CPU: per la richiesta, specifica la CPU minima necessaria per garantire il corretto funzionamento, in base ai tuoi SLO. Imposta un limite di CPU senza limiti.

Console

  1. Vai alla pagina Workload nella console Google Cloud .

    Vai a Carichi di lavoro

  2. Nell'elenco dei workload, fai clic sul nome del workload da scalare.

  3. Fai clic su Azioni > Scala > Modifica richieste di risorse.

    1. La sezione Regola richieste e limiti delle risorse mostra le richieste di CPU e memoria correnti per ogni container, nonché le richieste di CPU e memoria suggerite.
  4. Fai clic su Applica gli ultimi suggerimenti per visualizzare le richieste suggerite per ciascun contenitore.

  5. Fai clic su Salva modifiche.

  6. Fai clic su Conferma.

kubectl

Scalare verticalmente il workload con interruzioni minime

A partire dalla versione 1.33 di Kubernetes, puoi utilizzare il comando kubectl patch per scalare verticalmente il tuo workload aggiornando le risorse assegnate a un container, senza ricreare il pod. Per ulteriori informazioni, inclusi i limiti, consulta la documentazione di Kubernetes sul ridimensionamento delle risorse CPU e memoria.

Per utilizzare il comando kubectl patch, specifica la richiesta di risorse aggiornata nel flag --patch. Ad esempio, per scalare my-app a 800 mCPU, esegui il seguente comando:

kubectl patch pod my-app --subresource resize --patch \
  '{"spec":{"containers":[{"name":"pause", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}'

Scalare verticalmente il carico di lavoro

Per impostare le richieste di risorse per un pod, imposta i valori requests.cpu e memory.cpu nel manifest di Deployment. In questo esempio, modifichi manualmente il Deployment creato in Analizza le richieste di risorse con le richieste di risorse suggerite.

  1. Salva il seguente manifest di esempio come my-adjusted-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-rec-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-rec-deployment
      template:
        metadata:
          labels:
            app: my-rec-deployment
        spec:
          containers:
          - name: my-rec-container
            image: nginx
            resources:
              requests:
                cpu: 25m
                memory: 256Mi
    

    Questo manifest descrive un deployment con due pod. Ogni pod ha un container che richiede 25 millicpu e 256 MiB di memoria.

  2. Applica il manifest al cluster:

    kubectl apply -f my-adjusted-deployment.yaml
    

Imposta automaticamente le richieste di risorse dei pod

La scalabilità automatica verticale dei pod utilizza l'oggetto VerticalPodAutoscaler per impostare automaticamente le richieste di risorse sui pod quando updateMode è Auto. Puoi configurare un VerticalPodAutoscaler utilizzando gcloud CLI o la consoleGoogle Cloud .

Console

Per impostare automaticamente le richieste di risorse, devi disporre di un cluster con la funzionalità di scalabilità automatica del pod verticale abilitata. I cluster Autopilot hanno la funzionalità di scalabilità automatica verticale dei pod abilitata per impostazione predefinita.

Abilita scalabilità automatica pod verticale

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud .

    Vai a Google Kubernetes Engine

  2. Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.

  3. Nella sezione Automazione, fai clic su Modifica per l'opzione Scalabilità automatica verticale dei pod.

  4. Seleziona la casella di controllo Abilita scalabilità automatica pod verticale.

  5. Fai clic su Salva modifiche.

Configura la scalabilità automatica del pod verticale

  1. Vai alla pagina Workload nella console Google Cloud .

    Vai a Carichi di lavoro

  2. Nell'elenco dei workload, fai clic sul nome del deployment per cui vuoi configurare la scalabilità automatica del pod verticale.

  3. Fai clic su Azioni > Scalabilità automatica > Scalabilità automatica verticale dei pod.

  4. Scegli una modalità di scalabilità automatica:

    • Modalità automatica: la scalabilità automatica pod verticale aggiorna le richieste di CPU e memoria durante il ciclo di vita di un pod.
    • Modalità iniziale: la scalabilità automatica pod verticale assegna le richieste di risorse solo al momento della creazione del pod e non le modifica mai in seguito.
  5. (Facoltativo) Imposta i criteri del contenitore. Questa opzione ti consente di assicurarti che il consiglio non venga mai impostato al di sopra o al di sotto di una richiesta di risorse specificata.

    1. Fai clic su Aggiungi norma.
    2. Seleziona Automatico per la Modalità di modifica del contenitore.
    3. In Risorse controllate, seleziona le risorse su cui vuoi scalare automaticamente il contenitore.
    4. Fai clic su Aggiungi regola per impostare uno o più intervalli minimi o massimi per le richieste di risorse del container:
      • Memoria minima consentita: la quantità minima di memoria che il container deve sempre avere, in MiB.
      • CPU consentita minima: la quantità minima di CPU che il container deve sempre avere, in mCPU.
      • Memoria massima consentita: la quantità massima di memoria che il container deve sempre avere, in MiB.
      • CPU consentita massima: la quantità massima di CPU che il container deve sempre avere, in mCPU.
  6. Fai clic su Fine.

  7. Fai clic su Salva.

gcloud

Per impostare automaticamente le richieste di risorse, devi utilizzare un cluster in cui è abilitata la funzionalità di scalabilità automatica verticale dei pod. I cluster Autopilot hanno la funzionalità abilitata per impostazione predefinita.

  1. Per i cluster Standard, abilita la scalabilità automatica pod verticale per il tuo cluster:

    gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
    

    Sostituisci CLUSTER_NAME con il nome del cluster.

  2. Salva il seguente manifest come my-auto-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-auto-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-auto-deployment
      template:
        metadata:
          labels:
            app: my-auto-deployment
        spec:
          containers:
          - name: my-container
            image: registry.k8s.io/ubuntu-slim:0.14
            resources:
              requests:
                cpu: 100m
                memory: 50Mi
            command: ["/bin/sh"]
            args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
    

    Questo manifest descrive un deployment con due pod. Ogni pod ha un container che richiede 100 millicpu e 50 MiB di memoria.

  3. Applica il manifest al cluster:

    kubectl create -f my-auto-deployment.yaml
    
  4. Elenca i pod in esecuzione:

    kubectl get pods
    

    L'output mostra i nomi dei pod in my-deployment:

    NAME                            READY     STATUS             RESTARTS   AGE
    my-auto-deployment-cbcdd49fb-d6bf9   1/1       Running            0          8s
    my-auto-deployment-cbcdd49fb-th288   1/1       Running            0          8s
    
  5. Salva il seguente manifest come my-vpa.yaml:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: my-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       my-auto-deployment
      updatePolicy:
        updateMode: "Auto"
    

    Questo manifest descrive un VerticalPodAutoscaler con le seguenti proprietà:

    • targetRef.name: specifica che qualsiasi pod controllato da un deployment denominato my-deployment appartiene a questo VerticalPodAutoscaler.
    • updateMode: Auto: specifica che il controller di scalabilità automatica pod verticale può eliminare un pod, regolare le richieste di CPU e memoria e quindi avviare un nuovo pod.

    Puoi anche configurare la scalabilità automatica verticale dei pod per assegnare richieste di risorse solo al momento della creazione del pod, utilizzando updateMode: "Initial".

  6. Applica il manifest al cluster:

    kubectl create -f my-vpa.yaml
    
  7. Attendi qualche minuto e visualizza di nuovo i pod in esecuzione:

    kubectl get pods
    

    L'output mostra che i nomi dei pod sono cambiati:

    NAME                                 READY     STATUS             RESTARTS   AGE
    my-auto-deployment-89dc45f48-5bzqp   1/1       Running            0          8s
    my-auto-deployment-89dc45f48-scm66   1/1       Running            0          8s
    

    Se i nomi dei pod non sono cambiati, attendi un po' di più e poi visualizza di nuovo i pod in esecuzione.

Visualizzare le informazioni su un gestore della scalabilità automatica del pod verticale

Per visualizzare i dettagli di un gestore della scalabilità automatica pod verticale:

  1. Visualizza informazioni dettagliate su uno dei tuoi Running Pod:

    kubectl get pod POD_NAME --output yaml
    

    Sostituisci POD_NAME con il nome di uno dei tuoi pod che hai recuperato nel passaggio precedente.

    L'output è simile al seguente:

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        vpaUpdates: 'Pod resources updated by my-vpa: container 0: cpu capped to node capacity, memory capped to node capacity, cpu request, memory request'
    ...
    spec:
      containers:
      ...
        resources:
          requests:
            cpu: 510m
            memory: 262144k
        ...
    

    Questo output mostra che il controller di scalabilità automatica pod verticale ha una richiesta di memoria di 262144 k e una richiesta di CPU di 510 millicpu.

  2. Per informazioni dettagliate su VerticalPodAutoscaler:

    kubectl get vpa my-vpa --output yaml
    

    L'output è simile al seguente:

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-container
          lowerBound:
            cpu: 536m
            memory: 262144k
          target:
            cpu: 587m
            memory: 262144k
          upperBound:
            cpu: 27854m
            memory: "545693548"
    

    Questo output mostra i consigli per le richieste di CPU e memoria e include le seguenti proprietà:

    • target: specifica che, per un funzionamento ottimale,il container deve richiedere 587 millivCPU e 262.144 kilobyte di memoria.
    • lowerBound e upperBound: la scalabilità automatica pod verticale utilizza queste proprietà per decidere se eliminare un pod e sostituirlo con un nuovo pod. Se un pod ha richieste inferiori al limite inferiore o superiori al limite superiore, il gestore della scalabilità automatica pod verticale elimina il pod e lo sostituisce con un pod che soddisfa l'attributo di destinazione.

Disattivare container specifici

Puoi disattivare la scalabilità automatica verticale per specifici container utilizzando gcloud CLI o la console Google Cloud .

Console

Per disattivare la scalabilità automatica verticale per specifici container, devi disporre di un cluster con la funzionalità di scalabilità automatica verticale abilitata. I cluster Autopilot hanno la funzionalità di scalabilità automatica del pod verticale abilitata per impostazione predefinita.

Abilita scalabilità automatica pod verticale

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud .

    Vai a Google Kubernetes Engine

  2. Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.

  3. Nella sezione Automazione, fai clic su Modifica per l'opzione Scalabilità automatica verticale dei pod.

  4. Seleziona la casella di controllo Abilita scalabilità automatica pod verticale.

  5. Fai clic su Salva modifiche.

Configura la scalabilità automatica del pod verticale

  1. Vai alla pagina Workload nella console Google Cloud .

    Vai a Carichi di lavoro

  2. Nell'elenco dei workload, fai clic sul nome del deployment per cui vuoi configurare la scalabilità automatica del pod verticale.

  3. Fai clic su Azioni > Scalabilità automatica > Scalabilità automatica verticale dei pod.

  4. Scegli una modalità di scalabilità automatica:

    • Modalità automatica: la scalabilità automatica pod verticale aggiorna le richieste di CPU e memoria durante il ciclo di vita di un pod.
    • Modalità iniziale: la scalabilità automatica pod verticale assegna le richieste di risorse solo al momento della creazione del pod e non le modifica mai in seguito.
  5. Fai clic su Aggiungi norma.

  6. Seleziona il contenitore per cui vuoi disattivare la funzionalità.

  7. Per la Modalità di modifica del contenitore, seleziona Off.

  8. Fai clic su Fine.

  9. Fai clic su Salva.

gcloud

Per disattivare la scalabilità automatica pod verticale per specifici container, segui questi passaggi:

  1. Salva il seguente manifest come my-opt-vpa.yaml:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: my-opt-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       my-opt-deployment
      updatePolicy:
        updateMode: "Auto"
      resourcePolicy:
        containerPolicies:
        - containerName: my-opt-sidecar
          mode: "Off"
    

    Questo manifest descrive un VerticalPodAutoscaler. Il valore mode: "Off" disattiva i consigli per il contenitore my-opt-sidecar.

  2. Applica il manifest al cluster:

    kubectl apply -f my-opt-vpa.yaml
    
  3. Salva il seguente manifest come my-opt-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-opt-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-opt-deployment
      template:
        metadata:
          labels:
            app: my-opt-deployment
        spec:
          containers:
          - name: my-opt-container
            image: nginx
          - name: my-opt-sidecar
            image: busybox
            command: ["sh","-c","while true; do echo Doing sidecar stuff!; sleep 60; done"]
    
  4. Applica il manifest al cluster:

    kubectl apply -f my-opt-deployment.yaml
    
  5. Dopo un po' di tempo, visualizza il gestore della scalabilità automatica pod verticale:

    kubectl get vpa my-opt-vpa --output yaml
    

    L'output mostra i consigli per le richieste di CPU e memoria:

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-opt-container
    ...
    

    In questo output, sono presenti solo consigli per un contenitore. Non ci sono consigli per my-opt-sidecar.

    Vertical Pod Autoscaler non aggiorna mai le risorse sui container disattivati. Se aspetti qualche minuto, il pod viene ricreato, ma solo un container ha aggiornato le richieste di risorse.

Identificare i carichi di lavoro senza richieste o limiti di risorse

Potresti voler identificare i workload senza limiti e richieste di risorse configurati perché GKE consiglia di impostare limiti e richieste di risorse per tutti i workload come best practice per evitare la terminazione improvvisa dei pod in caso di pressione sulle risorse del nodo e migliorare l'accuratezza dell'allocazione dei costi. La definizione di pod BestEffort o di pod con memoria Burstable potrebbe causare problemi di affidabilità quando un nodo subisce una pressione della memoria. Utilizza le seguenti best practice per impostare le richieste e i limiti delle risorse del container:

  • Memoria: imposta la stessa quantità di memoria per la richiesta e il limite.
  • CPU: per la richiesta, specifica la CPU minima necessaria per garantire il corretto funzionamento, in base ai tuoi SLO. Imposta un limite di CPU senza limiti.

GKE genera approfondimenti e suggerimenti per i workload in esecuzione senza richieste e limiti di risorse.

La tabella seguente descrive gli scenari di configurazione delle risorse che GKE rileva e i criteri per ogni scenario.

Sottotipo di insight Scenario di impostazioni mancante Dettagli
REQUEST_OR_LIMIT_NOT_SET Nessuna richiesta e limite di memoria configurati. (MEMORY_REQUEST_AND_LIMIT_NOT_SET) I pod sono in esecuzione senza che abbiano richieste e limiti di memoria impostati per i relativi container. GKE non può limitare l'utilizzo della memoria e potrebbe terminare improvvisamente questi pod se un nodo è sottoposto a una pressione della memoria, il che potrebbe causare problemi di affidabilità.
REQUEST_OR_LIMIT_NOT_SET Nessun limite di memoria configurato. (MEMORY_LIMIT_NOT_SET) I pod sono in esecuzione senza che siano impostati limiti di memoria per i relativi container. GKE non può limitare l'utilizzo della memoria e potrebbe terminare improvvisamente questi pod se un nodo subisce una saturazione della memoria e l'utilizzo della memoria dei pod supera le richieste, il che potrebbe causare problemi di affidabilità. Devi impostare la stessa quantità di memoria per richieste e limiti per evitare che i pod utilizzino più memoria di quella richiesta.
REQUEST_OR_LIMIT_NOT_SET Nessuna richiesta e limite di CPU configurati. (CPU_REQUEST_AND_LIMIT_NOT_SET) I pod sono in esecuzione senza che siano impostati limiti e richieste di CPU per i container. Ciò aumenta le possibilità di esaurimento delle risorse del nodo, incrementa le probabilità che i pod vengano limitati quando l'utilizzo della CPU del nodo è vicino al limite e potrebbe causare problemi di prestazioni.

Per saperne di più su questi approfondimenti, segui le istruzioni per visualizzare approfondimenti e consigli.

Controllare manualmente richieste e limiti delle risorse

Ti consigliamo di esaminare manualmente quali richieste e limiti delle risorse mancano e devono essere specificati per un determinato workload, in modo da poter aggiornare la configurazione come consigliato.

Per rivedere o aggiornare la configurazione delle richieste e dei limiti delle risorse per un carico di lavoro specifico:

  1. Vai alla pagina Workload nella console Google Cloud .

    Vai a Carichi di lavoro

  2. Nell'elenco dei workload, fai clic sul nome del workload da esaminare.

  3. Fai clic su Azioni > Scala > Modifica richieste di risorse.

    1. La sezione Modifica richieste e limiti di risorse mostra le richieste di CPU e memoria correnti per ogni container.

Passaggi successivi