Configurazione della scalabilità automatica del pod orizzontale

Questa pagina spiega come utilizzare la scalabilità automatica pod orizzontale per scalare automaticamente un deployment utilizzando 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 attività:

  • Assicurati di aver abilitato l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Assicurati di aver installato l'interfaccia a riga di comando di Google Cloud.
  • Configura le impostazioni dell'interfaccia a riga di comando di Google Cloud predefinite per il tuo progetto utilizzando uno dei seguenti metodi:
    • Utilizza gcloud init se vuoi avere istruzioni dettagliate sull'impostazione delle impostazioni predefinite del progetto.
    • Utilizza gcloud config per impostare singolarmente l'ID, la zona e l'area geografica del progetto.

    gcloud init

    1. Esegui gcloud init e segui le istruzioni:

      gcloud init

      Se utilizzi SSH su un server remoto, usa il flag --console-only per impedire l'avvio del comando da parte di un browser:

      gcloud init --console-only
    2. Segui le istruzioni per autorizzare l'interfaccia a riga di comando gcloud a utilizzare il tuo account Google Cloud.
    3. Crea una nuova configurazione o selezionane una esistente.
    4. Scegli un progetto Google Cloud.
    5. Scegli una zona Compute Engine predefinita.
    6. Scegli un'area geografica di Compute Engine predefinita.

    gcloud config

    1. Imposta l'ID progetto predefinito:
      gcloud config set project PROJECT_ID
    2. Imposta l'area geografica di Compute Engine predefinita (ad esempio us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. Imposta la zona Compute Engine predefinita (ad esempio us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. Aggiorna gcloud alla versione più recente:
      gcloud components update

    Impostando le posizioni predefinite puoi evitare errori nell'interfaccia a riga di comando gcloud come One of [--zone, --region] must be supplied: Please specify location:

Versioni API per HorizontalPodAutoscaler oggetti

Quando utilizzi Google Cloud Console, gli oggetti HorizontalPodAutoscaler vengono creati utilizzando l'API autoscaling/v2beta2.

Quando utilizzi kubectl per creare o visualizzare le informazioni su un gestore della scalabilità automatica orizzontale, puoi specificare l'API autoscaling/v1 o l'API autoscaling/v2beta2.

  • apiVersion: autoscaling/v1 è l'impostazione predefinita e consente di scalare automaticamente solo in base all'utilizzo della CPU. Per scalare automaticamente in base ad altre metriche, ti consigliamo di utilizzare apiVersion: autoscaling/v2beta2. L'esempio in Configurazione di un deployment utilizza apiVersion: autoscaling/v1.

  • apiVersion: autoscaling/v2beta2 è consigliato per la creazione di nuovi oggetti HorizontalPodAutoscaler. Consente di applicare la scalabilità automatica in base a più metriche, comprese le metriche personalizzate o esterne. Tutti gli altri esempi in questo argomento utilizzano apiVersion: autoscaling/v2beta2.

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

Puoi specificare l'API da utilizzare durante la visualizzazione dei dettagli di un Horizontal Pod Autoscaler che utilizza apiVersion: autoscaling/v2beta2.

Crea il deployment di esempio

Prima di poter creare un gestore della scalabilità automatica orizzontale dei pod, devi creare il carico di lavoro che monitora. Gli esempi in questo argomento applicano diverse configurazioni Horizontal Pod Autoscaler al seguente deployment nginx. Esempi distinti mostrano un Horizontal Pod Autoscaler che si basa sull'utilizzo delle risorse, si basa su una metrica personalizzata o esterna e si basa 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 CPU. Se vuoi scalare automaticamente in base all'utilizzo di una risorsa in percentuale, devi specificare le richieste per quella risorsa. Se non specifichi richieste, puoi scalare automaticamente solo in base al valore assoluto dell'utilizzo delle risorse, ad esempio le milliCPU per l'utilizzo delle CPU.

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

kubectl apply -f nginx.yaml

Il deployment ha spec.replicas impostato su 3, quindi viene eseguito il deployment di tre pod. Puoi verificarlo usando il comando kubectl get deployment nginx.

Ciascuno degli esempi in questo argomento applica un gestore della scalabilità automatica pod orizzontale diverso a un deployment nginx di esempio.

Scalabilità automatica basata sull'utilizzo delle risorse

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

Puoi creare un gestore della scalabilità automatica orizzontale dei pod che abbia come target la CPU utilizzando Cloud Console, il comando kubectl apply o, solo per la CPU media, il comando kubectl autoscale.

Console

  1. Vai alla pagina Carichi di lavoro in Cloud Console.

    Vai a Carichi di lavoro

  2. Fai clic sul nome del deployment nginx.

  3. Fai clic su Azioni > Scala automaticamente.

  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'HPC, 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 comando kubectl autoscale:

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

Per visualizzare un elenco dei gestori della scalabilità automatica orizzontale dei pod nel cluster, utilizza il comando seguente:

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 sull'Horizontal Pod Autoscaler, puoi utilizzare Cloud Console o il comando kubectl.

Console

  1. Vai alla pagina Carichi di lavoro in Cloud Console.

    Vai a Carichi di lavoro

  2. Fai clic sul nome del deployment nginx.

  3. Visualizza la configurazione di Scalabilità automatica pod orizzontale nella sezione Scalabilità automatica.

  4. Visualizza ulteriori dettagli sugli eventi di scalabilità automatica nella scheda Eventi.

kubectl get

Per ottenere informazioni dettagliate sul gestore della scalabilità automatica orizzontale del pod, puoi utilizzare kubectl get hpa con il flag -o yaml. Il campo status contiene informazioni sul numero corrente di repliche e su eventuali eventi di scalabilità automatica recenti.

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 i restanti esempi in questo argomento, elimina HPA:

kubectl delete hpa nginx

Quando elimini un gestore della scalabilità automatica orizzontale dei pod, il numero di repliche del deployment rimane invariato. Un deployment non torna automaticamente al suo stato prima dell'applicazione del gestore della scalabilità automatica pod orizzontale.

Scopri di più sull'eliminazione di un gestore della scalabilità automatica orizzontale.

Scalabilità automatica basata sul traffico del bilanciatore del carico

La scalabilità automatica basata sul traffico è una funzionalità di GKE che integra gli indicatori di utilizzo del traffico dai bilanciatori del carico alla scalabilità automatica dei pod.

L'utilizzo del traffico come indicatore di scalabilità automatica potrebbe essere utile, dato che il traffico è un indicatore leader del carico complementare a CPU e memoria. L'integrazione integrata con GKE garantisce che la configurazione sia semplice e che la scalabilità automatica reagisca rapidamente ai picchi di traffico per soddisfare la domanda.

La scalabilità automatica basata sul traffico viene abilitata dal controller gateway e dalle sue funzionalità di gestione del traffico globale. Per scoprire di più, consulta Scalabilità automatica basata sul traffico.

La scalabilità automatica basata sul traffico del bilanciatore del carico è disponibile solo per i carico di lavoro del gateway.

Requisiti

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

  • Supportato per GKE versioni 1.22 e successive.
  • Impostazione supportata per il traffico inviato ai bilanciatori del carico tramite il controller GKE Gateway (gke-l7-rilb e gke-l7-gxlb GatewayClass).
  • GatewayClass multi-cluster non supportato (gke-l7-rilb-mc e gke-l7-gxlb-mc).
  • Non supportato per il traffico utilizzando servizi di tipo ClusterIP o LoadBalancer.
  • La funzionalità del servizio deve essere configurata su Servizi.

Eseguire il deployment della scalabilità automatica basata sul traffico

L'esercizio seguente utilizza il HorizontalPodAutoscaler per la scalabilità automatica del deployment store-autoscale in base al traffico ricevuto. Un gateway accetta traffico in entrata da Internet per i pod. Il gestore della scalabilità automatica confronta i segnali di traffico del gateway con la funzionalità di traffico per pod configurata nella risorsa di servizio store-autoscale. La generazione di traffico verso il gateway influisce sul numero di pod di cui è stato eseguito il deployment.

Il seguente diagramma mostra come funziona la scalabilità automatica basata sul traffico:

Scalabilità automatica basata sul traffico

Per il deployment della scalabilità automatica basata sul traffico, segui questi passaggi:

  1. Installa i CRD dell'API Gateway nel cluster. Questo passaggio è necessario affinché il cluster possa utilizzare il controller GKE Gateway.

  2. Verifica che le classi di gateway siano installate:

    kubectl get gatewayclass
    

    L'output conferma che le risorse GatewayClass di GKE sono pronte per essere utilizzate nel cluster:

    NAME          CONTROLLER
    gke-l7-rilb   networking.gke.io/gateway
    gke-l7-gxlb   networking.gke.io/gateway
    
  3. Esegui il deployment dell'applicazione di esempio e del bilanciatore del carico del gateway nel tuo cluster:

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

    L'applicazione di esempio crea:

    • Un deployment con 2 repliche.
    • Una capacità del servizio con max-rate-per-endpoint impostata su 10.
    • Un gateway esterno per l'accesso all'applicazione su Internet. Per saperne di più su come utilizzare i bilanciatori del carico del gateway, consulta Deployment dei gateway.
    • Una route HTTP che corrisponde a tutto il traffico e la invia al servizio store-autoscale.

    La funzionalità del servizio è un elemento fondamentale quando si utilizza la scalabilità automatica basata sul traffico, in quanto determina la quantità di traffico per pod che attiva un evento di scalabilità automatica. È configurata sulla capacità del servizio utilizzando l'annotazione del servizio networking.gke.io/max-rate-per-endpoint, che definisce il traffico massimo che un servizio deve ricevere in un secondo di richieste per pod. La capacità del servizio è specifica per la tua applicazione. Per ulteriori informazioni, consulta la sezione Determinare la capacità del servizio.

  4. Salva il seguente manifest come hpa.yaml:

    apiVersion: autoscaling/v2beta2
    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
    

    Il file manifest descrive un HorizontalPodAutoscaler con le seguenti proprietà:

    • minReplicas e maxReplicas: imposta il numero minimo e massimo di repliche per questo deployment. In questa configurazione, il numero di pod può scalare da 1 a 10 repliche.
    • describedObject.name: store-autoscale: il riferimento al servizio store-autoscale che definisce la capacità del traffico.
    • scaleTargetRef.name: store-autoscale: il riferimento al deployment in store-autoscale che definisce la risorsa scalata dal gestore della scalabilità automatica orizzontale del pod.
    • averageValue: 70: valore medio target dell'utilizzo della capacità. In questo modo, il gestore della scalabilità automatica pod orizzontale ha un margine di crescita in modo che i pod in esecuzione possano elaborare il traffico in eccesso durante la creazione dei nuovi pod.

Il gestore della scalabilità automatica orizzontale dei pod determina il seguente comportamento del traffico:

  • Il numero di pod viene regolato da 1 a 10 repliche per raggiungere il 70% della frequenza massima per endpoint. In questo modo, si ottengono 7 RPS per pod quando max-rate-per-endpoint=10.
  • A più di 7 RPS per pod, i pod vengono ingranditi fino a raggiungere il limite massimo di 10 repliche o finché il traffico medio non è pari a 7 RPS per pod.
  • Se il traffico viene ridotto, i pod scalano a una velocità ragionevole utilizzando l'algoritmo Horizontal Pod Autoscaler.

Puoi anche eseguire il deployment di un generatore di traffico per convalidare il comportamento della scalabilità automatica basata sul traffico.

A 30 RPS, il deployment viene scalato a 5 repliche in modo che ogni replica riceva idealmente 6 RPS di traffico, ovvero il 60% di utilizzo per pod. Questo valore è inferiore all'utilizzo del 70% del target e quindi i pod vengono scalati in modo appropriato. A seconda delle fluttuazioni del traffico, può variare anche il numero di repliche con scalabilità automatica. Per una descrizione più dettagliata di come viene calcolato il numero di repliche, consulta il comportamento di scalabilità automatica.

Scalabilità automatica basata su una metrica personalizzata o esterna

Puoi seguire i tutorial passo passo per creare automaticamente Horizontal Pod Autoscaler per metriche personalizzate e metriche esterne.

Scalabilità automatica basata su più metriche

In questo esempio viene creato un gestore della scalabilità automatica pod orizzontale che esegue la scalabilità automatica in base all'utilizzo della CPU e a una metrica personalizzata denominata packets_per_second.

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

In questo esempio è richiesto apiVersion: autoscaling/v2beta2. Per ulteriori informazioni sulle API disponibili, consulta la sezione Versioni API per oggetti HorizontalPodAutoscaler.

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

apiVersion: autoscaling/v2beta2
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, il gestore della scalabilità automatica orizzontale pod monitora il deployment nginx per l'utilizzo medio della CPU, l'utilizzo medio della memoria e (se non lo hai aggiunto come commento) alla metrica packets_per_second personalizzata. Il gestore della scalabilità automatica pod orizzontale scala automaticamente il deployment in base alla metrica il cui valore creerebbe l'evento di scalabilità automatica più grande.

Visualizzazione dei dettagli su un gestore della scalabilità automatica orizzontale dei pod

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

kubectl describe hpa HPA_NAME

Sostituisci HPA_NAME con il nome del tuo oggetto HorizontalPodAutoscaler.

Se il gestore della scalabilità automatica pod orizzontale utilizza apiVersion: autoscaling/v2beta2 ed è basato su più metriche, il comando kubectl describe hpa mostra solo la metrica CPU. Per visualizzare tutte le metriche, utilizza invece il seguente comando:

kubectl describe hpa.v2beta2.autoscaling HPA_NAME

Sostituisci HPA_NAME con il nome del tuo oggetto HorizontalPodAutoscaler.

Lo stato attuale di ogni pod orizzontale orizzontale del gestore della scalabilità automatica è visualizzato nel campo Conditions, mentre gli eventi di scalabilità automatica sono elencati nel campo Events.

L'output è simile al seguente:

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2beta2","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>

Eliminazione di un gestore della scalabilità automatica pod orizzontale

Puoi eliminare un Horizontal Pod Autoscaler utilizzando Cloud Console o il comando kubectl delete.

Console

Per eliminare il gestore della scalabilità automatica orizzontale nginx:

  1. Vai alla pagina Carichi di lavoro in Cloud Console.

    Vai a Carichi di lavoro

  2. Fai clic sul nome del deployment nginx.

  3. Fai clic su Azioni > Scala automaticamente.

  4. Fai clic su Elimina.

kubectl delete

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

kubectl delete hpa nginx

Quando elimini un gestore della scalabilità automatica orizzontale, il deployment o (o un altro oggetto deployment) rimane alla sua scala esistente e non torna al numero di repliche nel manifest originale del deployment. Per ripristinare manualmente il deployment del deployment a tre pod, puoi utilizzare il comando kubectl scale:

kubectl scale deployment nginx --replicas=3

Pulizia

  1. Elimina il gestore della scalabilità automatica pod orizzontale, se non l'hai ancora fatto:

    kubectl delete hpa nginx
    
  2. Elimina il deployment nginx:

    kubectl delete deployment nginx
    
  3. (Facoltativo) Elimina il cluster.

Risolvere i problemi

Quando configuri un gestore della scalabilità automatica orizzontale,potresti visualizzare messaggi di avviso simili ai seguenti:

unable to fetch pod metrics for pod

È normale vedere questo messaggio all'avvio del server delle metriche. Tuttavia, se continui a vedere gli avvisi e noti che i pod non sono in scala per il carico di lavoro, assicurati di aver specificato richieste di risorse per ogni container nel tuo carico di lavoro. Per utilizzare le destinazioni della percentuale di utilizzo delle risorse con la scalabilità automatica orizzontale dei pod, devi configurare le richieste per quella risorsa per ciascun container in esecuzione in ogni pod nel carico di lavoro. In caso contrario, il gestore della scalabilità automatica pod orizzontale non può eseguire i calcoli necessari e non esegue alcuna azione relativa a tale metrica.

Passaggi successivi