AWS EKS: Elastic Kubernetes Service

O Kubernetes é o padrão ouro para orquestração de containers, mas rodá-lo você mesmo é um overhead operacional que você não precisa. O EKS te dá um plano de controle gerenciado para que você possa focar nos seus workloads em vez de no cluster.

TL;DR: Configure um cluster AWS EKS, faça deploy de workloads, configure rede e storage, e gerencie o cluster com kubectl e AWS CLI.
Stack: AWS EKS, Kubernetes, kubectl, Docker, ECR
Nível: Avançado
Tempo de leitura: ~25 min

Instalar o eksctl

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin

Criar o cluster EKS

eksctl create cluster   --name meu-cluster   --region sa-east-1   --nodes 2   --nodes-min 1   --nodes-max 3   --node-type m5.large

Conceitos principais do Kubernetes

Pense em um cluster Kubernetes como uma cidade. Pods são os prédios (menor unidade deployável), Services são as ruas que roteiam tráfego para os prédios, Deployments são as regras de planejamento urbano que dizem quantos prédios de cada tipo devem existir, e Ingress é a entrada da rodovia que roteia visitantes externos para a rua correta.

Pod

apiVersion: v1
kind: Pod
metadata:
  name: meu-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest

Service

apiVersion: v1
kind: Service
metadata:
  name: meu-servico
spec:
  selector:
    app: meu-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: meu-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: meu-app
  template:
    metadata:
      labels:
        app: meu-app
    spec:
      containers:
      - name: nginx
        image: nginx:latest

ConfigMap e Secret

ConfigMaps guardam configuração não sensível (variáveis de ambiente, configurações), Secrets guardam dados sensíveis (senhas, tokens) em formato base64. Ambos podem ser injetados como variáveis de ambiente ou montados como volumes dentro dos pods.

DaemonSet

Garante que um pod rode em cada nó do cluster. Usado para agentes de logging, coletores de monitoramento e plugins de rede. Quando um novo nó entra, o pod do DaemonSet aparece automaticamente.

StatefulSet

Como um Deployment, mas para apps com estado. Cada pod recebe uma identidade estável e storage persistente entre reinicializações. Usado para bancos de dados como PostgreSQL ou Redis.

RBAC (Controle de Acesso Baseado em Roles)

ServiceAccount, Role/ClusterRole e RoleBinding/ClusterRoleBinding trabalham juntos para controlar o que pods e usuários podem fazer no cluster. Um Role é limitado ao namespace, um ClusterRole se aplica a todo o cluster.

Permitir acesso de devs ao cluster

aws eks update-kubeconfig --region sa-east-1 --name meu-cluster
kubectl get configmap aws-auth -n kube-system -o yaml > aws-auth.yaml

Edite o aws-auth.yaml para adicionar usuários IAM em mapUsers com o grupo system:masters, depois aplique de volta.

Comandos úteis

kubectl get pods -A               # Todos os pods em todos os namespaces
kubectl get svc -n meu-namespace  # Services em um namespace
kubectl describe pod meu-pod      # Debugar um pod específico
kubectl logs meu-pod -f           # Ver logs do pod em tempo real
kubectl apply -f manifest.yaml    # Aplicar um manifest
kubectl delete -f manifest.yaml   # Deletar recursos de um manifest

O que você construiu

Um cluster EKS rodando com workloads deployados, rede configurada e as ferramentas prontas para as operações do dia a dia.

Próximos passos

  • Use managed node groups para os worker nodes do EKS: a AWS cuida do patching do SO e substituição dos nós, o que reduz bastante o overhead operacional.
  • Defina requests e limits de recursos em cada pod. Sem limits, um único pod mal-comportado pode asfixiar o nó inteiro.
  • Use o AWS Load Balancer Controller para criar ALBs e NLBs a partir de recursos Ingress e Service do Kubernetes, mantendo o gerenciamento de infraestrutura dentro do cluster.

Dúvidas ou feedback? Me encontre no LinkedIn ou GitHub.

Deixe um comentário