Configurazione della scalabilità automatica del pod orizzontale


Questa pagina spiega come utilizzare la scalabilità automatica orizzontale dei pod per scalare automaticamente un deployment usando diversi tipi di metriche. Puoi utilizzare le stesse linee guida per configurare un HorizontalPodAutoscaler per qualsiasi oggetto Deployment scalabile.

Prima di iniziare

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

  • Attiva l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installa e poi inizializza gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo gcloud components update.

Versioni API per gli oggetti HorizontalPodAutoscaler

Quando utilizzi la console Google Cloud, gli oggetti HorizontalPodAutoscaler vengono creati utilizzando API autoscaling/v2.

Quando utilizzi kubectl per creare o visualizzare informazioni su Horizontal Pod Autoscaler, puoi: specificare l'API autoscaling/v1 o l'API autoscaling/v2.

  • apiVersion: autoscaling/v1 è l'impostazione predefinita e ti consente di eseguire la scalabilità automatica solo in base all'utilizzo della CPU. Per scalare automaticamente in base ad altre metriche, utilizzando Orario consigliato: apiVersion: autoscaling/v2. L'esempio in Creare il deployment di esempio utilizza apiVersion: autoscaling/v1.

  • apiVersion: autoscaling/v2 è consigliato per la creazione di nuovi oggetti HorizontalPodAutoscaler. Consente di scalare automaticamente in base a più metriche, tra cui personalizzate o esterne. Tutti gli altri esempi in questa pagina utilizzano apiVersion: autoscaling/v2.

Per controllare quali versioni dell'API sono supportate, usa il comando kubectl api-versions.

Puoi specificare quale API utilizzare quando la visualizzazione dei dettagli di un Horizontal Pod Autoscaler che utilizza apiVersion: autoscaling/v2.

Crea il deployment di esempio

Prima di poter creare un Horizontal Pod Autoscaler, devi creare il carico di lavoro che monitora. Gli esempi in questa pagina applicano diverse configurazioni di Horizontal Pod Autoscaler al seguente deployment nginx. Esempi separati mostrano un Horizontal Pod Autoscaler basato su utilizzo delle risorse, su una metrica personalizzata o esterna, e su più metriche.

Salva quanto segue in un file denominato nginx.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          # You must specify requests for CPU to autoscale
          # based on CPU utilization
          requests:
            cpu: "250m"

Questo manifest specifica un valore per le richieste di CPU. Se vuoi scalare automaticamente in base sull'utilizzo di una risorsa in percentuale, devi specificare le richieste risorsa. Se non specifichi le richieste, puoi eseguire la scalabilità automatica in base solo al valore assoluto dell'utilizzo della risorsa, ad esempio milliCPU per l'utilizzo della CPU.

Per creare il deployment, applica il manifest nginx.yaml:

kubectl apply -f nginx.yaml

Il valore spec.replicas del deployment è impostato su 3, quindi vengono dispiacchiati tre pod. Puoi verificarlo utilizzando il comando kubectl get deployment nginx.

Ciascuno degli esempi in questa pagina applica un Horizontal Pod Autoscaler diverso a un deployment nginx di esempio.

Scalabilità automatica in base all'utilizzo delle risorse

Questo esempio crea l'oggetto HorizontalPodAutoscaler per scalare automaticamente il deployment nginx quando l'utilizzo della CPU supera il 50% e garantisce che sia sempre presente un minimo di 1 replica e un massimo di 10 repliche.

Puoi creare Horizontal Pod Autoscaler che abbia come target la CPU utilizzando la console Google Cloud, kubectl apply oppure, solo per la CPU media, il comando kubectl autoscale .

Console

  1. Vai alla pagina Carichi di lavoro nella console Google Cloud.

    Vai a Carichi di lavoro

  2. Fai clic sul nome del deployment nginx.

  3. Fai clic su Azioni > Autoscale.

  4. Specifica i seguenti valori:

    • Numero minimo di repliche: 1
    • Numero massimo di repliche: 10
    • Metrica di scalabilità automatica: CPU
    • Target:50
    • Unità: %
  5. Fai clic su Fine.

  6. Fai clic su Scalabilità automatica.

kubectl apply

Salva il seguente manifest YAML come file denominato nginx-hpa.yaml:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

Per creare l'HPA, applica il manifest utilizzando il seguente comando:

kubectl apply -f nginx-hpa.yaml

kubectl autoscale

Per creare un oggetto HorizontalPodAutoscaler che abbia come target solo l'utilizzo medio della CPU, puoi utilizzare il kubectl autoscale :

kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10

Per ottenere un elenco di Horizontal Pod Autoscaler nel cluster, utilizza il seguente comando:

kubectl get hpa

L'output è simile al seguente:

NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/50%    1         10        3          61s

Per visualizzare i dettagli di Horizontal Pod Autoscaler, puoi utilizzare la console Google Cloud o il comando kubectl.

Console

  1. Vai alla pagina Carichi di lavoro nella console Google Cloud.

    Vai a Carichi di lavoro

  2. Fai clic sul nome del deployment nginx.

  3. Visualizza la configurazione di Horizontal Pod Autoscaler nella sezione Autoscaler.

  4. Per ulteriori dettagli sugli eventi di scalabilità automatica, consulta la scheda Eventi.

kubectl get

Per visualizzare i dettagli sull'Horizontal Pod Autoscaler, puoi utilizzare kubectl get hpa con il flag -o yaml. Il campo status contiene informazioni sul numero corrente di repliche ed eventuali eventi recenti di scalabilità automatica.

kubectl get hpa nginx -o yaml

L'output è simile al seguente:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
      recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
      HPA was able to successfully calculate a replica count from cpu resource utilization
      (percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
      desired count is within the acceptable range"}]'
    autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
  creationTimestamp: "2019-10-30T19:42:43Z"
  name: nginx
  namespace: default
  resourceVersion: "220050"
  selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
  uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  targetCPUUtilizationPercentage: 50
status:
  currentCPUUtilizationPercentage: 0
  currentReplicas: 3
  desiredReplicas: 3

Prima di seguire gli esempi rimanenti in questa pagina, elimina l'HPA:

kubectl delete hpa nginx

Quando elimini Horizontal Pod Autoscaler, il numero di repliche del deployment rimane invariato. Un deployment non torna automaticamente allo stato precedente all'azione di Horizontal Pod Autoscaler applicati.

Scopri di più sull'eliminazione di un Horizontal Pod Autoscaler.

Scalabilità automatica basata sul traffico del bilanciatore del carico

La scalabilità automatica in base al traffico è una funzionalità di GKE che integra gli indicatori di utilizzo del traffico dei bilanciatori del carico per scalare automaticamente i pod.

L'utilizzo del traffico come indicatore di scalabilità automatica potrebbe essere utile, poiché il traffico indicatore principale di carico complementare a CPU e memoria. Da incasso l'integrazione con GKE assicura che la configurazione sia semplice la scalabilità automatica reagisce rapidamente ai picchi di traffico per soddisfare la domanda.

L'autoscaling basato sul traffico è abilitato da Gateway Controller e dalle sue funzionalità di gestione del traffico globale. Per saperne di più, consulta Scalabilità automatica basata sul traffico.

La scalabilità automatica in base al traffico del bilanciatore del carico è disponibile solo per i carichi di lavoro del gateway.

Requisiti

La scalabilità automatica basata sul traffico presenta i seguenti requisiti:

  • Supportata su GKE 1.24 e versioni successive.
  • API Gateway abilitata nel tuo cluster GKE.
  • Supportato per il traffico che passa attraverso i bilanciatori del carico di lavoro di cui è stato eseguito il deployment utilizzando l'API Gateway e gke-l7-global-external-managed, gke-l7-regional-external-managed, gke-l7-rilb o gke-l7-gxlb GatewayClass.

Limitazioni

La scalabilità automatica basata sul traffico presenta le seguenti limitazioni:

  • Non supportato da GatewayClasses (gke-l7-global-external-managed-mc, gke-l7-regional-external-managed-mc, gke-l7-rilb-mc e gke-l7-gxlb-mc) multi-cluster.
  • Non supportata per il traffico che utilizza servizi di tipo ClusterIP o LoadBalancer.
  • L'HPA, il deployment (o un'altra risorsa di destinazione) e il servizio configurati per utilizzare la scalabilità automatica in base al traffico devono essere mappati 1:1:1.

Esegui il deployment della scalabilità automatica in base al traffico

L'esercizio seguente utilizza HorizontalPodAutoscaler per eseguire la scalabilità automatica del deployment store-autoscale in base al traffico che riceve. Un gateway accetta il traffico in entrata da internet per i pod. Il gestore della scalabilità automatica confronta gli indicatori di traffico del gateway con la capacità di traffico per pod configurata nella risorsa di servizio store-autoscale. Generando traffico verso il gateway, puoi influire sul numero di pod di cui viene eseguito il deployment.

Il seguente diagramma mostra come funziona il ridimensionamento automatico in base al traffico:

HorizontalPodAutoscaler esegue lo scaling di un deployment in base al traffico.

Per eseguire il deployment della scalabilità automatica in base al traffico, svolgi i seguenti passaggi:

  1. Per i cluster standard, verifica che le classi Gateway siano installate nel cluster. Per i cluster Autopilot, le classi Gateway sono installate per impostazione predefinita.

    kubectl get gatewayclass
    

    L'output conferma che le risorse GatewayClass di GKE sono pronto per l'uso nel tuo cluster:

    NAME                               CONTROLLER                  ACCEPTED   AGE
    gke-l7-global-external-managed     networking.gke.io/gateway   True       16h
    gke-l7-regional-external-managed   networking.gke.io/gateway   True       16h
    gke-l7-gxlb                        networking.gke.io/gateway   True       16h
    gke-l7-rilb                        networking.gke.io/gateway   True       16h
    

    Se non vedi questo output, abilita l'API Gateway nel tuo cluster GKE.

  2. Esegui il deployment dell'applicazione di esempio e del bilanciatore del carico Gateway nel cluster:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-autoscale.yaml
    

    L'applicazione di esempio crea:

    • Un oggetto Deployment con 2 repliche.
    • Una capacità del servizio con max-rate-per-endpoint impostato su 10. Mentre questa funzionalità è in anteprima, utilizza un'annotazione nel servizio. Quando questa funzione è in disponibilità generale, il Servizio Policy sostituirà l'annotazione. Per saperne di più sulle funzionalità del gateway, consulta Funzionalità GatewayClass.
    • Un gateway esterno per accedere all'applicazione su internet. Per scoprire di più su come utilizzare i bilanciatori del carico Gateway, consulta Eseguire il deployment dei gateway.
    • Una rete HTTPRoute che corrisponde a tutto il traffico e lo invia al server Servizio store-autoscale.

    La Capacità di servizio è un elemento critico quando si utilizza la scalabilità automatica basata sul traffico, determina la quantità di traffico per pod che attiva un evento di scalabilità automatica. La capacità del servizio viene configurata utilizzando l'annotazione del servizio networking.gke.io/max-rate-per-endpoint, che definisce il traffico massimo che un servizio deve ricevere in richieste al secondo per pod. La capacità del servizio è specifica per la tua applicazione. Per ulteriori informazioni, vedi Determinazione della capacità del servizio.

  3. Salva il seguente manifest come hpa.yaml:

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: store-autoscale
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: store-autoscale
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Object
        object:
          describedObject:
            kind: Service
            name: store-autoscale
          metric:
            name: "autoscaling.googleapis.com|gclb-capacity-utilization"
          target:
            averageValue: 70
            type: AverageValue
    

    Questo file manifest descrive un HorizontalPodAutoscaler con le seguenti caratteristiche: proprietà:

    • minReplicas e maxReplicas: consente di impostare il numero minimo e massimo di per questo deployment. In questa configurazione, il numero di pod può essere scalato da 1 a 10 repliche.
    • describedObject.name: store-autoscale: il riferimento alla store-autoscale Servizio che definisce la capacità di traffico.
    • scaleTargetRef.name: store-autoscale: il riferimento alla store-autoscale Deployment che definisce la risorsa scalata dalla Horizontal Pod Autoscaler.
    • averageValue: 70: valore medio target dell'utilizzo della capacità. Questo offre a Horizontal Pod Autoscaler un margine di crescita I pod possono elaborare il traffico in eccesso durante la creazione di nuovi pod.

Horizontal Pod Autoscaler genera il seguente comportamento del traffico:

  • Il numero di pod viene regolato tra 1 e 10 repliche il 70% della tariffa massima per endpoint. Ciò si traduce in 7 RPS per pod quando max-rate-per-endpoint=10.
  • Con oltre 7 RPS per pod, viene fatto lo scale up dei pod fino a raggiungere fino a 10 repliche o fino a quando il traffico medio non raggiunge 7 RPS per pod.
  • Se il traffico viene ridotto, fare lo scale down dei pod viene eseguito a una tariffa ragionevole utilizzando Algoritmo di Horizontal Pod Autoscaler.

Puoi anche implementare un generatore di traffico per convalidare il comportamento della scalabilità automatica in base al traffico.

A 30 RPS, il deployment viene scalato a 5 repliche, in modo che ogni replica idealmente riceve 6 RPS di traffico, ovvero il 60% di utilizzo per pod. Questo è sotto dell'utilizzo target del 70%, per cui i pod vengono scalati in modo appropriato. A seconda delle fluttuazioni del traffico, anche il numero di repliche con scalabilità automatica potrebbe oscillare. Per una descrizione più dettagliata di come viene calcolato il numero di repliche, consulta Comportamento della scalabilità automatica.

Scalabilità automatica basata su una metrica personalizzata o esterna

Per creare gestori della scalabilità automatica orizzontale dei pod per le metriche personalizzate e quelle esterne, consulta Ottimizzare la scalabilità automatica dei pod in base alle metriche.

Scalabilità automatica in base a più metriche

Questo esempio crea un Horizontal Pod Autoscaler che scala automaticamente in base all'utilizzo della CPU e a metrica personalizzata denominata packets_per_second.

Se hai seguito l'esempio precedente e disponi ancora di un Horizontal Pod Autoscaler denominato nginx, eliminalo prima di seguire questo esempio.

Questo esempio richiede apiVersion: autoscaling/v2. Per maggiori informazioni sulle API disponibili, consulta Versioni API per gli oggetti HorizontalPodAutoscaler.

Salva questo manifest YAML come file denominato nginx-multiple.yaml:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 100Mi
  # Uncomment these lines if you create the custom packets_per_second metric and
  # configure your app to export the metric.
  # - type: Pods
  #   pods:
  #     metric:
  #       name: packets_per_second
  #     target:
  #       type: AverageValue
  #       averageValue: 100

Applica il manifest YAML:

kubectl apply -f nginx-multiple.yaml

Una volta creato, Horizontal Pod Autoscaler monitora il deployment nginx per verificare l'utilizzo medio della CPU, l'utilizzo medio della memoria e, se hai rimosso il commento, metrica packets_per_second. Horizontal Pod Autoscaler scala automaticamente il deployment in base il cui valore creerebbe l'evento a scalabilità automatica più grande.

Visualizzazione dei dettagli di Horizontal Pod Autoscaler

Per visualizzare la configurazione e le statistiche di Horizontal Pod Autoscaler, utilizza il comando seguente:

kubectl describe hpa HPA_NAME

Sostituisci HPA_NAME con il nome del tuo oggetto HorizontalPodAutoscaler.

Se Horizontal Pod Autoscaler utilizza apiVersion: autoscaling/v2 e si basa su più , il comando kubectl describe hpa mostra solo la metrica CPU. Per visualizzare tutte le metriche, utilizza invece il seguente comando:

kubectl describe hpa.v2.autoscaling HPA_NAME

Sostituisci HPA_NAME con il nome dell'oggetto HorizontalPodAutoscaler.

Lo stato attuale di ogni Horizontal Pod Autoscaler viene visualizzato nel campo Conditions e negli eventi di scalabilità automatica sono elencate nel campo Events.

L'output è simile al seguente:

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp:                                     Tue, 05 May 2020 20:07:11 +0000
Reference:                                             Deployment/nginx
Metrics:                                               ( current / target )
  resource memory on pods:                             2220032 / 100Mi
  resource cpu on pods  (as a percentage of request):  0% (0) / 50%
Min replicas:                                          1
Max replicas:                                          10
Deployment pods:                                       1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:                                                <none>

Eliminare un Horizontal Pod Autoscaler

Puoi eliminare un Horizontal Pod Autoscaler utilizzando la console Google Cloud o il comando kubectl delete.

Console

Per eliminare Horizontal Pod Autoscaler di nginx:

  1. Vai alla pagina Carichi di lavoro nella console Google Cloud.

    Vai a Carichi di lavoro

  2. Fai clic sul nome del deployment nginx.

  3. Fai clic su Azioni &gt; Scalabilità automatica.

  4. Fai clic su Elimina.

kubectl delete

Per eliminare il Horizontal Pod Autoscaler nginx, utilizza il seguente comando:

kubectl delete hpa nginx

Quando elimini un Horizontal Pod Autoscaler, il deployment o (o un altro oggetto di deployment) rimane nella scala esistente e non torna al numero di repliche nel manifest originale del deployment. Per scalare manualmente il deployment a tre pod, puoi utilizzare il comando kubectl scale:

kubectl scale deployment nginx --replicas=3

Pulizia

  1. Se non lo hai già fatto, elimina Horizontal Pod Autoscaler:

    kubectl delete hpa nginx
    
  2. Elimina il deployment nginx:

    kubectl delete deployment nginx
    
  3. Se vuoi, elimina il cluster.

Risoluzione dei problemi

Questa sezione mostra i passaggi per la risoluzione dei problemi relativi all'utilizzo del pod orizzontale Scalabilità automatica.

Horizontal Pod Autoscaler mostra un errore unable to fetch pod metrics for pod

Quando configuri un Horizontal Pod Autoscaler, potresti visualizzare messaggi di avviso come i seguenti:

unable to fetch pod metrics for pod

È normale vedere questo messaggio all'avvio del server delle metriche. Tuttavia, se continui a visualizzare gli avvisi e noti che i pod non vengono scalati per il tuo carico di lavoro, assicurati di aver specificato le richieste di risorse per ogni contenitore nel tuo carico di lavoro. Per utilizzare i target di percentuale di utilizzo delle risorse con la scalabilità automatica dei pod orizzontale, devi configurare le richieste per quella risorsa per ogni contenitore in esecuzione in ogni pod nel carico di lavoro. In caso contrario, Horizontal Pod Autoscaler non può eseguire i calcoli necessari e non intraprende alcuna azione relativa alla metrica.

Horizontal Pod Autoscaler mostra un evento multiple services selecting the same target of...

Un Horizontal Pod Autoscaler mostra un valore multiple services selecting the same target of <hpa>: <services> errore se rileva che stai utilizzando la scalabilità automatica basata sul traffico con più servizi associati con l'obiettivo dell'Horizontal Pod Autoscaler (in genere un deployment).

La scalabilità automatica in base al traffico supporta solo le configurazioni in cui è associato esattamente un servizio alla risorsa con scalabilità automatica. Consulta Scalabilità automatica in base al traffico del bilanciatore del carico. Il messaggio di errore indica i servizi trovati.

Per risolvere il problema, assicurati che a Horizontal Pod Autoscaler sia associato un solo servizio.

Passaggi successivi