Série k8s: ReplicaSet, DaemonSet e StatefulSet — quando usar cada um

Este post faz parte da série de fundamentos de Kubernetes. Aqui vamos entender três tipos de workloads que aparecem o tempo todo no dia a dia: ReplicaSet, DaemonSet e StatefulSet.

A ideia é explicar o papel de cada um, quando usar e quais comandos básicos ajudam na operação.

ReplicaSet

O ReplicaSet garante que uma quantidade desejada de Pods esteja sempre em execução. Na prática, ele é quase sempre criado e gerenciado por um Deployment.

Use o ReplicaSet quando você quer manter um número fixo de Pods iguais rodando. O controlador cria Pods quando faltam e remove quando sobram.

Exemplo YAML (ReplicaSet)

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
          ports:
            - containerPort: 80

Comandos (ReplicaSet)

  • Aplicar um Deployment (gera o ReplicaSet definido no manifesto):
kubectl apply -f deployment.yaml

Exemplo deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
          ports:
            - containerPort: 80
  • Listar ReplicaSets:
kubectl get rs
  • Detalhar um ReplicaSet (status, eventos e pods associados):
kubectl describe rs
  • Remover um ReplicaSet pelo nome:
kubectl delete replicaset nginx-replicaset
  • Remover o ReplicaSet definido em um arquivo:
kubectl delete -f nginx-replicaset.yaml

DaemonSet

O DaemonSet garante que todos os nós do cluster (ou um subconjunto) executem uma cópia de um Pod. É ideal para agentes que precisam rodar em cada nó.

Casos comuns:

  • agentes de monitoramento (ex.: node exporter);
  • coletores de logs (ex.: Fluent Bit/Fluentd);
  • componentes de rede (ex.: CNI, kube-proxy).

Exemplo YAML (DaemonSet)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  labels:
    app: node-exporter
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      containers:
        - name: node-exporter
          image: prom/node-exporter:latest
          ports:
            - containerPort: 9100

Comandos (DaemonSet)

  • Aplicar o manifesto do DaemonSet:
kubectl apply -f node-exporter-daemonset.yaml
  • Listar DaemonSets:
kubectl get daemonset
  • Listar os Pods do DaemonSet pelo label:
kubectl get pods -l app=node-exporter
  • Listar os nós do cluster (para conferir onde o DaemonSet vai rodar):
kubectl get nodes
  • Remover o DaemonSet pelo nome:
kubectl delete daemonset node-exporter
  • Remover o DaemonSet definido em um arquivo:
kubectl delete -f node-exporter-daemonset.yaml

StatefulSet

O StatefulSet é o controlador recomendado para aplicações com estado. Ele garante:

  • identidade estável dos Pods (nome previsível);
  • ordem de criação e remoção;
  • volumes persistentes exclusivos por réplica.

É fundamental para bancos de dados e sistemas distribuídos (PostgreSQL, MongoDB, Kafka, Zookeeper, etc.).

Além disso, StatefulSet normalmente depende de um Headless Service para garantir identidades de rede estáveis.

Exemplo YAML (StatefulSet)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-stateful
  labels:
    app: nginx-stateful
spec:
  serviceName: nginx-headless
  replicas: 3
  selector:
    matchLabels:
      app: nginx-stateful
  template:
    metadata:
      labels:
        app: nginx-stateful
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
          ports:
            - containerPort: 80
          volumeMounts:
            - name: data
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: [\"ReadWriteOnce\"]
        resources:
          requests:
            storage: 1Gi

Comandos (StatefulSet)

  • Aplicar o manifesto do StatefulSet (Service headless + StatefulSet):
kubectl apply -f statefulset.yaml
  • Listar StatefulSets:
kubectl get statefulset
  • Detalhar um StatefulSet:
kubectl describe statefulset nginx-stateful
  • Listar os Pods do StatefulSet:
kubectl get pods -l app=nginx-stateful
  • Listar PVCs criados pelo StatefulSet:
kubectl get pvc
  • Remover o StatefulSet pelo nome:
kubectl delete statefulset nginx-stateful
  • Remover o StatefulSet definido em um arquivo:
kubectl delete -f statefulset.yaml

No próximo post da série, seguimos detalhando Services e como expor aplicações dentro e fora do cluster.