Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Failover automático de cluster Elastic Kubernetes Service (EKS) para região de DR com Route 53

By Piyush PatilDec 15, 20236 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

Neste artigo, vou mostrar como configurar o failover automático de um cluster EKS para a sua região de disaster recovery (DR). Antes, uma rápida apresentação do EKS e do Route 53.

O Amazon Elastic Kubernetes Service (EKS) é um serviço totalmente gerenciado que permite rodar Kubernetes na AWS sem precisar instalar, operar ou manter seu próprio control plane ou worker nodes. Com o EKS, você aproveita todo o poder e a flexibilidade do Kubernetes para implantar, gerenciar e escalar aplicações em contêineres em várias zonas de disponibilidade da AWS. O EKS também se integra a diversos serviços e recursos da AWS — IAM, VPC, CloudWatch, CloudFormation e outros — entregando uma plataforma Kubernetes segura, confiável e escalável.

O Amazon Route 53 é um serviço de DNS na nuvem que conecta seus usuários às aplicações e aos recursos web na AWS e na internet. O Route 53 oferece alta disponibilidade, escalabilidade, performance e segurança para consultas e respostas de DNS. Ele também conta com recursos avançados, como health checks, gerenciamento de tráfego, registro de domínios e DNSSEC. E pode trabalhar em conjunto com outros serviços da AWS — como Elastic Load Balancing, CloudFront, S3 e mais — para encaminhar seus usuários ao endpoint ideal da sua aplicação.

Aqui, vou subir dois clusters EKS: um em US-EAST-1 (região de produção) e outro em US-WEST-2 (região de DR). Vou usar um domínio personalizado no cluster de produção via Route 53. Depois, vou rodar o jogo 2048 nos dois clusters e demonstrar o failover automático do Route 53 introduzindo falhas no cluster de produção. Existem várias formas de criar um cluster EKS — AWS Console, Terraform, CloudFormation etc. —, mas vou ficar no AWS Console para simplificar e facilitar o entendimento. Veja abaixo o diagrama conceitual da arquitetura.

Arquitetura conceitual

**Passo 1: Criar um cluster EKS**

Vou mostrar o passo a passo para subir o jogo na região de produção us-east-1; em us-west-2 tenho uma configuração equivalente.

Nome: eks-blog-production-us-east-1

Versão do Kubernetes: 1.25

Cluster Service Role: crie uma role chamada "eksClusterRole" e garanta que ela tenha estas 3 políticas anexadas: AmazonEKSWorkerNodePolicy, AmazonEC2ContainerRegistryReadOnly e AmazonEKS_CNI_Policy.

eksClusterRole

Selecione a VPC padrão e escolha 2 ou 3 sub-redes

Selecione um security group com as portas 22, 80 e 8080 liberadas

Defina o Cluster endpoint access: public

Detalhes completos do cluster antes do lançamento

Passo 2: Adicionar Node Groups ao cluster

Abra o cluster > Compute > Add NodeGrp

Nome: eks-blog-production-eks-nodegrp-1

Cluster Service Role: crie uma role chamada "eksNodeRole" e garanta que ela tenha estas 3 políticas anexadas: AmazonEKSWorkerNodePolicy, AmazonEC2ContainerRegistryReadOnly e AmazonEKS_CNI_Policy.

Mantenha os valores padrão no restante.

EKS Node Group

Passo 3: Autenticar no cluster

Abra o AWS CloudShell e rode os comandos abaixo.

# Digite no AWS CLI
aws sts get-caller-identity

# observe os detalhes da sua conta e do user id

# Cria um arquivo kubeconfig com as credenciais do EKS:

# A configuração do kubeconfig permite conectar ao cluster pela linha de comando kubectl.

aws eks update-kubeconfig --region us-east-1 --name eks-blog-production-us-east-1

# verifique se você consegue ver os nodes que criou
kubectl get nodes

Saída dos comandos

Passo 4: Criar um novo Pod no EKS para o jogo 2048

Crie o arquivo 2048-pod.yaml abaixo para implantar o pod do jogo 2048 no cluster.

### code starts ###
apiVersion: v1
kind: Pod
metadata:
   name: 2048-pod
   labels:
      app: 2048-ws
spec:
   containers:
   - name: 2048-container
     image: blackicebird/2048
     ports:
       - containerPort: 80

### code ends ###

Aplique o arquivo YAML para criar o pod

# aplica o arquivo de configuração para criar o pod
kubectl apply -f 2048-pod.yaml
#pod/2048-pod created

# veja o pod recém-criado
kubectl get pods

Pod 2048 criado

Passo 5: Configurar o serviço de Load Balancer

Agora vamos configurar um serviço de load balancer criando o arquivo YAML de serviço mygame-svc.yaml, conforme abaixo.

### code starts ###

apiVersion: v1
kind: Service
metadata:
   name: mygame-svc
spec:
   selector:
      app: 2048-ws
   ports:
   - protocol: TCP
     port: 80
     targetPort: 80
   type: LoadBalancer

### code ends ###

Aplique o arquivo do serviço de Load Balancer.

# aplica o arquivo de configuração
kubectl apply -f mygame-svc.yaml

# veja os detalhes do serviço modificado
kubectl describe svc mygame-svc

Serviço de Load Balancer criado

Ao colar o endpoint do Load Balancer "ab8412c93389c4e29beb8c5e3778d368–260705609.us-east-1.elb.amazonaws.com" no navegador, o jogo carrega.

Passo 6: Apontar o domínio [www.doyouneedk8s.com](http://www.doyouneedk8s.com/) para o jogo

Acesse a hosted zone do Route 53 do domínio www.doyouneedk8s.com e adicione o endpoint do Load Balancer como um registro CNAME. Após a propagação do DNS, ao colar o domínio no navegador, o jogo aparece carregando.

CNAME no Route 53

Passo 7: Provocar uma falha

Agora, suponha que a região US Virginia sofra uma indisponibilidade. Vamos simular manualmente uma falha na aplicação em US-EAST-1: vou remover a regra de entrada da porta 80 do security group do Load Balancer. O jogo deixa de carregar — afinal, ainda não há failover configurado para a aplicação de produção.

Passo 8: Configurar o failover do Route 53 para a região de DR

O primeiro passo é criar um Health Check no Route 53 para a sua aplicação. Acesse o Route 53, selecione "Health Checks" no menu lateral esquerdo e clique em "Create Health Check".

Nome: www.doyouneedk8s.com

What to monitor: Endpoint

Monitor an endpoint > selecione Domain Name > preencha www.doyouneedk8s.com no campo Domain Name, Porta 80

Tela 1 de criação do Health Check

Ao clicar em Next, na tela seguinte você tem a opção de criar um alarme para esse evento, para ser notificado quando o failover ocorrer. É bem simples: basta ter um SNS topic verificado e selecioná-lo. Marque Yes em "Create Alarm". Depois, clique em "Create health check".

Criar health check

Você verá um health check verde com status "Healthy" assim que ele atender aos parâmetros definidos.

Health Check pronto para uso

Volte à hosted zone de www.doyouneedk8s.com no Route 53. Selecione o registro CNAME e, em Routing Policy, escolha "Failover".

Failover record type: Secondary

Health Check ID: o health check do domínio criado anteriormente.

Record ID: o Load Balancer de US-WEST-2 que foi criado quando você subiu o jogo na região US Oregon. Salve o registro.

Hora de testar. Repita a mesma falha do Passo 7. Desta vez, o jogo continua funcionando. Para deixar o resultado mais claro, coloquei um texto diferente na página do jogo, sinalizando que ele está sendo servido pela região de DR.

Failover de DR concluído com sucesso

Conclusão

O Route 53 é uma ferramenta realmente poderosa da AWS para montar estratégias robustas de DR e continuidade de negócios. No artigo, mostrei o conceito de como executar o failover, mas manter os clusters de produção e de DR sincronizados em relação a atualizações de código fica por sua conta. Outro ponto: ao adotar essa estratégia de failover, faça testes de sanidade com regularidade em janelas de manutenção para confirmar que tanto a aplicação de produção quanto a de DR estão funcionando como esperado.

Referências