Como fazer o escalonamento automático de implantações com métricas externas

Neste tutorial, demonstramos como fazer o escalonamento automático das cargas de trabalho do GKE com base nas métricas disponíveis no Stackdriver.

Se você quiser fazer escalonamento automático com base na métrica exportada pela carga de trabalho do Kubernetes ou por uma métrica anexada ao objeto do Kubernetes, como pod ou nó, acesse Como fazer escalonamento automático de implantações com métricas personalizadas.

Neste exemplo, você vê o escalonamento automático com base no número de mensagens não entregues em uma assinatura do Cloud Pub/Sub, mas as instruções podem ser aplicadas a qualquer métrica disponível no Stackdriver.

Objetivos

Este tutorial abrange as seguintes tarefas:

  1. Como implantar o adaptador de métricas personalizadas do Stackdriver.
  2. Como implantar um recurso HorizontalPodAutoscaler (HPA) para escalonar a implantação com base na métrica do Stackdriver a partir de outro serviço do Google Cloud.

Antes de começar

Siga estas etapas para ativar a API do Kubernetes Engine:
  1. Acesse a página do Kubernetes Engine no Console do Google Cloud.
  2. Crie ou selecione um projeto.
  3. Aguarde a ativação da API e dos serviços relacionados. Isso pode levar alguns minutos.
  4. Verifique se a cobrança está ativada para o seu projeto do Google Cloud. Saiba como confirmar se a cobrança está ativada para o seu projeto.

Neste tutorial, você usará o Cloud Shell, que vem pré-instalado com as ferramentas de linha de comando gcloud e kubectl.

Definir padrões para a ferramenta de linha de comando gcloud

Para poupar tempo, em vez de digitar o ID do projeto e as opções de zona do Compute Engine na ferramenta de linha de comando gcloud, defina os padrões:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

Criar um cluster

Crie um cluster do GKE.

Implantar aplicativo de assinante do Pub/Sub

Para executar o aplicativo usando o Cloud Pub/Sub, você precisa criar uma conta de serviço do Google Cloud e fornecer credenciais ao seu aplicativo. Isso é abordado no tutorial Como autenticar no Cloud Platform usando contas de serviço.

As etapas a seguir mostrarão como escalonar automaticamente a implantação criada em Como autenticar no Cloud Platform usando contas de serviço. É preciso concluir as etapas de 1 a 6 desse tutorial antes de continuar.

Etapa 1: implantar o adaptador de métricas personalizadas do Stackdriver

Para conceder aos objetos do GKE acesso a métricas armazenadas no Stackdriver, você precisa implantar o adaptador de métricas personalizadas do Stackdriver.

Para executar o adaptador de métricas personalizadas, conceda ao usuário a capacidade de criar os papéis de autorização exigidos executando o seguinte comando:

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

Para implantar o adaptador no cluster, execute o seguinte comando:

kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml

Etapa 2: criar um objeto HorizontalPodAutoscaler

Depois de implantar o adaptador de métricas personalizadas do Stackdriver, você pode implantar um HorizontalPodAutoscaler para escalonar automaticamente sua implantação.

O arquivo de manifesto a seguir descreve um objeto HorizontalPodAutoscaler que dimensiona uma implantação no destino baseada no número de mensagens não confirmadas na assinatura do Pub/Sub.

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: pubsub
spec:
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - external:
      metricName: pubsub.googleapis.com|subscription|num_undelivered_messages
      metricSelector:
        matchLabels:
          resource.labels.subscription_id: echo-read
      targetAverageValue: "2"
    type: External
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: pubsub

Para implantar esse manifesto, faça o download na sua máquina como pubsub-hpa.yaml e execute o seguinte comando:

kubectl apply -f pubsub-hpa.yaml

Etapa 3: gerar carga

O aplicativo de amostra implantado neste exemplo processa uma única mensagem a cada poucos segundos. Ao publicar continuamente, você poderá causar o enfileiramento das mensagens, o que acionará o escalonamento automático. Use o seguinte comando para publicar 200 mensagens no tópico do Pub/Sub:

for i in {1..200}; do gcloud pubsub topics publish echo --message="Autoscaling #${i}"; done

Etapa 4: observar o HPA criando réplicas adicionais do seu aplicativo

Você pode verificar o número atual de réplicas da sua implantação executando:

kubectl get deployment pubsub

Você também pode inspecionar o estado e a atividade recente do HPA executando:

kubectl describe hpa pubsub

Saída:

Name:                                                                                    pubsub
...
Metrics:                                                                                 ( current / target )
"pubsub.googleapis.com|subscription|num_undelivered_messages" (target average value):  2250m / 2
Min replicas:                                                                            1
Max replicas:                                                                            4
Conditions:
Type            Status  Reason            Message
----            ------  ------            -------
AbleToScale     True    SucceededRescale  the HPA controller was able to update the target scale to 4
ScalingActive   True    ValidMetricFound  the HPA was able to successfully calculate a replica count from external metric pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id: echo-read,},MatchExpressions:[],})
ScalingLimited  True    TooManyReplicas   the desired replica count is more than the maximum replica count
Events:
Type    Reason             Age   From                       Message
----    ------             ----  ----                       -------
Normal  SuccessfulRescale  7s    horizontal-pod-autoscaler  New size: 4; reason:
external metric
pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id:
echo-read,},MatchExpressions:[],}) above target

A seção "Métricas" fornece o último valor da métrica observada pelo HPA. Valores fracionários são representados como miliunidades. Por exemplo, na saída acima há quatro réplicas de aplicativo, e o número atual de mensagens não confirmadas na assinatura do Pub/Sub é nove. Assim, o número médio de mensagens por réplica é 2,25 ou 2.250 m.

Na seção "Conditions", aparece se o HorizontalPodAutoscaler pode ou não escalonar. No exemplo acima, vemos na condição ScalingLimited que o número de réplicas está no valor máximo permitido e o HPA não aumentará mais.

Finalmente, o HPA cria um evento (consulte a seção "Events" na saída acima) toda vez que ele altera o número de réplicas do seu aplicativo. No exemplo acima, o número de réplicas foi alterado para quatro, porque o número de mensagens não confirmadas estava acima da meta.

Como usar uma métrica diferente

Qualquer métrica disponível no Stackdriver pode ser usada para escalonamento automático, contanto que metricType seja INT64 ou DOUBLE. Para procurar as métricas disponíveis, use o Metrics Explorer ou a lista de métricas do GCP. No caso de métricas do tipo GAUGE o valor atual de métrica é usado para o escalonamento automático. No caso de DELTA e CUMULATIVE, é usada a taxa de métrica que representa a alteração de métrica por segundo. Você encontra mais detalhes sobre como a taxa é calculada na documentação do adaptador de métricas personalizadas (em inglês).

Para visualizar as métricas de um recurso monitorado usando o Metrics Explorer, faça o seguinte:

  1. No Console do Google Cloud, acesse Monitoring ou use o botão
    Acessar Monitoring
  2. No painel de navegação do Monitoring, clique em Metrics Explorer.
  3. Digite o nome do recurso monitorado na caixa de texto Localizar tipo de recurso e métrica.

Como escrever especificação de métrica externa

Depois de escolher uma métrica para escalonamento automático, você precisa escrever uma especificação de métrica externa para HorizontalPodAutoscaler. Para isso, você precisa especificar três campos:

  • metricName é o nome da métrica. Como a API Kubernetes não permite o uso de barras em diagonal em nomes de métricas, você precisa substituí-las por símbolos de barra vertical (|). Observe como pubsub.googleapis.com/subscription/num_undelivered_messages foi especificado como pubsub.googleapis.com|subscription|num_undelivered_messages neste tutorial.
  • metricSelector pode ser usado para selecionar uma série temporal específica da métrica. Se metricSelector corresponder a várias séries temporais, a soma dos respectivos valores será usada para escalonamento automático. Neste tutorial, o metricSelector foi usado para limitar o HPA a levar apenas as mensagens na inscrição echo-read em consideração. Saiba mais sobre rótulos e séries temporais do Stackdriver e o LabelSelector do Kubernetes (em inglês).
  • targetAverageValue especifica quanto de um valor total de métrica cada réplica pode processar. Isso é útil ao usar métricas que descrevem algum trabalho ou recurso que pode ser dividido entre réplicas, como QPS ou mensagens do Pub/Sub. Para outras métricas, como a latência média de solicitação, faz mais sentido especificar um valor de destino global. Para fazer isso, especifique targetValue em vez de targetAverageValue.

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

É possível usar várias métricas com um único HorizontalPodAutoscaler, combinando métricas externas e outras descritas em Como fazer escalonamento automático de implantações com métricas personalizadas. Para fazer isso, especifique cada métrica que você quer usar como uma entrada separada na lista metrics da especificação de seu objeto HPA. O HPA calculará o número de réplicas com base em cada métrica e escolherá a mais alta.

Como fazer a limpeza

Para evitar que os recursos usados neste tutorial sejam cobrados na conta do Google Cloud Platform:

  1. Remova a inscrição e o tópico do Pub/Sub:

    gcloud pubsub subscriptions delete echo-read
    gcloud pubsub topics delete echo
    
  2. Exclua seu cluster do GKE:

    gcloud container clusters delete cluster-name
    

A seguir