arrow_back

Como configurar o escalonamento automático de pods e pools de nós

Acesse mais de 700 laboratórios e cursos

Como configurar o escalonamento automático de pods e pools de nós

Laboratório 1 hora universal_currency_alt 5 créditos show_chart Introdutório
info Este laboratório pode incorporar ferramentas de IA para ajudar no seu aprendizado.
Acesse mais de 700 laboratórios e cursos

Visão geral

Neste laboratório, você vai configurar um aplicativo no Google Kubernetes Engine (GKE) e usar um HorizontalPodAutoscaler para escalonar automaticamente o aplicativo da Web. Depois, você trabalhará com vários pools de nós de diferentes tipos e aplicará taints e tolerâncias para controlar a programação de pods em relação ao pool de nós subjacente.

Objetivos

Neste laboratório, você aprenderá a fazer o seguinte:

  • Configurar o escalonamento automático e o HorizontalPodAutoscaler
  • Adicionar um pool de nós e configurar taints nos nós para antiafinidade de pods
  • Configurar uma exceção para o taint do nó adicionando uma tolerância ao manifesto do pod

Configuração do laboratório

Acessar o Qwiklabs

Para cada laboratório, você recebe um novo projeto do Google Cloud e um conjunto de recursos por um determinado período e sem custos financeiros.

  1. Faça login no Qwiklabs em uma janela anônima.

  2. Confira o tempo de acesso do laboratório (por exemplo, 1:15:00) e finalize todas as atividades nesse prazo.
    Não é possível pausar o laboratório. Você pode reiniciar o desafio, mas vai precisar refazer todas as etapas.

  3. Quando tudo estiver pronto, clique em Começar o laboratório.

  4. Anote as credenciais (Nome de usuário e Senha). É com elas que você vai fazer login no Console do Google Cloud.

  5. Clique em Abrir Console do Google.

  6. Clique em Usar outra conta, depois copie e cole as credenciais deste laboratório nos locais indicados.
    Se você usar outras credenciais, vai receber mensagens de erro ou cobranças.

  7. Aceite os termos e pule a página de recursos de recuperação.

Depois que você concluir as etapas iniciais de login, o painel do projeto será exibido.

Ative o Google Cloud Shell

O Google Cloud Shell é uma máquina virtual com ferramentas de desenvolvimento. Ele tem um diretório principal permanente de 5 GB e é executado no Google Cloud.

O Cloud Shell oferece acesso de linha de comando aos recursos do Google Cloud.

  1. No console do Cloud, clique no botão "Abrir o Cloud Shell" na barra de ferramentas superior direita.

    Ícone do Cloud Shell em destaque

  2. Clique em Continuar.

O provisionamento e a conexão do ambiente podem demorar um pouco. Quando você estiver conectado, já estará autenticado, e o projeto estará definido com seu PROJECT_ID. Exemplo:

ID do projeto em destaque no terminal do Cloud Shell

A gcloud é a ferramenta de linha de comando do Google Cloud. Ela vem pré-instalada no Cloud Shell e aceita preenchimento com tabulação.

  • Para listar o nome da conta ativa, use este comando:
gcloud auth list

Saída:

Credentialed accounts: - @.com (active)

Exemplo de saída:

Credentialed accounts: - google1623327_student@qwiklabs.net
  • Para listar o ID do projeto, use este comando:
gcloud config list project

Saída:

[core] project =

Exemplo de saída:

[core] project = qwiklabs-gcp-44776a13dea667a6 Observação: a documentação completa da gcloud está disponível no guia com informações gerais sobre a gcloud CLI .

Tarefa 1: Contecte o cluster do GKE do laboratório e implante uma carga de trabalho de amostra

Nesta tarefa, você vai se conectar ao cluster do GKE do laboratório e criar um manifesto de implantação para um conjunto de pods dentro do cluster.

Conecte-se ao cluster do GKE do laboratório

  1. No Cloud Shell, digite o comando a seguir para definir a variável de ambiente da zona e o nome do cluster:
export my_zone={{{project_0.default_zone|ZONE}}} export my_cluster=standard-cluster-1
  1. Configure o preenchimento automático da ferramenta de linha de comando kubectl:
source <(kubectl completion bash)
  1. Configure o acesso ao cluster para o kubectl:
gcloud container clusters get-credentials $my_cluster --zone $my_zone

Implante um aplicativo da Web de amostra no cluster do GKE

Implante um aplicativo de amostra no cluster usando o arquivo de implantação web.yaml criado para você:

apiVersion: apps/v1 kind: Deployment metadata: name: web spec: replicas: 1 selector: matchLabels: run: web template: metadata: labels: run: web spec: containers: - image: gcr.io/google-samples/hello-app:1.0 name: web ports: - containerPort: 8080 protocol: TCP resources: # You must specify requests for CPU to autoscale # based on CPU utilization requests: cpu: "250m"

O manifesto cria uma implantação usando a imagem do contêiner do aplicativo da Web de exemplo que detecta em um servidor HTTP na porta 8080.

  1. No Cloud Shell, digite o comando a seguir para clonar o repositório no Cloud Shell do laboratório:
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
  1. Crie um link flexível como atalho para o diretório de trabalho:
ln -s ~/training-data-analyst/courses/ak8s/v1.1 ~/ak8s
  1. Mude para o diretório que contém os arquivos de exemplo deste laboratório:
cd ~/ak8s/Autoscaling/
  1. Para criar uma implantação com base nesse arquivo, execute o seguinte comando:
kubectl create -f web.yaml --save-config
  1. Crie um recurso de serviço do tipo NodePort na porta 8080 para a implantação Web:
kubectl expose deployment web --target-port=8080 --type=NodePort
  1. Verifique se o serviço foi criado e se uma porta do nó foi alocada:
kubectl get service web

O endereço IP e o número da porta podem ser diferentes do exemplo de saída.

Saída:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.11.246.185 8080:32056/TCP 12s

Clique em Verificar meu progresso para conferir o objetivo. Implante um aplicativo da Web de amostra no cluster do GKE

Tarefa 2: configure o escalonamento automático no cluster

Nesta tarefa, você vai configurar o cluster para escalonar automaticamente o aplicativo de amostra implantado antes.

Configure o escalonamento automático

  1. Consulte na lista de implantações se o aplicativo da Web de amostra ainda está em execução:
kubectl get deployment

A saída será semelhante ao exemplo.

Saída:

NAME READY UP-TO-DATE AVAILABLE AGE web 1/1 1 5m48s

Se a implantação Web do aplicativo não for exibida, retorne para a Tarefa 1 e implante-o novamente no cluster.

  1. Configure o aplicativo de amostra para escalonamento automático e defina o número máximo de réplicas como quatro e o mínimo como um, com uma meta de utilização da CPU de 1%. Para isso, execute o seguinte comando:
kubectl autoscale deployment web --max 4 --min 1 --cpu-percent 1

Ao usar kubectl autoscale, especifique o máximo e o mínimo de réplicas para o aplicativo, e a meta de utilização da CPU.

  1. Consulte na lista de implantações se ainda há só uma implantação do aplicativo da Web:
kubectl get deployment

Saída:

NAME READY UP-TO-DATE AVAILABLE AGE web 1/1 1 1 8m21s

Inspecione o objeto HorizontalPodAutoscaler

O comando kubectl escalonamento automático usado na tarefa anterior cria um objeto HorizontalPodAutoscaler que tem como alvo um recurso especificado chamado meta de escalonamento e o dimensiona conforme necessário.

O autoescalador ajusta periodicamente o número de réplicas da meta de escalonamento para corresponder à utilização média da CPU que você especifica ao criá-lo.

  1. Para ver a lista de recursos de HorizontalPodAutoscaler, execute o seguinte comando:
kubectl get hpa

A saída será semelhante ao exemplo.

Saída:

NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE web Deployment/web 0%/1% 1 4 1 1m
  1. Para inspecionar a configuração de HorizontalPodAutoscaler na forma de tabela, execute o seguinte comando:
kubectl describe horizontalpodautoscaler web

A saída será semelhante ao exemplo.

Saída:

Name: web Namespace: default Labels: Annotations: CreationTimestamp: Tue, 08 Sep 2020... Reference: Deployment/web Metrics: ( current / target ) resource cpu on pods (as a percentage of request): 0% (0) / 1% Min replicas: 1 Max replicas: 4 Deployment pods: 1 current / 1 desired Conditions: Type Status Reason Message ---- ------ ------ ------- AbleToScale True ScaleDownStabilized recent recommendations [...] ScalingActive True ValidMetricFound the HPA was able to [...] ScalingLimited False DesiredWithinRange the desired count [...] Events:
  1. Para conferir a configuração de HorizontalPodAutoscaler no formulário YAML, execute o seguinte comando:
kubectl get horizontalpodautoscaler web -o yaml

A saída será semelhante ao exemplo.

Saída:

apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: annotations: autoscaling.alpha.kubernetes.io/conditions: [...] autoscaling.alpha.kubernetes.io/current-metrics: [...] creationTimestamp: 2018-11-14T02:59:28Z name: web namespace: default resourceVersion: "14588" selfLink: /apis/autoscaling/v1/namespaces/[...] spec: maxReplicas: 4 minReplicas: 1 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web targetCPUUtilizationPercentage: 1 status: currentCPUUtilizationPercentage: 0 currentReplicas: 1 desiredReplicas: 1

Teste a configuração de escalonamento automático

É necessário criar uma carga grande no aplicativo da Web para forçá-lo a fazer o escalonamento horizontal. Crie um arquivo de configuração que defina uma implantação de quatro contêineres que executem um loop infinito de consultas HTTP no servidor do aplicativo da Web de amostra.

Crie a carga no aplicativo da Web implantando o aplicativo loadgen com o arquivo loadgen.yaml que você recebeu.

apiVersion: apps/v1 kind: Deployment metadata: name: loadgen spec: replicas: 4 selector: matchLabels: app: loadgen template: metadata: labels: app: loadgen spec: containers: - name: loadgen image: k8s.gcr.io/busybox args: - /bin/sh - -c - while true; do wget -q -O- http://web:8080; done
  1. Para implantar o contêiner, execute o seguinte comando:
kubectl apply -f loadgen.yaml

Após a implantação do manifesto, o pod Web começará a ser escalonado.

Clique em Verificar meu progresso para conferir o objetivo. Como implantar o aplicativo loadgen

  1. Consulte na lista de implantações se o gerador de carga está em execução:
kubectl get deployment

A saída será semelhante ao exemplo.

Saída:

NAME READY UP-TO-DATE AVAILABLE AGE loadgen 4/4 4 4 26s web 1/1 1 1 14m
  1. Inspecione HorizontalPodAutoscaler:
kubectl get hpa

Quando o pod loadgen começar a gerar tráfego, o uso de CPU da implantação Web começará a aumentar. No exemplo de saída, as metas estão agora com 35% de utilização da CPU em comparação com o limite de 1% da CPU.

Saída:

NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE web Deployment/web 35%/1% 1 4 1 8m
  1. Após alguns minutos, inspecione HorizontalPodAutoscaler novamente:
kubectl get hpa

O escalonador automático aumentou a implantação Web para quatro réplicas.

Saída:

NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE web Deployment/web 88%/1% 1 4 4 9m
  1. Para interromper a carga no aplicativo da Web, escalone a implantação do loadgen para zero réplicas:
kubectl scale deployment loadgen --replicas 0
  1. Consulte na lista de implantações se o loadgen foi reduzido:
kubectl get deployment

A implantação do loadgen precisa ter zero réplicas.

Saída:

NAME READY UP-TO-DATE AVAILABLE AGE loadgen 0/0 0 0 3m40s web 2/4 4 2 18m Observação: aguarde de dois a três minutos para listar as implantações novamente.
  1. Consulte na lista de implantações se o aplicativo da Web foi reduzido para a configuração de valor mínimo de uma réplica que você criou quando implantou o escalonador automático:
kubectl get deployment

Agora você terá uma implantação do aplicativo da Web.

Saída:

NAME READY UP-TO-DATE AVAILABLE AGE loadgen 0/0 0 0 12m web 1/1 1 1 14m

Tarefa 3: gerencie os pools de nós

Nesta tarefa, você criará um novo pool de nós usando instâncias preemptivas. Em seguida, restringirá a implantação Web para executar somente nos nós preemptivos.

Adicione um pool de nós

  1. Para implantar um novo pool de nós com três instâncias de VM preemptiva, execute o seguinte comando:
gcloud container node-pools create "temp-pool-1" \ --cluster=$my_cluster --zone=$my_zone \ --num-nodes "2" --node-labels=temp=true --preemptible

Caso receba uma mensagem de erro informando que não há instâncias preemptivas disponíveis, remova a opção -preemptible para continuar com o laboratório.

  1. Consulte na lista se os novos nós estão prontos:
kubectl get nodes

Agora você terá 4 nós.

Os nomes serão diferentes do exemplo de saída.

Saída:

NAME STATUS ROLES AGE VERSION gke-standard-cluster-1-default-pool...xc Ready 33m v1.19.10-gke.1600 gke-standard-cluster-1-default-pool...q8 Ready 33m v1.19.10-gke.1600 gke-standard-cluster-1-temp-pool-1-...vj Ready 32s v1.19.10-gke.1600 gke-standard-cluster-1-temp-pool-1-...xj Ready 37s v1.19.10-gke.1600

Todos os nós adicionados têm o rótulo temp=true porque você o definiu ao criar o pool de nós. Com o rótulo, é mais fácil localizar e configurar os nós.

  1. Para listar somente os nós com o rótulo temp=true, execute o seguinte comando:
kubectl get nodes -l temp=true

Você verá somente os dois nós adicionados.

Os nomes serão diferentes do exemplo de saída.

Saída:

NAME STATUS ROLES AGE VERSION gke-standard-cluster-1-temp-pool-1-...vj Ready 3m26s v1.19.10-gke.1600 gke-standard-cluster-1-temp-pool-1-...xj Ready 3m31s v1.19.10-gke.1600

Controle a programação com taints e tolerâncias

Para impedir o programador de executar um pod nos nós temporários, adicione um taint a cada um dos nós no pool temporário. Os taints são implementados como um par de chave-valor com um efeito, como NoExecute, que determina se é possível executar os pods em um nó específico. Somente os nós configurados para tolerar a chave-valor do taint são programados para serem executados nesses nós.

  1. Para adicionar um taint a cada um dos nós recém-criados, execute o seguinte comando.

Use o rótulo temp=true para aplicar essa alteração a todos os novos nós simultaneamente:

kubectl taint node -l temp=true nodetype=preemptible:NoExecute

Para que os pods do aplicativo executem nos nós com taint, adicione uma chave de tolerância à configuração da implantação.

  1. Para editar o arquivo web.yaml, execute o seguinte comando:
nano web.yaml
  1. Adicione a seguinte chave à seção spec do modelo:
tolerations: - key: "nodetype" operator: Equal value: "preemptible"

Essa seção é semelhante ao exemplo:

... spec: tolerations: - key: "nodetype" operator: Equal value: "preemptible" containers: - image: gcr.io/google-samples/hello-app:1.0 name: web ports: - containerPort: 8080 protocol: TCP resources: # You must specify requests for CPU to autoscale # based on CPU utilization requests: cpu: "250m"
  1. Para forçar a implantação Web a usar o novo pool de nós, adicione uma chave nodeSelector à seção spec do modelo. Ela é paralela à chave de tolerância que você adicionou:
nodeSelector: temp: "true" Observação: o GKE adiciona um rótulo personalizado a cada nó chamado cloud.google.com/gke-nodepool que inclui o nome do pool a que o nó pertence. A chave também pode ser usada como parte de um nodeSelector para garantir que os pods sejam implantados somente nos nós adequados.

A implantação completa de web.yaml é semelhante ao seguinte:

apiVersion: apps/v1 kind: Deployment metadata: name: web spec: replicas: 1 selector: matchLabels: run: web template: metadata: labels: run: web spec: tolerations: - key: "nodetype" operator: Equal value: "preemptible" nodeSelector: temp: "true" containers: - image: gcr.io/google-samples/hello-app:1.0 name: web ports: - containerPort: 8080 protocol: TCP resources: # You must specify requests for CPU to autoscale # based on CPU utilization requests: cpu: "250m"
  1. Pressione CTRL+X e, depois, Y e Enter para salvar o arquivo e sair do editor nano.

  2. Para aplicar a alteração, execute o seguinte comando:

kubectl apply -f web.yaml

Se houver problemas ao editar o arquivo, use o arquivo de amostra pré-preparado chamado web-tolerations.yaml.

Clique em Verificar meu progresso para conferir o objetivo. Gerencie os pools de nós

  1. Abra a lista de pods:
kubectl get pods

Talvez os nomes sejam diferentes do exemplo de saída.

Saída:

NAME READY STATUS RESTARTS AGE web-7cb566bccd-pkfst 1/1 Running 0 1m
  1. Para confirmar a mudança, inspecione o pod Web em execução usando o seguinte comando:
kubectl describe pods -l run=web

A seção Tolerância com nodetype=preemptible na lista aparecerá perto da parte de baixo da saída truncada.

Saída:

Node-Selectors: temp=true Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s nodetype=preemptible Events:

A resposta confirma que os pods conseguem tolerar o valor do taint nos novos nós preemptivos. Assim, será possível programá-los para execução nesses nós.

  1. Para forçar o aplicativo da Web a escalonar horizontalmente outra vez, escalone a implantação de loadgen para quatro réplicas:
kubectl scale deployment loadgen --replicas 4

Você tem a opção de escalonar só o aplicativo da Web diretamente; no entanto, ao usar o aplicativo loadgen, é possível ver como as diferentes configurações de taint, tolerância e nodeSelector que se aplicam aos aplicativos da Web e loadgen afetam os nós em que estão programadas.

  1. Consulte a lista de pods que usam o formato de saída largo para mostrar os nós que executam os pods:
kubectl get pods -o wide

Esse comando mostra que o aplicativo loadgen é executado somente nos nós default-pool, enquanto o aplicativo da Web é executado somente nos nós preemptivos em temp-pool-1.

A configuração de taint impede a execução dos pods nos nós preemptivos. Assim, o aplicativo loadgen só será executado no pool padrão. A configuração de tolerância permite executar o aplicativo da Web nos nós preemptivos. O nodeSelector força os pods do aplicativo da Web a serem executados nesses nós.

NAME READY STATUS [...] NODE Loadgen-x0 1/1 Running [...] gke-xx-default-pool-y0 loadgen-x1 1/1 Running [...] gke-xx-default-pool-y2 loadgen-x3 1/1 Running [...] gke-xx-default-pool-y3 loadgen-x4 1/1 Running [...] gke-xx-default-pool-y4 web-x1 1/1 Running [...] gke-xx-temp-pool-1-z1 web-x2 1/1 Running [...] gke-xx-temp-pool-1-z2 web-x3 1/1 Running [...] gke-xx-temp-pool-1-z3 web-x4 1/1 Running [...] gke-xx-temp-pool-1-z4

Finalize o laboratório

Clique em Terminar o laboratório após a conclusão. O Google Cloud Ensina remove os recursos usados e limpa a conta por você.

Você vai poder avaliar sua experiência no laboratório. Basta selecionar o número de estrelas, digitar um comentário e clicar em Enviar.

O número de estrelas indica o seguinte:

  • 1 estrela = muito insatisfeito
  • 2 estrelas = insatisfeito
  • 3 estrelas = neutro
  • 4 estrelas = satisfeito
  • 5 estrelas = muito satisfeito

Feche a caixa de diálogo se não quiser enviar feedback.

Para enviar seu feedback, fazer sugestões ou correções, use a guia Suporte.

Copyright 2020 Google LLC. Todos os direitos reservados. Google e o logotipo do Google são marcas registradas da Google LLC. Todos os outros nomes de produtos e empresas podem ser marcas registradas das respectivas empresas a que estão associados.

Antes de começar

  1. Os laboratórios criam um projeto e recursos do Google Cloud por um período fixo
  2. Os laboratórios têm um limite de tempo e não têm o recurso de pausa. Se você encerrar o laboratório, vai precisar recomeçar do início.
  3. No canto superior esquerdo da tela, clique em Começar o laboratório

Usar a navegação anônima

  1. Copie o nome de usuário e a senha fornecidos para o laboratório
  2. Clique em Abrir console no modo anônimo

Fazer login no console

  1. Faça login usando suas credenciais do laboratório. Usar outras credenciais pode causar erros ou gerar cobranças.
  2. Aceite os termos e pule a página de recursos de recuperação
  3. Não clique em Terminar o laboratório a menos que você tenha concluído ou queira recomeçar, porque isso vai apagar seu trabalho e remover o projeto

Este conteúdo não está disponível no momento

Você vai receber uma notificação por e-mail quando ele estiver disponível

Ótimo!

Vamos entrar em contato por e-mail se ele ficar disponível

Um laboratório por vez

Confirme para encerrar todos os laboratórios atuais e iniciar este

Use a navegação anônima para executar o laboratório

Para executar este laboratório, use o modo de navegação anônima ou uma janela anônima do navegador. Isso evita conflitos entre sua conta pessoal e a conta de estudante, o que poderia causar cobranças extras na sua conta pessoal.