Fazer 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, mostramos 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 inclui as etapas a seguir:

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

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 Platform.
  2. Crie ou selecione um projeto.
  3. Aguarde a ativação da API e dos serviços relacionados. Isso pode demorar alguns minutos.
  4. Verifique se o faturamento foi ativado para o projeto.

    Saiba como ativar o faturamento

Instale as seguintes ferramentas de linha de comando usadas neste tutorial:

  • O gcloud é usado para criar e excluir clusters do Kubernetes Engine. O gcloud está incluso no SDK do Google Cloud.
  • A kubectl é utilizada para gerenciar o Kubernetes, o sistema de orquestração de clusters do Kubernetes Engine. É possível instalar a kubectl usando a gcloud:
    gcloud components install kubectl

Definir padrões da ferramenta de linha de comando gcloud

Para não perder tempo digitando o código 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 us-central1-b

Criar cluster

Crie um cluster do GKE executando o Kubernetes na versão 1.10 ou posterior.

Implantar aplicativo 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, é preciso conceder 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 o 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 escalona uma Implantação com base no destino e no número de mensagens não confirmadas na assinatura do Pub/Sub.

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 para sua máquina como hpa.yaml e execute:

kubectl apply -f 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

Na seção "Metrics", veja 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 é 9. 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, desde que metricType seja INT64 ou DOUBLE. Para procurar métricas disponíveis, use o explorador de métricas ou a lista de métricas do GCP. No caso de métricas do tipo GAUGE, o valor atual da métrica é usado para escalonamento automático. No caso das métricas DELTA e CUMULATIVE, é usada a taxa da métrica (a alteração da métrica por segundo). Você encontra mais detalhes sobre como a taxa é calculada na documentação do adaptador de métricas personalizadas.

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. A API Kubernetes não permite o uso de barras diagonais em nomes de métricas, é preciso substituí-las por barras verticais (|). 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 opcionalmente 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, metricSelector foi usado para limitar o HPA a considerar apenas as mensagens na assinatura de echo-read. Saiba mais sobre séries temporais e rótulos do Stackdriver e o LabelSelector do Kubernetes.
  • 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, por exemplo, mensagens ou QPS do Pub/Sub. Para outras métricas, como a latência de solicitação média, faz mais sentido especificar um valor de destino global. Você pode fazer isso especificando 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. Basta combinar as métricas do tipo External com outros tipos descritos 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 na especificação do 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 o cluster do GKE executando o seguinte comando:

    gcloud container clusters delete [CLUSTER_NAME]

Próximas etapas

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Tutoriais do Kubernetes Engine