Conceitos de escalabilidade

Concluído

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.

Vertical scaling diagram.

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.

Horizontal scaling diagram.

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.

HorizontalPodAutoscaling design diagram.

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

Verificar seu conhecimento

1.

O que é dimensionamento em escala horizontal?

2.

Por que é importante ter uma solicitação de recurso definida em pods vinculados a um HPA?

3.

Por que a escala vertical é menos recomendada para aplicativos sem estado?