Workloads: Deployments e StatefulSets
Aula 2 de 8
Deployment — Aplicações Stateless
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
labels:
app: api
spec:
replicas: 3
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: minha-app:1.2.0
ports:
- containerPort: 3000
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 3
periodSeconds: 5
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
kubectl apply -f deployment.yaml
kubectl get deployments
kubectl get pods -l app=api
kubectl scale deployment api --replicas=5
Rolling Update e Rollback
# Update (muda a imagem)
kubectl set image deployment/api api=minha-app:1.3.0
kubectl rollout status deployment/api
# Histórico
kubectl rollout history deployment/api
# Rollback
kubectl rollout undo deployment/api
kubectl rollout undo deployment/api --to-revision=2
# Pause/Resume
kubectl rollout pause deployment/api
kubectl rollout resume deployment/api
StatefulSet — Aplicações Stateful
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 3
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:16-alpine
ports:
- containerPort: 5432
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
Características StatefulSet
- Nomes estáveis: postgres-0, postgres-1, postgres-2
- PVCs persistentes por pod (deletar pod não perde dados)
- Ordenação garantida (start/stop do 0 ao N)
- DNS estável: postgres-0.postgres.default.svc.cluster.local
DaemonSet — Um Pod por Nó
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd:v1.16
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
hostPath:
path: /var/log
Jobs e CronJobs
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: postgres:16-alpine
command:
- pg_dump
- -h
- postgres
- -U
- admin
- mydb
restartPolicy: OnFailure
kubectl create job --from=cronjob/backup manual-backup
kubectl get jobs
Deployment = apps stateless. StatefulSet = dados persistentes. DaemonSet = um pod por nó (logging, monitoring). CronJob = tasks agendadas. Escolha o workload certo para cada caso.