O que é Orquestração de Containers
Orquestração de containers é uma tecnologia que automatiza o posicionamento, escalonamento, networking e gerenciamento de disponibilidade de múltiplos containers. É um mecanismo essencial para operar um grande número de containers em ambiente de produção.
Por que é necessário: Com poucos containers, é possível gerenciar manualmente, mas com centenas ou milhares de containers, torna-se necessário um sistema que automatize o posicionamento, detecção de falhas e escalonamento.
Problemas que a Orquestração Resolve
| Problema | Solução |
|---|---|
| Posicionamento de containers | Decisão automática de em qual nó executar |
| Escalonamento | Ajuste automático do número de containers conforme a carga |
| Recuperação de falhas | Reinício automático quando um container falha |
| Balanceamento de carga | Distribuição de tráfego entre múltiplos containers |
| Service discovery | Configuração automática de comunicação entre containers |
| Rolling update | Atualização de aplicações sem downtime |
Arquitetura Básica do Kubernetes
flowchart TB
subgraph CP["Control Plane"]
API["API Server"]
SCH["Scheduler"]
CM["Controller Manager"]
ETCD["etcd"]
end
subgraph W1["Worker Node 1"]
K1["kubelet"]
KP1["kube-proxy"]
P1A["Pod"]
P1B["Pod"]
end
subgraph W2["Worker Node 2"]
K2["kubelet"]
KP2["kube-proxy"]
P2A["Pod"]
P2B["Pod"]
end
subgraph W3["Worker Node 3"]
K3["kubelet"]
KP3["kube-proxy"]
P3A["Pod"]
P3B["Pod"]
end
CP --> W1
CP --> W2
CP --> W3
Control Plane
- API Server: Ponto de entrada para todas as operações no cluster
- Scheduler: Decide em qual nó cada Pod será executado
- Controller Manager: Conjunto de controllers que mantêm o estado desejado
- etcd: KVS distribuído que armazena o estado do cluster
Worker Node
- kubelet: Gerencia os Pods no nó
- kube-proxy: Proxy de rede e balanceamento de carga
Recursos Principais
Pod
A menor unidade de deploy do Kubernetes. Agrupa um ou mais containers.
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
app: web
spec:
containers:
- name: app
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Deployment
Gerencia réplicas de Pods e rolling updates.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: my-app:1.0.0
ports:
- containerPort: 8080
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
Service
Fornece acesso de rede estável aos Pods.
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080
type: ClusterIP
Tipos de Service
| Tipo | Descricao |
|---|---|
| ClusterIP | Acessivel apenas de dentro do cluster |
| NodePort | Exposto externamente na porta de cada no |
| LoadBalancer | Exposto externamente integrando com LB de cloud |
| ExternalName | Alias para servico externo |
ConfigMap / Secret
Gerencia configurações e informações sensíveis.
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_HOST: "db.example.com"
LOG_LEVEL: "info"
---
# Secret
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
DATABASE_PASSWORD: cGFzc3dvcmQxMjM= # codificado em base64
# Uso no Pod
spec:
containers:
- name: app
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secrets
Escalonamento
Escalonamento Manual
kubectl scale deployment web-deployment --replicas=5
Escalonamento Automático (HPA)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Rolling Update
flowchart LR
subgraph Before["Antes da atualizacao"]
B1["v1"]
B2["v1"]
B3["v1"]
end
subgraph During["Durante a atualizacao"]
direction TB
D1["v1 v1 v1 v2 ← Nova versao adicionada"]
D2["v1 v1 v2 v2 ← Versao antiga removida"]
D3["v1 v2 v2 v2"]
D1 --> D2 --> D3
end
subgraph After["Apos atualizacao"]
A1["v2"]
A2["v2"]
A3["v2"]
end
Before --> During --> After
# Atualizar imagem
kubectl set image deployment/web-deployment web=my-app:2.0.0
# Verificar status da atualizacao
kubectl rollout status deployment/web-deployment
# Rollback
kubectl rollout undo deployment/web-deployment
Health Check
spec:
containers:
- name: app
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 3
- livenessProbe: Em caso de falha, reinicia o container
- readinessProbe: Em caso de falha, remove do Service
Resumo
Kubernetes é uma plataforma poderosa que automatiza a operação de aplicações containerizadas. Compreendendo os recursos básicos como Pod, Deployment e Service, e combinando-os adequadamente, é possível construir sistemas escaláveis e altamente disponíveis.
← Voltar para a lista