Os Pods no Kubernetes são a menor unidade executável da plataforma e servem como base para o agendamento e execução de aplicações em contêineres. Embora o uso básico de Pods seja simples, dominar os conceitos avançados de Pods no Kubernetes permite otimizar a distribuição de cargas de trabalho, aumentar a resiliência dos serviços e gerenciar recursos de forma eficiente. Neste artigo, exploramos práticas avançadas que engenheiros DevOps precisam conhecer para extrair o máximo da orquestração com Kubernetes.
1. Pods com Múltiplos Contêineres: Padrões Sidecar, Adapter e Ambassador
Um único Pod pode conter múltiplos contêineres que compartilham o mesmo namespace de rede e volume. Essa arquitetura é útil para implementar padrões que estendem funcionalidades sem acoplar ao código da aplicação principal.
Sidecar Pattern
Um contêiner auxiliar adiciona funcionalidades complementares à aplicação, como coleta de logs.
containers:
- name: app
image: my-app
- name: logger
image: fluentd
Adapter Pattern
Transforma a saída da aplicação em um formato aceito por outros sistemas, útil para normalização de dados.
Ambassador Pattern
Funciona como um proxy entre a aplicação e serviços externos, ideal para controle de tráfego ou cache.
2. Init Containers: Inicialização do Ambiente
Os Init Containers são executados antes dos contêineres principais e preparam o ambiente de execução, como validação de dependências ou scripts de inicialização.
initContainers:
- name: setup
image: busybox
command: ["sh", "-c", "echo Preparando ambiente..."]
3. Pod Disruption Budgets (PDB): Garantindo Disponibilidade
O PDB impede que todos os Pods de uma aplicação sejam interrompidos durante manutenções ou escalonamentos.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: my-app
4. Afinidade e Anti-Afinidade de Pods
Controla o agendamento de Pods com base em afinidade com outros Pods.
Afinidade de Pods (Co-localização)
Garante que Pods com a mesma etiqueta sejam executados no mesmo nó.
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- backend
topologyKey: "kubernetes.io/hostname"
Anti-Afinidade de Pods (Distribuição entre nós)
Evita que múltiplos Pods com a mesma função compartilhem o mesmo nó.
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- backend
topologyKey: "kubernetes.io/hostname"
5. Probes: Readiness, Liveness e Startup
Utilizadas para monitorar o estado dos contêineres e garantir disponibilidade.
Readiness Probe
Verifica se a aplicação está pronta para receber tráfego.
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
Liveness Probe
Reinicia o contêiner caso ele esteja travado.
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 15
Startup Probe
Dá mais tempo para aplicações com inicialização lenta.
startupProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
6. Gerenciamento de Recursos: Requests e Limits
Define os recursos mínimos e máximos que um Pod pode consumir.
resources:
requests:
cpu: "500m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "512Mi"
requests: Reserva mínima de CPU/memória.
limits: Limite máximo permitido.
7. Taints e Tolerations: Controlando o Agendamento de Pods
Taints impedem que Pods sejam agendados em determinados nós, a menos que possuam uma toleration correspondente.
kubectl taint nodes node1 key=value:NoSchedule
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
8. Armazenamento Efêmero vs Persistente
Armazenamento Efêmero (emptyDir)
Perde os dados quando o Pod é reiniciado.
volumes:
- name: temp-storage
emptyDir: {}
Armazenamento Persistente (PVC)
Mantém dados entre reinícios.
volumes:
- name: data-storage
persistentVolumeClaim:
claimName: my-pvc
9. Autoscaling Horizontal e Vertical
Horizontal Pod Autoscaler (HPA)
Ajusta o número de réplicas com base em uso de CPU/memória.
kubectl autoscale deployment my-app --cpu-percent=50 --min=2 --max=10
Vertical Pod Autoscaler (VPA)
Modifica dinamicamente os requests e limits dos Pods.
kubectl apply -f vpa.yaml
10. Políticas de Rede: Controle de Comunicação entre Pods
Permite restringir comunicações entre Pods com base em etiquetas.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
Dominar os conceitos avançados de Pods no Kubernetes é essencial para engenheiros DevOps que buscam maior controle, escalabilidade e segurança na operação de aplicações em ambientes de produção. O uso estratégico desses recursos permite construir arquiteturas mais resilientes, escaláveis e com melhor aproveitamento dos recursos computacionais.
Sou um profissional na área de Tecnologia da informação, especializado em monitoramento de ambientes, Sysadmin e na cultura DevOps. Possuo certificações de Segurança, AWS e Zabbix.