kb.erickguedes.com
Kubernetes: Orquestração em Produção

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.