Last Updated:

AWS EKS com eksctl e Floci

Marc Pires
Marc Pires Kubernetes

Essa é uma série de 4 artigos sobre como emular um cluster EKS localmente em um laboratorio de estudos com o Floci, suas vantagens, limitações, problemas enfrentados na implementação deste laboratório e uma comparação com o Localstack

Alguns motivos para usar o Floci

Nos últimos anos vimos um crescimento do interesse na montagem de homelabs, SRE, engenheiros de plataforma e desenvolvedores têm recorrido a esses laboratórios como forma de praticar novas técnicas e avaliar ferramentas com um custo muito menor do que executar esses serviços em nuvens públicas.

Porém, ao estudarmos para uma certificação por exemplo, precisamos realizar laboratórios com os diversos serviços dos provedores de nuvem públicas e esses experimentos no geral terão um custo. O pode ser um impedimento, dependo dos recursos utilzados nos experimentos.

É neste cenário que ferramentas como o Floci brilham, pois ele possibilita que executemos localmente os principais serviços destes provedores, vamos olhar mais de perto que o Floci nos oferece  e preparar nosso ambiente para os experimentos com o EKS.

O que o Floci oferece ?

O Floci emula 68 serviços da AWS como RDS, EKS, Route 53 entre outros e não possui limitações como por exemplo a necessidade de se realizar logins ou necessitarmos de assinaturas ou chaves para sua utilização. Outro pontos interessante e que para diversos serviços como Lambda ele executa containers utilizando os runtimes reais da AWS e não um mock da resposta do serviço.

Preparando o ambiente

Para preparar o nosso ambiente, precisaremos de:

- Um container runtime (Docker, Podman)
- AWS cli
- eksctl

Depois de instalarmos as ferramenta acima, criaremos um docker-compose.yaml com o conteúdo abaixo e iniciaremos o Floci

services:
  floci:
    image: floci/floci:latest
    ports:
      - "4566:4566"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/app/data
    environment:
      FLOCI_STORAGE_MODE: hybrid
      FLOCI_HOSTNAME: aws-mock 

Apos iniciarmos o container do Floci, teremos um endpoint sendo executado na porta 4566

 
Floci em execucao

Configurando um novo perfil na AWS cli

Com o Floci rodando corretamente, precisamos configurar um novo perfil na AWS cli para utilização em nossos laboratórios, para isso executaremos o comando a seguir:

aws configure --profile aws-homelab
AWS Access Key ID [None]: test
AWS Secret Access Key [None]: test
Default region name [None]: us-east-1
Default output format [None]: json

Uma vez configurado nosso perfil, criaremos um bucket S3 para verificar nossa configuração.

aws s3 mb s3://terraform-state --profile aws-homelab --endpoint-url http://localhost:4566
make_bucket: terraform-state

Note que neste momento temos que passar a url do floci através do parâmetro endpoint-url, adicione o endpoint do Floci na configuração do perfil executando o seguinte comando:

aws configure set endpoint-url http://localhost:4566 --profile aws-homelab
aws configure get endpoint-url --profile aws-homelab

EKS com eksctl

Com o ambiente configurado, iremos utilizar o eksctl para criar nosso cluster Kubernetes. 

O eksctl facilita a tarefa de gerenciar de clusters em escala, ja que automatiza e abstrai muitas das tarefas necessárias na configuracao dos diversos serviços necessários por um cluster EKS como VPC, node groups e security groups através de uma abordagem declarativa como exemplificado abaixo:

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
   name: basic-cluster
   region: us-west-2

nodeGroups:
   - name: ng-1
     instanceType: m5.large
     desiredCapacity: 2
     minSize: 1
     maxSize: 3
     ssh:
        allow: false

Durante nosso laboratório recoremos regularmente a documentação do ClusterConfig

Mock x Real mode

Um dos recursos mais interessantes do Floci são os modos real - que criara um cluster k3s e expõe a porta (6500-65999) do API server, já no modo mock ele retorna apenas as respostas da API do EKS sem criar um cluster, esse modo e interessante por exemplo em um CI ou outras atividades em que só precisemos das respostas de API.

No nosso laboratório utilizaremos o modo real, que o padrão, uma vez que além de criar e gerenciar o cluster via eksctl, iremos posteriormente executar algumas cargas de trabalho no cluster criado.

Dry run

A configuração acima foi gerada manualmente a fim demonstrar a especificação do ClusterConfig, mas podemos gerar nosso manifesto diretamente pelo eksctl.

$ eksctl create cluster --dry-run --profile aws-homelab
Error: cannot use --profile with --dry-run as this option cannot be represented in ClusterConfig: set the AWS_PROFILE environment variable instead

 Executar o comando acima para gerar nossa configuração utilizando nosso perfil para o Floci como visto acima, gerara um erro, pois não existe na spec do CloudConfig uma propriedade para indicarmos o perfil AWS a ser utilizado, sendo necessário passar nosso perfile via variavel de ambiente.

$ AWS_PROFILE=aws-homelab eksctl create cluster --dry-run
Error: checking AWS STS access – cannot get role ARN for current session: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: 1ffdbb8c-dfca-444c-9637-82ac382eebe1, api error InvalidClientTokenId: The security token included in the request is invalid.

⚠️ Outch!!, got a 403

Apos executar o dry-run, chegamos no ponto onde a diversão começa. Durante o processo, tive alguns problemas devido algumas limitações do emulador e detalharei os desafios encontrados e como foram resolvidos.

Fiquem ligados nas próximas postagens. 📢