Spot Nodes em clusters AKS com o mínimo de interrupções usando Linkerd

Victor Muchiaroni
sysadmuchi
Published in
3 min readAug 5, 2022

Em um dos meus recentes estudos, fiz alguns testes utilizando spot nodes em um cluster AKS com o foco de manter a taxa de sucesso dos serviços acima de 99%. Quando utilizamos este tipo de nodes, eles podem ser removidos a qualquer momento de nosso cluster, baseado na demanda por recursos computacionais do Azure, podendo gerar interrupções em chamadas para as aplicações em execução.
O uso de VMs Spot como nodes para o cluster do AKS nos permite aproveitar a capacidade não utilizada no Azure com economia significativa de custos. Porém, a qualquer momento que o Azure precisar da capacidade de volta, a infraestrutura removerá os nós Spot.

O foco deste post é descrever os testes realizados visando minimizar as interrupções durante a remoção de um node spot do nosso cluster AKS. Portanto, a criação e configuração do serviço de kubernetes do Azure não estará detalhada nesta história, mas existe uma documentação oficial da Microsoft para cobrir este ponto e pode ser encontrada neste link: https://docs.microsoft.com/pt-br/azure/aks/spot-node-pool.

Para este estudo, foram criados dois microsserviços síncronos em python para que as simulações de requisições HTTP pudessem ser realizadas e mapeadas dentro do cluster.

Ponto de partida

  • O cluster AKS roda a versão 1.22.11 do kubernetes com um nodepool de sistema do tipo Regular e um nodepool do tipo Spot. Como o intuito do estudo é testar a disponibilidade, vamos distribuir os pods das aplicações entre esses dois pools através de affinity rules. Além disso, o pool de VMs spot é criado com o taint kubernetes.azure.com/scalesetpriority=spot e precisamos adicionar um toleration para que nossos microsserviços sejam elegíveis a rodar nestes nodes.
  • O ambiente já possui o service mesh Linkerd instalado na versão 2.11.1.
  • Utilizaremos o k6 como ferramenta de teste de carga.
  • O fluxo dos testes foi definido da seguinte forma:

Cenário 1:

Injetando a carga de 20 virtual users por 120 segundos. Neste primeiro cenário, os retries do Service Profile do Linkerd estão desabilitados e desligou-se a VM spot(simulado a remoção) durante o teste de carga.

Resultado:

Teste k6 — Cenário 1

Neste caso, percebe-se que 27,54% das requests falharam durante o teste.

Cenário 2:

Injetando a carga de 20 virtual users por 120 segundos. Neste segundo cenário, os retries do Service Profile do Linkerd estão habilitados e desligou-se a VM spot(simulado a remoção) durante o teste de carga.

Resultado:

Teste k6 — Cenário 2

Neste caso, percebe-se que 0,05% das requests falharam durante o teste.

Comentários

Percebeu-se que durante o desligamento da VM Spot, os serviços ficaram intermitentes e as taxas de erro aumentaram significativamente quando o retry do Service Profile do Linkerd estava desabilitado ficando abaixo da taxa esperada de 99% de sucesso.

Com o retry habilitado, atingimos a taxa esperada >99% de sucesso para as requisições. A quantidade de requests e o tempo de resposta dos serviços com também foram melhores durante os testes realizados.

--

--