Breve Introdução ao Horizontal Pod Autoscaler (HPA) para Aprendizado Futuro
Nesta etapa, você terá uma introdução ao Horizontal Pod Autoscaler (HPA), um recurso Kubernetes poderoso que dimensiona automaticamente as aplicações com base na utilização de recursos. O HPA permite que você defina regras de dimensionamento com base em métricas como utilização da CPU, uso da memória ou até mesmo métricas personalizadas.
Entendendo o HPA:
O HPA ajusta automaticamente o número de réplicas de pod em execução em um Deployment, ReplicaSet ou StatefulSet com base no uso observado da CPU ou memória, ou com base em métricas personalizadas fornecidas por suas aplicações. Isso garante que sua aplicação possa escalar automaticamente para lidar com as mudanças nas cargas de tráfego, melhorando o desempenho e a disponibilidade.
Habilite o addon do servidor de métricas no Minikube:
minikube addons enable metrics-server
Exemplo de saída:
* The 'metrics-server' addon is enabled
O servidor de métricas fornece ao Kubernetes dados de uso sobre seus recursos e é essencial para o funcionamento do HPA.
Crie um deployment com solicitações de recursos:
nano ~/project/k8s-manifests/hpa-example.yaml
Adicione o seguinte conteúdo:
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
Aplique o deployment:
kubectl apply -f ~/project/k8s-manifests/hpa-example.yaml
Explicação da configuração YAML:
- Este arquivo YAML define um Deployment para uma aplicação PHP e o Service correspondente.
- A configuração do Deployment é muito semelhante à do NGINX, com a exceção de:
name: php-apache: O nome do deployment e do contêiner do pod.
image: k8s.gcr.io/hpa-example: A imagem Docker para o contêiner.
resources: Esta seção especifica os requisitos de recursos para o contêiner.
limits.cpu: 500m: A CPU máxima permitida para uso pelo contêiner.
requests.cpu: 200m: A quantidade garantida de CPU atribuída ao contêiner.
- O service é uma configuração de serviço padrão, expondo o deployment internamente.
Crie uma configuração HPA:
nano ~/project/k8s-manifests/php-apache-hpa.yaml
Adicione o seguinte manifesto HPA:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
Aplique a configuração HPA:
kubectl apply -f ~/project/k8s-manifests/php-apache-hpa.yaml
Explicação da configuração YAML:
apiVersion: autoscaling/v2: Especifica a versão da API para HorizontalPodAutoscaler.
kind: HorizontalPodAutoscaler: Indica que este é um objeto HPA.
metadata: Contém metadados sobre o HPA.
name: php-apache: O nome do HPA.
spec: Contém a especificação do HPA.
scaleTargetRef: Define o Deployment de destino que será dimensionado.
apiVersion: apps/v1: A versão da API do recurso de destino.
kind: Deployment: O tipo de recurso de destino, que é um Deployment.
name: php-apache: O nome do Deployment de destino a ser dimensionado.
minReplicas: 1: O número mínimo de réplicas a serem mantidas em execução.
maxReplicas: 10: O número máximo de réplicas para dimensionar.
metrics: Define como determinar as métricas de dimensionamento.
type: Resource: Dimensiona com base em uma métrica de recurso.
resource.name: cpu: Dimensiona com base no uso da CPU.
resource.target.type: Utilization: Dimensiona com base em uma porcentagem da CPU solicitada pelo pod
resource.target.averageUtilization: 50: Dimensiona quando o uso médio da CPU em todos os pods excede 50% das solicitações.
Verifique a configuração do HPA:
kubectl get hpa
Exemplo de saída:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
Simule a Carga e Observe o Autoscaling em Tempo Real
Para simular alta carga e acionar o autoscaler, você executará um gerador de carga em um terminal e monitorará a atividade de dimensionamento em um terminal separado.
Primeiro, abra um terminal para o gerador de carga:
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
NÃO FECHE o terminal com o gerador de carga. ABRA OUTRO TERMINAL para monitorar a atividade de dimensionamento.
No segundo terminal, você pode usar vários comandos para observar o autoscaling em tempo real:
- Monitore o status do HPA (atualizações a cada poucos segundos):
kubectl get hpa -w
- Observe os pods sendo criados à medida que o HPA escala:
kubectl get pods -w
- Acompanhe os eventos relacionados à atividade de dimensionamento:
kubectl get events --sort-by='.lastTimestamp' -w
Você pode executar qualquer um desses comandos para observar diferentes aspectos do processo de autoscaling. Por exemplo, observar pods com a flag -w mostra os pods sendo criados em tempo real à medida que o sistema escala:
Exemplo de saída para kubectl get pods -w:
NAME READY STATUS RESTARTS AGE
php-apache-xxxxxxxxx-xxxxx 1/1 Running 0 2m
load-generator 1/1 Running 0 30s
php-apache-xxxxxxxxx-yyyyy 0/1 Pending 0 0s
php-apache-xxxxxxxxx-yyyyy 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-yyyyy 1/1 Running 0 3s
php-apache-xxxxxxxxx-zzzzz 0/1 Pending 0 0s
php-apache-xxxxxxxxx-zzzzz 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-zzzzz 1/1 Running 0 2s
Você verá o HPA respondendo ao aumento da carga, dimensionando o número de pods. A atualização das métricas pode levar um minuto ou mais para refletir as mudanças:
Exemplo de saída para kubectl get hpa -w:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
php-apache Deployment/php-apache 68%/50% 1 10 1 90s
php-apache Deployment/php-apache 68%/50% 1 10 2 90s
php-apache Deployment/php-apache 79%/50% 1 10 2 2m
php-apache Deployment/php-apache 79%/50% 1 10 4 2m15s
Quando terminar de observar, pressione Ctrl+C para parar o comando de monitoramento e volte para o primeiro terminal e pressione Ctrl+C para parar o gerador de carga.
Pontos-chave sobre o HPA:
- Dimensiona automaticamente os pods com base na utilização de recursos, o que melhora a resiliência da aplicação.
- Pode dimensionar com base na CPU, memória ou métricas personalizadas.
- Define contagens mínimas e máximas de réplicas, garantindo um dimensionamento equilibrado e eficiente.
- O HPA é um componente crucial para manter o desempenho e a disponibilidade da aplicação sob carga variável.
- Usar a flag
-w (watch) com os comandos kubectl fornece monitoramento em tempo real das mudanças no cluster.