โ˜ธ๏ธ Kubernetes

Orquestraรงรฃo de containers em escala โ€” do cluster ao deploy em produรงรฃo

โ˜ธ๏ธ O que รฉ Kubernetes?

Kubernetes (K8s) รฉ uma plataforma open-source de orquestraรงรฃo de containers. Ele automatiza o deploy, escalonamento e gerenciamento de aplicaรงรตes em containers.

Enquanto o Docker resolve o problema de "como empacotar e rodar um container", o Kubernetes resolve "como gerenciar centenas de containers em produรงรฃo".

  • Auto-healing โ€” reinicia containers que falham automaticamente
  • Auto-scaling โ€” escala a aplicaรงรฃo conforme a demanda
  • Load balancing โ€” distribui trรกfego entre instรขncias
  • Rolling updates โ€” atualiza sem downtime
  • Self-service โ€” times fazem deploy sem depender de infra
๐Ÿ’ก Origem do nome: Kubernetes vem do grego "ฮบฯ…ฮฒฮตฯฮฝฮฎฯ„ฮทฯ‚" (timoneiro, piloto de navio). K8s รฉ a abreviaรงรฃo: K + 8 letras + s.

๐Ÿ—๏ธ Arquitetura do Cluster

Um cluster Kubernetes รฉ composto por dois tipos de nรณs:

CLUSTER KUBERNETES โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ CONTROL PLANE (Master Node) โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ API Server โ”‚ โ”‚ etcd โ”‚ โ”‚Schedulerโ”‚ โ”‚Control โ”‚ โ”‚ โ”‚ โ”‚ (porta 6443) โ”‚ โ”‚(key-valueโ”‚ โ”‚ โ”‚ โ”‚Manager โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ store) โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ†• kubectl / API calls โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ WORKER NODE 1 โ”‚ โ”‚ WORKER NODE 2 โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ kubelet โ”‚ โ”‚ โ”‚ โ”‚ kubelet โ”‚ โ”‚ โ”‚ โ”‚ kube-proxy โ”‚ โ”‚ โ”‚ โ”‚ kube-proxy โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”‚Pod โ”‚ โ”‚Pod โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚Pod โ”‚ โ”‚Pod โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
ComponenteFunรงรฃo
API ServerPonto central de comunicaรงรฃo โ€” tudo passa por ele
etcdBanco de dados chave-valor que armazena o estado do cluster
SchedulerDecide em qual nรณ cada Pod serรก executado
Controller ManagerGarante que o estado atual = estado desejado
kubeletAgente em cada nรณ โ€” garante que os containers rodem
kube-proxyGerencia regras de rede em cada nรณ

๐Ÿงฉ Objetos Principais

ObjetoO que fazAnalogia
PodMenor unidade โ€” 1 ou mais containers que compartilham rede e storageUm processo
DeploymentGerencia rรฉplicas de Pods, rolling updates e rollbacksGerente de equipe
ReplicaSetGarante N rรฉplicas de um Pod rodando (gerenciado pelo Deployment)Supervisor de turno
ServiceExpรตe Pods com IP estรกvel e load balancingRecepcionista
IngressRoteamento HTTP/HTTPS externo para ServicesPorteiro com mapa
ConfigMapConfiguraรงรตes nรฃo-sensรญveis injetadas nos PodsArquivo .env
SecretDados sensรญveis (senhas, tokens) em base64Cofre
NamespaceIsolamento lรณgico dentro do clusterPasta de projeto
PersistentVolumeStorage persistente independente do PodHD externo

โŒจ๏ธ kubectl โ€” Comandos Essenciais

O kubectl รฉ a CLI para interagir com o cluster:

# Verificar conexรฃo com o cluster
kubectl cluster-info
kubectl get nodes

# Listar recursos
kubectl get pods
kubectl get pods -n kube-system          # namespace especรญfico
kubectl get pods -A                      # todos os namespaces
kubectl get deployments
kubectl get services
kubectl get all                          # tudo de uma vez

# Detalhes de um recurso
kubectl describe pod meu-pod
kubectl describe deployment minha-app

# Logs
kubectl logs meu-pod
kubectl logs meu-pod -f                  # follow (tempo real)
kubectl logs meu-pod -c meu-container    # container especรญfico

# Executar comando dentro de um Pod
kubectl exec -it meu-pod -- bash
kubectl exec -it meu-pod -- sh          # para imagens Alpine

# Aplicar/deletar manifests
kubectl apply -f deployment.yaml
kubectl delete -f deployment.yaml
kubectl delete pod meu-pod

# Escalar deployment
kubectl scale deployment minha-app --replicas=5

# Ver histรณrico de rollout
kubectl rollout history deployment/minha-app
kubectl rollout undo deployment/minha-app  # rollback

๐Ÿ“„ Manifests YAML

Tudo no Kubernetes รฉ declarado em YAML. Vocรช descreve o estado desejado e o K8s se encarrega de chegar lรก.

Pod simples:

apiVersion: v1
kind: Pod
metadata:
  name: meu-pod
  labels:
    app: minha-app
spec:
  containers:
  - name: app
    image: nginx:1.25
    ports:
    - containerPort: 80

Deployment com 3 rรฉplicas:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: minha-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: minha-app
  template:
    metadata:
      labels:
        app: minha-app
    spec:
      containers:
      - name: app
        image: minha-app:1.0
        ports:
        - containerPort: 3000
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "250m"
๐Ÿ’ก Sempre defina resources. Sem limites de CPU/memรณria, um Pod pode consumir todos os recursos do nรณ e derrubar outros Pods.

๐ŸŒ Services e Ingress

Pods tรชm IPs efรชmeros โ€” morrem e nascem com IPs diferentes. O Service fornece um IP estรกvel e faz load balancing.

TipoAcessoUso
ClusterIPInterno ao clusterComunicaรงรฃo entre serviรงos
NodePortIP do nรณ + porta alta (30000-32767)Testes locais
LoadBalancerIP externo via cloud providerProduรงรฃo na AWS/GCP/Azure
# Service ClusterIP (comunicaรงรฃo interna)
apiVersion: v1
kind: Service
metadata:
  name: minha-app-svc
spec:
  selector:
    app: minha-app
  ports:
  - port: 80
    targetPort: 3000
# Ingress โ€” roteamento HTTP por path/host
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: meu-ingress
spec:
  rules:
  - host: app.aegiscloud.com.br
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: minha-app-svc
            port:
              number: 80

๐Ÿ” ConfigMap e Secrets

Separe configuraรงรฃo do cรณdigo โ€” nunca coloque variรกveis de ambiente hardcoded na imagem.

# ConfigMap โ€” configuraรงรตes nรฃo-sensรญveis
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: "production"
  LOG_LEVEL: "info"
  DB_HOST: "postgres-svc"

---
# Secret โ€” dados sensรญveis (base64)
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  DB_PASSWORD: c2VuaGExMjM=   # echo -n 'senha123' | base64
  API_KEY: bWluaGEtY2hhdmU=
# Usando no Deployment
envFrom:
- configMapRef:
    name: app-config
- secretRef:
    name: app-secrets
โš ๏ธ Secrets no K8s sรฃo apenas base64, nรฃo criptografados por padrรฃo. Em produรงรฃo, use AWS Secrets Manager + External Secrets Operator ou Vault.

โ˜๏ธ Kubernetes na AWS โ€” EKS

O Amazon EKS (Elastic Kubernetes Service) รฉ o Kubernetes gerenciado da AWS. A AWS cuida do Control Plane โ€” vocรช gerencia apenas os Worker Nodes.

# Instalar eksctl (CLI para EKS)
curl --silent --location \
  "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz" \
  | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin

# Criar cluster EKS (leva ~15 min)
eksctl create cluster \
  --name aegiscloud-cluster \
  --region us-east-1 \
  --nodegroup-name workers \
  --node-type t3.medium \
  --nodes 2 \
  --nodes-min 1 \
  --nodes-max 4 \
  --managed

# Configurar kubectl para o cluster
aws eks update-kubeconfig \
  --region us-east-1 \
  --name aegiscloud-cluster

# Verificar
kubectl get nodes
๐Ÿ’ก Para estudos e testes locais, use minikube ou kind โ€” rodam um cluster K8s completo na sua mรกquina sem custo.
# Instalar minikube (Linux/WSL2)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# Iniciar cluster local
minikube start

# Acessar dashboard web
minikube dashboard

# Parar cluster
minikube stop