Conceitos de escalabilidade
Antes de encontrar uma solução de dimensionamento, é importante compreender o que é escalabilidade e como ela se aplica aos aplicativos Kubernetes.
Nesta unidade, revisaremos alguns conceitos de escalabilidade.
Escalabilidade
A escalabilidade descreve a capacidade de um aplicativo ou sistema de lidar com um aumento na carga de trabalho adicionando mais recursos a ele.
Em nosso cenário de exemplo, a quantidade de trabalho que está enfrentando um aumento é o número de solicitações de clientes. A quantidade de recursos adicionados pode ser representada de duas maneiras: escalabilidade vertical e escalabilidade horizontal.
Escalabilidade vertical
A escalabilidade vertical, ou dimensionamento vertical, refere-se ao dimensionamento de um sistema adicionando mais recursos físicos, como memória ou potência de CPU. Por exemplo, se o site da empresa está consumindo muita memória, você pode atualizar a instância de VM para incluir mais memória, mantendo o mesmo aplicativo subjacente.
Em suma, o dimensionamento vertical aumenta o tamanho da VM enquanto mantém o mesmo número de aplicativos. Essa abordagem é valiosa se você tiver aplicativos monolíticos que exigem muita capacidade de computação, mas são muito caros para serem divididos em partes menores. Esses aplicativos são hospedados principalmente em VMs, em vez de sistemas distribuídos.
Apesar de ter um custo mais gerenciável, VMs muito grandes podem se tornar muito caras. O custo de adicionar mais capacidade de computação é maior do que o custo de duplicação de VMs pequenas. Existe um limite máximo para a quantidade de recursos que você pode adicionar a uma única VM, o que significa que você deve eventualmente duplicar a VM assim que atingir esse limite.
Escalabilidade horizontal
A escalabilidade horizontal, ou dimensionamento horizontal, refere-se ao dimensionamento de um sistema duplicando o aplicativo e distribuindo a carga entre as instâncias do aplicativo.
O dimensionamento horizontal é valioso para aplicativos distribuídos, como aqueles implantados no AKS, e sistemas sem estado, pois você pode criar vários contêineres com o mesmo aplicativo em uma única VM. Dimensionar verticalmente permite extrair a maioria dos recursos pagando por uma única VM.
Em nosso cenário de exemplo, o site da sua empresa é sem estado. Isso significa que o dimensionamento vertical é a melhor opção. O Kubernetes fornece um recurso pronto para uso chamado HPA (HorizontalPodAutoscaler) que permite escalar horizontalmente suas implantações.
Escalabilidade manual no Kubernetes
Antes de abordarmos o HPA, vamos revisar como dimensionar manualmente um aplicativo Kubernetes.
Cada implantação está vinculada a outro recurso chamado ReplicaSet. Esse recurso é responsável por manter um "estado de réplica desejado" e escalar ou reduzir horizontalmente o aplicativo real para manter o estado desejado igual ao estado real. Você pode controlar o número de réplicas em uma implantação por meio da chave spec.replicas
na especificação de implantação. Essa chave define o número de réplicas desejadas no ReplicaSet subjacente e força o controlador de replicação a manter esse número de réplicas a qualquer momento.
Você também pode controlar o número de réplicas em uma implantação com o comando kubectl scale deploy/contoso-website --replicas <number>
. Esse comando altera dinamicamente o número de réplicas desejadas em uma implantação e escala ou reduz horizontalmente o aplicativo.
HPA (HorizontalPodAutoscaler)
O HPA é o recurso nativo do Kubernetes 1.8+ que fornece escalabilidade horizontal para pods no cluster. Ele monitora a API de métricas a cada 30 segundos para ver se há alterações na contagem de réplicas desejada. Se o número desejado de réplicas for diferente do número atual de réplicas, o gerenciador do controlador, que gerencia os objetos do HPA, irá escalar ou reduzir horizontalmente a implantação.
O HPA trabalha com o grupo de API autoscaling
no Kubernetes. Há duas versões para esse grupo de API: v1
e v2
. A versão v1
permite que a implantação seja dimensionada com base apenas nas métricas da CPU. A versão v2
permite o monitoramento nativo tanto da CPU quanto da memória. Neste módulo, usaremos a versão v2
.
Cada HPA é anexado a uma referência de escala, que é definida na chave spec.scaleTargetRef
do manifesto do HPA. Essa referência de escala deve ter pods subjacentes para ser dimensionada, caso contrário, o HPA não funciona, já que não é possível aplicar o dimensionamento a objetos que não podem ser escalonados, como DaemonSets.
É importante que cada pod tenha uma solicitação de recurso definida na especificação. O algoritmo de HPA não pode calcular corretamente as métricas e determinar a utilização de recursos sem essa configuração. Você pode configurar esse limite por meio da chave spec.template.spec.containers[].resources
no manifesto de implantação, conforme mostrado no exemplo a seguir:
spec:
template:
spec:
containers:
- resources:
requests:
cpu: 250m
memory: 256M
limits:
cpu: 500m
memory: 512M
Exemplo de manifesto do 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