Como configurar o escalonamento automático de pod horizontal

Nesta página, explicamos como usar um escalonador automático de pod horizontal (HPA, em inglês) para escalonar automaticamente uma implantação usando diferentes tipos de métricas. É possível usar as mesmas diretrizes para configurar um HPA para qualquer objeto de implantação escalonável.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

Defina as configurações padrão da gcloud usando um dos métodos a seguir:

  • Use gcloud init se quiser orientações para definir os padrões.
  • Use gcloud config para definir individualmente a região, a zona e o ID do projeto.

Como usar o gcloud init

Se você receber o erro One of [--zone, --region] must be supplied: Please specify location, conclua esta seção.

  1. Execute gcloud init e siga as instruções:

    gcloud init

    Se você estiver usando SSH em um servidor remoto, utilize a sinalização --console-only para impedir que o comando inicie um navegador:

    gcloud init --console-only
  2. Siga as instruções para autorizar a gcloud a usar sua conta do Google Cloud.
  3. Crie uma nova configuração ou selecione uma atual.
  4. Escolha um projeto do Google Cloud.
  5. Escolha uma zona padrão do Compute Engine para clusters zonais ou uma região para clusters regionais ou do Autopilot.

Como usar o gcloud config

  • Defina o ID do projeto padrão:
    gcloud config set project PROJECT_ID
  • Se você estiver trabalhando com clusters zonais, defina a zona do Compute padrão:
    gcloud config set compute/zone COMPUTE_ZONE
  • Se você estiver trabalhando com clusters do Autopilot ou regionais, defina a região do Compute padrão:
    gcloud config set compute/region COMPUTE_REGION
  • Atualize gcloud para a versão mais recente:
    gcloud components update

Versões da API para objetos HPA

Quando você usa o Google Cloud Console, os objetos HPA são criados usando a API autoscaling/v2beta2.

Quando você usa kubectl para criar ou visualizar informações sobre um HPA, é possível especificar a API autoscaling/v1 ou a API autoscaling/v2beta2.

  • apiVersion: autoscaling/v1 é o padrão e permite que você faça escalonamento automático com base apenas na utilização da CPU. Para fazer escalonamento automático com base em outras métricas, o uso de apiVersion: autoscaling/v2beta2 é recomendado. O exemplo em Como configurar uma implantação usa apiVersion: autoscaling/v1.

  • Recomenda-se apiVersion: autoscaling/v2beta2 para criar novos objetos HPA. Isso permite que você faça escalonamento automático com base em várias métricas, incluindo métricas personalizadas ou externas. Todos os outros exemplos neste tópico usam apiVersion: autoscaling/v2beta2.

Para verificar quais versões da API são compatíveis, use o comando kubectl api-versions.

É possível especificar qual API será usada quando você visualizar detalhes sobre um HPA que usa apiVersion: autoscaling/v2beta2.

Crie a implantação de exemplo

Antes de criar um HPA, você precisa criar a carga de trabalho que ele monitora. Os exemplos neste tópico aplicam configurações diferentes do HPA à seguinte implantação nginx. Outros exemplos mostram um HPA com base na utilização de recursos, em uma métrica personalizada ou externa e em métricas múltiplas.

Salve o seguinte em um arquivo chamado 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"

Este manifesto especifica um valor para solicitações de CPU. Se desejar fazer escalonamento automático com base na utilização de um recurso, como uma porcentagem, especifique solicitações para esse recurso. Se você não especificar solicitações, poderá fazer escalonamento automático com base apenas no valor absoluto da utilização do recurso, como milliCPUs para a utilização da CPU.

Para criar a implantação, aplique o manifesto nginx.yaml:

kubectl apply -f nginx.yaml

A implantação tem spec.replicas definido como três, então três pods são implantados. É possível verificar isso usando o comando kubectl get deployment nginx.

Cada um dos exemplos neste tópico aplica um HPA diferente a um exemplo de implantação do nginx.

Escalonamento automático com base na utilização de recursos

Este exemplo cria um objeto HPA para escalonamento automático da nginximplantação quando a utilização da CPU ultrapassar 50% e garante que sempre haja, no mínimo, uma réplica e, no máximo, dez réplicas.

É possível criar um HPA que segmente a CPU usando o Console do Cloud, o comando kubectl apply ou, somente para a média da CPU, o comando kubectl autoscale.

Console

  1. Acesse o menu de cargas de trabalho do GKE no Console do Cloud.

    Acesse o menu de cargas de trabalho do GKE

  2. Clique no nome da implantação nginx.

  3. Clique em Ações > Escalonamento automático.

  4. Especifique os seguintes valores:

    • Número mínimo de réplicas: 1
    • Número máximo de réplicas: 10
    • Métrica de escalonamento automático: CPU
    • Destino: 50
    • Unidade: %
  5. Clique em Concluído.

  6. Clique em Escalonamento automático.

kubectl apply

Salve o seguinte manifesto YAML como um arquivo chamado 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

Para criar o HPA, aplique o manifesto usando o seguinte comando:

kubectl apply -f nginx-hpa.yaml

kubectl autoscale

Para criar um objeto HPA que segmente somente a utilização média da CPU, é possível usar o comando kubectl autoscale.

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

Para receber uma lista de objetos HPA no cluster, use o seguinte comando:

kubectl get hpa

A saída será assim:

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

Para ver detalhes sobre o HPA, é possível usar o Console do Cloud ou o comando kubectl.

Console

  1. Acesse o menu Cargas de trabalho do Google Kubernetes Engine no Console do Cloud.

    Acessar o menu “Cargas de trabalho”

  2. Clique no nome da implantação nginx.

  3. Veja a configuração do HPA na seção Escalonador automático.

  4. Veja mais detalhes sobre eventos de escalonamento automático na guia Eventos.

kubectl get

Para mais detalhes sobre o HPA, é possível usar kubectl get hpa com a sinalização -o yaml. O campo status contém informações sobre o número atual de réplicas e todos os eventos recentes de escalonamento automático.

kubectl get hpa nginx -o yaml

A saída será assim:

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

Antes de seguir os outros exemplos deste tópico, exclua o HPA:

kubectl delete hpa nginx

Quando você exclui um HPA, o número de réplicas da implantação permanece o mesmo. Uma implantação não volta automaticamente ao estado anterior à aplicação do HPA.

Saiba mais sobre como excluir um HPA.

Como fazer escalonamento automático com base em uma métrica personalizada ou externa

É possível acompanhar tutoriais passo-a-passo para criar HPAs para métricas personalizadas e métricas externas.

Como fazer escalonamento automático com base em várias métricas

Este exemplo cria um HPA que é escalonado automaticamente com base na utilização da CPU e em uma métrica personalizada chamada packets_per_second.

Se você seguiu o exemplo anterior e ainda tem um HPA chamado nginx, exclua-o antes de seguir este exemplo.

Este exemplo requer apiVersion: autoscaling/v2beta2. Para mais informações sobre as APIs disponíveis, consulte Versões da API para objetos HPA.

Salve este manifesto YAML como um arquivo chamado 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

Aplique o manifesto YAML:

kubectl apply -f nginx-multiple.yaml

Quando criado, o HPA monitora a implantação nginx para a utilização média da CPU, a utilização média da memória e, caso tenha removido a marca de comentário, a métrica packets_per_second personalizada. O HPA faz a escalonamento automático da implantação com base na métrica que tem o valor que criaria o maior evento de escalonamento automático.

Como visualizar detalhes sobre um HPA

Para ver a configuração e as estatísticas de um HPA, use o seguinte comando:

kubectl describe hpa hpa-name

Substitua hpa-name pelo nome do objeto HorizontalPodAutoscaler.

Se o HPA usar apiVersion: autoscaling/v2beta2 e for baseado em várias métricas, o comando kubectl describe hpa mostrará apenas a métrica da CPU. Para ver todas as métricas, use o seguinte comando:

kubectl describe hpa.v2beta2.autoscaling hpa-name

Substitua hpa-name pelo nome do objeto HorizontalPodAutoscaler.

O status atual de cada HPA é mostrado no campo Conditions, e os eventos de escalonamento automático são listados no campo Events.

A saída será assim:

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>

Como excluir um HPA

É possível excluir um HPA usando o Console do Cloud ou o comando kubectl delete.

Console

Para excluir o HPA nginx:

  1. Acesse o menu de cargas de trabalho do GKE no Console do Cloud.

    Acesse o menu de cargas de trabalho do GKE

  2. Clique no nome da implantação nginx.

  3. Clique em Ações > Escalonamento automático.

  4. Clique em Excluir.

kubectl delete

Para excluir o HPA nginx, use o seguinte comando:

kubectl delete hpa nginx

Quando você exclui um HPA, a implantação (ou outro objeto de implantação) permanece com o escalonamento existente e não reverte para o número de réplicas no manifesto original da implantação. Para escalonar manualmente a implantação para três pods um outra vez, é possível usar o comando kubectl scale:

kubectl scale deployment nginx --replicas=3

Como fazer a limpeza

  1. Exclua o HPA, caso ainda não tenha feito isso:

    kubectl delete hpa nginx
    
  2. Exclua a implantação nginx:

    kubectl delete deployment nginx
    
  3. Opcionalmente, exclua o cluster.

A seguir