Post

Kubernetes 101: StatefulSets

Fala galera! Seis tão baum?

No Kubernetes, os workloads podem ser gerenciados por diferentes tipos de controladores. Enquanto os Deployments são amplamente utilizados para aplicações stateless, os StatefulSets são essenciais para aplicações stateful, como bancos de dados distribuídos, sistemas de mensageria e outras aplicações que exigem identificação consistente e armazenamento persistente.

O que é um StatefulSet?

StatefulSet é um controlador de Kubernetes projetado para gerenciar aplicações stateful. Diferente de um Deployment, que cria réplicas idênticas de um pod sem garantir ordem ou identidade, os StatefulSets garantem que cada pod tenha:

  • Um nome fixo e previsível.
  • Ordem de inicialização e terminação.
  • Volume persistente exclusivo para armazenar dados.

Isso é fundamental para aplicações que necessitam de identidade fixa, como bancos de dados PostgreSQL, MongoDB, Cassandra, e sistemas distribuídos como Apache Kafka e Zookeeper.

Estrutura de um StatefulSet

Um StatefulSet tem os seguintes componentes principais:

  • Pods nomeados: Cada pod recebe um nome previsível com sufixos sequenciais, como meu-app-0, meu-app-1, etc.
  • Headless Service: Um Service sem IP próprio (ClusterIP: None) para resolução de DNS entre os pods.
  • PersistentVolumeClaims (PVCs): Cada pod tem seu próprio volume persistente e não compartilha com outros pods.

Exemplo de StatefulSet com Banco de Dados

Vamos criar um StatefulSet para um banco de dados PostgreSQL com armazenamento persistente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: "postgres"
  replicas: 2
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:13
        env:
        - name: POSTGRES_USER
          value: "admin"
        - name: POSTGRES_PASSWORD
          value: "secret"
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: postgres-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Gi

Esse exemplo cria um cluster PostgreSQL com dois pods, cada um com seu volume persistente.

Verificando o StatefulSet

Após criar o StatefulSet, podemos verificar seu status com os seguintes comandos:

1
kubectl get statefulsets

Saída esperada:

1
2
NAME          READY   AGE
postgres      2/2     10m

Para visualizar os pods criados:

1
kubectl get pods -l app=postgres

Saída esperada:

1
2
3
NAME            READY   STATUS    RESTARTS   AGE
postgres-0      1/1     Running   0          10m
postgres-1      1/1     Running   0          9m

Verificando os volumes persistentes:

1
kubectl get pvc

Saída esperada:

1
2
3
NAME                STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
postgres-storage-0  Bound    pvc-xyz  2Gi        RWO            standard       10m
postgres-storage-1  Bound    pvc-abc  2Gi        RWO            standard       9m

StatefulSet vs Deployment

CaracterísticaStatefulSetDeployment
Identidade dos PodsSim (fixa)Não
Ordem de inicializaçãoGarantidaNão
Volume PersistenteIndividualCompartilhado/Volátil
Uso comumBancos de dados, sistemas distribuídosAplicações stateless, web apps
Atualização Rolling UpdateSim (controlada)Sim (rápida)

Quando usar StatefulSets?

StatefulSets são recomendados para:

  • Bancos de dados distribuídos (PostgreSQL, MySQL, MongoDB, Cassandra)
  • Mensageria (Kafka, RabbitMQ)
  • Aplicativos que necessitam de armazenamento persistente e identificadores fixos
  • Aplicativos que precisam de uma ordem de inicialização controlada

Se sua aplicação não precisar dessas funcionalidades, um Deployment é uma escolha mais simples e eficiente.

Conclusão

StatefulSets são um recurso essencial para rodar workloads stateful no Kubernetes, garantindo identidade fixa, volumes persistentes e ordem de inicialização. Se você estiver trabalhando com bancos de dados, sistemas distribuídos ou qualquer aplicação que necessite de consistência, um StatefulSet é a melhor escolha.

Por outro lado, se você precisa de escalabilidade rápida e gerenciamento flexível sem necessidade de persistência, os Deployments são a opção mais indicada.

Lembre-se de sempre testar seus workloads e avaliar qual abordagem se encaixa melhor nas necessidades da sua infraestrutura.

Você pode acessar a documentação oficial aqui: StatefulSets

É isso, galera! Se você gostou do artigo, comenta ou mande pra galera que também quer aprender Kubernetes!

Se você tiver alguma dúvida ou comentário, sinta-se à vontade para compartilhá-los conosco na seção de comentários abaixo!

Forte Abraço!

Este post está licenciado sob CC BY 4.0 e pelo autor.