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 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 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 o faturamento foi ativado no projeto do Google Cloud Platform. Saiba como confirmar que o faturamento está ativado para seu projeto.

Instale as ferramentas de linha de comando a seguir usadas neste tutorial:

  • gcloud é usado para criar e excluir clusters do Kubernetes Engine. gcloud está incluído no SDK do Google Cloud.
  • O kubectl é usado para gerenciar o Kubernetes, o sistema de orquestração de cluster usado pelo Kubernetes Engine. É possível instalar kubectl usando gcloud:
    gcloud components install 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_ENGINE_ZONE]

Criar um cluster

Para criar um cluster do GKE, execute o Kubernetes na versão 1.10 ou superior.

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 (em inglês). 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

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 acessar o Metrics Explorer, faça o seguinte:

  1. No Console do Google Cloud, selecione Monitoring ou use este botão:

    Acessar "Monitoring"

  2. Selecione Resources > Metrics Explorer.

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. 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 da 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]

A seguir

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

Enviar comentários sobre…

Tutoriais do Kubernetes Engine