Como Arquiteto Cloud, uma das minhas principais funções é garantir a alta disponibilidade de nossos serviços para ajudar nossa empresa a atingir suas metas de negócios.

No ano passado, um desses objetivos era reduzir os custos de cloud, pois nossos serviços devem atender a SLAs rigorosos com um ambiente de produção altamente disponível.

Neste artigo, vou orientá-lo sobre como reduzir significativamente os custos em seus clusters EKS, usando instâncias spot do AWS EC2 e, esperamos, dar a você a confiança necessária para usar instâncias spot com nodepool altamente disponíveis no ambiente de produção.

O que são instâncias spot ?

As instâncias spot do EC2 representam capacidade de computação na AWS, onde são oferecidas com desconto de 60 a 80% sobre o preço sob demanda.

São gerenciados em nodepool de instâncias spot, onde são conjuntos de instâncias do EC2 com o mesmo tipo de instância solicitada, sistema operacional e zona de disponibilidade (AZ).

Se um nodepool de instâncias spot não estiver mais disponível, a instância spot poderá ser interrompida, recebendo uma notificação de encerramento com um aviso de dois minutos antes de ser encerrada.

Provisionamento de instância spot

Com as instâncias spot, cada tipo de instância em cada zona de disponibilidade é um nodepool com seu próprio preço spot, com base na capacidade disponível.

Infelizmente, o componente autoscaler de nodes (Cluster Autoscaler), não oferece suporte a spot Fleet, portanto, teremos que escolher uma estratégia diferente para executar instâncias spot: AWS Auto Scaling Groups (ASG).

Auto Scaling Groups

Um ASG contém uma coleção de instâncias do Amazon EC2 que são tratadas como um grupo lógico, pois nesta atuação específica usamos o kops para configurar nossos clusters, então demonstrarei como instalar ASGs de instâncias spot com kops InstanceGroups.

Não vamos nos aprofundar em kops neste artigo, pois se você usar outras ferramentas de instalação do Kubernetes, também poderá configurar seus ASGs para serem executados em instâncias spot com pequenos ajustes de configuração, portanto, isso não será abordado aqui.

Criaremos o InstanceGroup com o comando abaixo através de seu manifesto a seguir:

kops create ig spot-nodes-xlarge

apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
 labels:
   kops.k8s.io/cluster: sample.prod.k8s.local
 name: spot-nodes-xlarge
spec:
 image: kope.io/k8s-1.15-debian-stretch-amd64-hvm-ebs-2020-07-20
 machineType: c3.xlarge
 maxSize: 10
 minSize: 0
 mixedInstancesPolicy:
   instances:
   - c3.xlarge
   - c4.xlarge
   - c5.xlarge
   - c5a.xlarge
   onDemandAboveBase: 0
   onDemandBase: 0
   spotAllocationStrategy: capacity-optimized
 nodeLabels:
   kops.k8s.io/instancegroup: spot-nodes-xlarge
   lifecycle: "spot"
 role: Node
 subnets:
 - us-east-1a
 - us-east-1b
 - us-east-1c

Após a configuração deste InstanceGroup, o Kops criará um EC2 ASG com uma mixedInstancesPolicy, utilizando vários tipos de instância spot em um InstanceGroup.

A estratégia de alocação "capacity-optimized", permite que o ASG selecione os tipos de instância com a maior capacidade disponível durante a expansão.

Isso reduzirá a chance de interrupções do spot.

Devido às limitações do Cluster Autoscaler, onde qual tipo de instância expandir, seria importante escolher instâncias do mesmo tamanho (vCPU e memória) para cada InstanceGroup.