Três níveis de autoescalonamento no Kubernetes: como utilizá-los de forma eficaz

Três níveis de autoescalonamento no Kubernetes: como utilizá-los de forma eficaz
Para dominar completamente o Kubernetes, é necessário conhecer várias maneiras de escalar os recursos do cluster: por palavras dos desenvolvedores do sistema, esta é uma das principais tarefas do Kubernetes. Preparámos uma visão geral de alto nível dos mecanismos de escalabilidade horizontal e vertical, bem como das recomendações para usá-los de forma eficaz.

O artigo Kubernetes Autoscaling 101: Cluster Autoscaler, Horizontal Autoscaler e Vertical Pod Autoscaler foi traduzido por uma equipe que implementou a escalabilidade automática em Kubernetes aaS da Mail.ru.

Por que é importante considerar a escalabilidade

Kubernetes — uma ferramenta para gestão de recursos e orquestração. Certamente, é interessante brincar com recursos legais de implementação, monitoramento e gestão de pods (um pod é um grupo de contêineres iniciados em resposta a uma solicitação).

No entanto, também é necessário considerar algumas questões:

  1. Como escalar módulos e aplicações?
  2. Como manter os contêineres funcionando e eficientes?
  3. Como responder a mudanças contínuas no código e nas cargas de trabalho dos usuários?

Configurar clusters Kubernetes para equilibrar recursos e desempenho pode ser uma tarefa complexa, exigindo conhecimentos especializados sobre o funcionamento interno do Kubernetes. A carga de trabalho do seu aplicativo ou serviços pode variar ao longo do dia ou até mesmo em uma única hora, por isso o balanceamento deve ser visto como um processo contínuo.

Níveis de escalabilidade automática do Kubernetes

Uma escalabilidade eficaz requer coordenação entre dois níveis:

  1. Nível dos pods, que inclui a escalabilidade horizontal (Horizontal Pod Autoscaler, HPA) e vertical (Vertical Pod Autoscaler, VPA). Esse nível diz respeito à escalabilidade dos recursos existentes para os seus contêineres.
  2. Nível do cluster, que é gerenciado pelo sistema de escalabilidade de cluster (Cluster Autoscaler, CA), que aumenta ou diminui o número de nós dentro do cluster.

Módulo de escalabilidade horizontal (HPA)

Como o nome sugere, o HPA escala o número de réplicas de pods. Como gatilhos para alterar o número de réplicas, a maioria dos DevOps utiliza a carga da CPU e a memória. No entanto, é possível escalar o sistema com base em métricas personalizadas, a combinação delas e métricas externas ou até mesmo Esquema de funcionamento de alto nível do HPA:.

Diagrama de funcionamento de alto nível do HPA:

  1. O HPA verifica continuamente os valores das métricas especificadas durante a configuração, com um intervalo padrão de 30 segundos.
  2. O HPA tenta aumentar o número de pods se um limite específico for alcançado.
  3. O HPA atualiza o número de réplicas dentro do controlador de implantação/replicação.
  4. O controlador de implantação/replicação, então, implementa todos os pods adicionais necessários.

Três níveis de autoescalonamento no Kubernetes: como utilizá-los de forma eficaz
O HPA inicia o processo de implantação de pods ao atingir o limite das métricas.

Ao usar o HPA, considere o seguinte:

  • O intervalo de verificação padrão do HPA é de 30 segundos. Isso é definido pelo parâmetro. horizontal-pod-autoscaler-sync-period no gerenciador de controlador.
  • O erro relativo padrão é de 10%.
  • Após o último aumento do número de pods, o HPA espera pela estabilização das métricas por três minutos. Esse intervalo é definido pelo parâmetro. horizontal-pod-autoscaler-upscale-delay.
  • Após a última redução do número de pods, o HPA aguarda pela estabilização por cinco minutos. Esse intervalo é definido pelo parâmetro. horizontal-pod-autoscaler-downscale-delay.
  • O HPA funciona melhor com objetos de implantação, em vez de controladores de replicação. A autoescalabilidade horizontal é incompatível com atualizações contínuas (rolling updates), que manipulam diretamente os controladores de replicação. Ao implantar, o número de réplicas depende diretamente dos objetos de implantação.

Escalabilidade vertical de pods

A escalabilidade vertical (VPA) aloca mais (ou menos) tempo de CPU ou memória para pods existentes. É adequada para pods com estado (stateful) ou sem estado (stateless), mas é principalmente destinada a serviços stateful. No entanto, você pode aplicar o VPA também a módulos sem estado, se precisar ajustar automaticamente a quantidade de recursos inicialmente alocados.

O VPA também responde a eventos OOM (out of memory, falta de memória). Para alterar o tempo de CPU e a quantidade de memória, é necessário reiniciar os pods. Ao reiniciar, o VPA respeita o orçamento de distribuição (pods distribution budget, PDB), para garantir o número mínimo necessário de pods.

Você pode definir o volume mínimo e máximo de recursos para cada módulo. Assim, é possível limitar o máximo de memória alocada a 8 GB. Isso é útil se os nós atuais não puderem alocar mais de 8 GB de memória por contêiner. Especificações detalhadas e o mecanismo de funcionamento estão descritos em wiki oficial do VPA.

Além disso, o VPA possui uma função interessante de recomendações (Recomendador VPA). Ele monitora o uso de recursos e eventos de OOM de todos os módulos para sugerir novos valores de memória e tempo de CPU com base em um algoritmo inteligente considerando métricas históricas. Também há uma interface de API que aceita um descritor de pod e retorna os valores de recursos sugeridos.

Vale ressaltar que o Recomendador VPA não monitora o "limite" de recursos. Isso pode resultar em um módulo monopolizando recursos dentro dos nós. É preferível definir um valor limite no nível do namespace para evitar um consumo excessivo de memória ou tempo de CPU.

Esquema de funcionamento de alto nível do VPA:

  1. O VPA verifica continuamente os valores das métricas especificadas durante a instalação, com um intervalo padrão de 10 segundos.
  2. Se o limite definido for atingido, o VPA tentará alterar a quantidade alocada de recursos.
  3. O VPA atualiza a quantidade de recursos dentro do controlador de implantação/reprodução.
  4. Ao reiniciar os módulos, todos os novos recursos são aplicados às instâncias criadas.

Três níveis de autoescalonamento no Kubernetes: como utilizá-los de forma eficaz
O VPA adiciona a quantidade necessária de recursos

Considere os seguintes pontos ao usar o VPA:

  • A escalabilidade requer o reinício obrigatório do pod. Isso é necessário para evitar um funcionamento instável após as alterações. Para garantir a confiabilidade, os módulos são reiniciados e distribuídos pelos nós com base nos novos recursos alocados.
  • O VPA e o HPA ainda são incompatíveis entre si e não podem operar nos mesmos pods. Se você estiver usando ambos os mecanismos de escalabilidade em um mesmo cluster, certifique-se de que as configurações não permitam que sejam ativados nos mesmos objetos.
  • O VPA configura as solicitações dos contêineres para recursos com base apenas no uso passado e atual. Ele não estabelece limites de uso de recursos. Podem ocorrer problemas de desempenho inadequados em aplicativos que começam a consumir cada vez mais recursos, levando o Kubernetes a desligar este pod.
  • O VPA ainda está em fase inicial de desenvolvimento. Esteja preparado para que o sistema possa passar por algumas mudanças em breve. Você pode ler sobre as limitações conhecidas e os planos de desenvolvimento. Assim, há planos para implementar a cooperação entre VPA e HPA, bem como a implantação de módulos junto com políticas de escalonamento vertical para eles (por exemplo, uma etiqueta especial 'requires VPA').

Escalonamento automático do cluster Kubernetes

O escalonamento automático do cluster (Cluster Autoscaler, CA) altera o número de nós com base na quantidade de pods pendentes. O sistema verifica periodicamente a presença de pods pendentes e aumenta o tamanho do cluster, se mais recursos forem necessários e se o cluster não ultrapassar os limites estabelecidos. O CA interage com o provedor de nuvem, solicitando nós adicionais ou liberando nós ociosos. A primeira versão pública do CA foi lançada no Kubernetes 1.8.

Diagrama de alto nível do funcionamento do CA:

  1. O CA verifica a presença de pods em estado de espera a cada 10 segundos por padrão.
  2. Se um ou mais pods estiverem em estado de espera devido à falta de recursos disponíveis no cluster para alocação, ele tenta provisionar um ou mais nós adicionais.
  3. Quando o provedor de nuvem provisiona o nó necessário, este se une ao cluster e está pronto para atender aos pods.
  4. O scheduler do Kubernetes aloca pods pendentes no novo nó. Se, após isso, alguns pods ainda permanecerem em espera, o processo se repete e novos nós são adicionados ao cluster.

Três níveis de autoescalonamento no Kubernetes: como utilizá-los de forma eficaz
Alocação automática de nós do cluster na nuvem

Considere o seguinte ao usar o CA:

  • O CA garante que todos os pods no cluster tenham espaço para execução, independentemente da carga do processador. Além disso, ele tenta garantir que não haja nós desnecessários no cluster.
  • O CA registra a necessidade de dimensionamento em cerca de 30 segundos.
  • Depois que o nó se torna desnecessário, o CA espera por 10 minutos por padrão antes de escalonar o sistema.
  • No sistema de escalonamento automático, existe o conceito de expansores (expanders). São diferentes estratégias para escolher o grupo de nós onde novos serão adicionados.
  • Use a opção com responsabilidade cluster-autoscaler.kubernetes.io/safe-to-evict (true). Se você criar muitos pods ou se muitos deles estiverem espalhados por todos os nós, você perderá significativamente a capacidade de reduzir a escala do cluster.
  • Use Orçamentos de interrupção de pod, para evitar a remoção de pods, o que pode fazer com que parte do seu aplicativo falhe completamente.

Como os sistemas de escalonamento automático interagem entre si

Para uma harmonia ideal, deve-se aplicar escalonamento automático tanto no nível dos pods (HPA/VPA) quanto no nível do cluster. Eles interagem relativamente bem entre si:

  1. O HPA ou VPA atualizam as réplicas dos pods ou os recursos atribuídos aos pods existentes.
  2. Se faltarem nós para o escalonamento programado, o CA perceberá a existência de pods em estado de espera.
  3. O CA aloca novos nós.
  4. Os módulos são distribuídos entre os novos nós.

Três níveis de autoescalonamento no Kubernetes: como utilizá-los de forma eficaz
Sistema conjunto de escalonamento do Kubernetes

Erros típicos no escalonamento automático do Kubernetes

Existem vários problemas típicos que os devops enfrentam ao tentar aplicar escalonamento automático.

O HPA e o VPA dependem de métricas e alguns dados históricos. Se não houver recursos suficientes alocados, os módulos serão reduzidos e não conseguirão gerar métricas. Nesse caso, o escalonamento automático nunca ocorrerá.

A própria operação de escalonamento é sensível ao tempo. Queremos que os módulos e o cluster escalonem rapidamente — antes que os usuários percebam qualquer problema e falhas. Portanto, deve-se considerar o tempo médio de escalonamento de pods e do cluster.

O cenário ideal é de 4 minutos:

  1. 30 segundos. Atualização das métricas-alvo: 30−60 segundos.
  2. 30 segundos. O HPA verifica os valores das métricas: 30 segundos.
  3. Menos de 2 segundos. Módulos pod criados e passando para o estado de espera: 1 segundo.
  4. Menos de 2 segundos. O CA vê os módulos em espera e faz chamadas para preparar os nós: 1 segundo.
  5. 3 minutos. O provedor de nuvem aloca nós. K8s aguarda até que estejam prontos: até 10 minutos (dependendo de vários fatores).

O pior (mais realista) cenário é de 12 minutos:

  1. 30 segundos. Atualização das métricas alvo.
  2. 30 segundos. HPA verifica os valores das métricas.
  3. Menos de 2 segundos. Os módulos pod são criados e passam para o estado de espera.
  4. Menos de 2 segundos. CA vê os módulos pendentes e envia solicitações para a preparação dos nós.
  5. 10 minutos. O provedor de nuvem aloca nós. K8s aguarda até que estejam prontos. O tempo de espera depende de vários fatores, como latência do fornecedor, latência do SO e funcionamento de ferramentas auxiliares.

Não confunda os mecanismos de escalonamento dos provedores de nuvem com o nosso CA. Este último opera dentro do cluster Kubernetes, enquanto o mecanismo do provedor de nuvem funciona com base na distribuição de nós. Ele não sabe o que acontece com seus pods ou aplicativos. Estes sistemas operam paralelamente.

Como gerenciar o escalonamento no Kubernetes

  1. Kubernetes é uma ferramenta de gerenciamento de recursos e orquestração. As operações de gerenciamento de pods e recursos do cluster são um marco essencial na compreensão do Kubernetes.
  2. Absorva a lógica de escalabilidade dos pods considerando HPA e VPA.
  3. CA deve ser usado apenas se você compreender bem as necessidades de seus pods e contêineres.
  4. Para otimizar a configuração do cluster, é necessário entender como diferentes sistemas de escalonamento trabalham juntos.
  5. Ao avaliar o tempo de escalonamento, tenha em mente os piores e melhores cenários.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster