Objetivos
- Escalonar uma aplicação usando kubectl.
Escalonando uma aplicação
Nos módulos anteriores, criamos um Deployment, e então o expusemos publicamente através de um serviço (Service). O Deployment criou apenas um único Pod para executar nossa aplicação. Quando o tráfego aumentar, precisaremos escalonar a aplicação para suportar a demanda de usuários.
Se você ainda não tiver estudado as seções anteriores, inicie pelo tutorial Usando Minikube para criar um cluster.
O escalonamento é obtido pela mudança do número de réplicas em um Deployment
NOTA Se você estiver seguindo este tutorial após a seção anterior, poderá ser necessário refazer a seção criando um cluster, pois os serviços podem ter sido removidos.
Resumo:
- Escalonando um Deployment
Você pode criar desde o início um Deployment com múltiplas instâncias usando o parâmetro --replicas do comando kubectl create deployment
Visão geral sobre escalonamento
Escalonar um Deployment garantirá que novos Pods serão criados e alocados em nós de processamento com recursos disponíveis. O escalonamento aumentará o número de Pods para o novo estado desejado. O Kubernetes também suporta o auto-escalonamento (autoscaling) de Pods, mas isso está fora do escopo deste tutorial. Escalonar para zero também é possível, e encerrará todos os Pods do Deployment especificado.
Executar múltiplas instâncias de uma aplicação requer uma forma de distribuir o tráfego entre todas elas. Serviços possuem um balanceador de carga integrado que distribui o tráfego de rede entre todos os Pods de um Deployment exposto. Serviços irão monitorar continuamente os Pods em execução usando endpoints para garantir que o tráfego seja enviado apenas para Pods disponíveis.
O escalonamento é obtido pela mudança do número de réplicas em um Deployment.
Uma vez que você tenha múltiplas instâncias de uma aplicação em execução será possível realizar atualizações graduais no cluster sem que ocorra indisponibilidade. Cobriremos isso no próximo módulo. Agora, vamos ao terminal escalonar nossa aplicação.
Escalonando um Deployment
Para listar seus Deployments, utilize o subcomando
get deployments
:
kubectl get deployments
A saída deve ser semelhante a:
NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1/1 1 1 11m
Teremos um único Pod. Se nenhum Pod aparecer, tente rodar o comando novamente.
- NAME lista os nomes dos Deployments no cluster.
- READY exibe a proporção de réplicas atuais/desejadas (CURRENT/DESIRED).
- UP-TO-DATE exibe o número de réplicas que foram atualizadas para atingir o estado desejado.
- AVAILABLE exibe o número de réplicas da aplicação que estão disponíveis para seus usuários.
- AGE exibe há quanto tempo a aplicação está rodando.
Para ver o ReplicaSet criado pelo Deployment, execute
kubectl get rs
Observe que o nome do ReplicaSet sempre é exibido no formato [NOME-DO-DEPLOYMENT]-[TEXTO-ALEATÓRIO]. O texto aleatório é gerado e utiliza o valor do pod-template-hash como semente.
Duas colunas importantes desta saída são:
- DESIRED exibe o número desejado de réplicas da aplicação, que você define quando cria o objeto Deployment. Este é o estado desejado.
- CURRENT exibe quantas réplicas estão em execução atualmente.
A seguir, vamos escalonar o Deployment para 4 réplicas. Utilizaremos
o comando kubectl scale
, seguido pelo tipo Deployment,
nome e o número desejado de instâncias:
kubectl scale deployments/kubernetes-bootcamp --replicas=4
Para listar seus Deployments mais uma vez, utilize get deployments
:
kubectl get deployments
A mudança foi aplicada, e temos 4 instâncias da aplicação disponíveis. A seguir, vamos verificar se o número de Pods mudou:
kubectl get pods -o wide
Temos 4 Pods agora, com endereços IP diferentes. A mudança foi registrada no log de eventos do Deployment. Para verificar esta mudança, utilize o subcomando describe:
kubectl describe deployments/kubernetes-bootcamp
Você pode ver na saída deste comando que temos 4 réplicas agora.
Balanceamento de carga
Vamos verificar que o Service está efetuando o balanceamento de carga do tráfego recebido. Para encontrar o endereço IP exposto e a porta podemos utilizar o comando para descrever o serviço como aprendemos na seção anterior:
kubectl describe services/kubernetes-bootcamp
Crie uma variável de ambiente chamada NODE_PORT que possui o valor da porta do nó:
export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo NODE_PORT=$NODE_PORT
A seguir, iremos executar o comando curl
para efetuar
uma requisição para o endereço IP e porta expostos. Rode este comando
múltiplas vezes:
curl http://"$(minikube ip):$NODE_PORT"
Cada requisição é atendida por um Pod diferente. Isso demonstra que o balanceamento de carga está funcionando.
Reduzir o número de réplicas
Para reduzir o número de réplicas do Deployment para 2, execute
o subcomando scale
novamente:
kubectl scale deployments/kubernetes-bootcamp --replicas=2
Liste os Deployments para verificar se a mudança foi aplicada
com o subcomando get deployments
:
kubectl get deployments
O número de réplicas reduziu para 2. Liste o número de Pods com
o comando get pods
:
kubectl get pods -o wide
Isso confirma que 2 Pods foram encerrados.
Assim que você finalizar este tutorial, vá para Performing a Rolling Update (em inglês).