StatefulSets

StatefulSets e Services

O que é um StatefulSet?

Os StatefulSets são uma funcionalidade do Kubernetes que gerencia o deployment e o scaling de um conjunto de Pods, fornecendo garantias sobre a ordem de deployment e a singularidade desses Pods. Diferente dos Deployments e Replicasets que são considerados stateless (sem estado), os StatefulSets são utilizados quando você precisa de mais garantias sobre o deployment e scaling. Eles garantem que os nomes e endereços dos Pods sejam consistentes e estáveis ao longo do tempo. Os StatefulSets funcionam criando uma série de Pods replicados. Cada réplica é uma instância da mesma aplicação que é criada a partir do mesmo spec, mas pode ser diferenciada por seu índice e hostname.

O StatefulSet e os Volumes Persistentes

Um aspecto chave dos StatefulSets é a integração com Volumes Persistentes. Quando um Pod é recriado, ele se reconecta ao mesmo Volume Persistente, garantindo a persistência dos dados entre as recriações dos Pods.

O que são os Headless Services?

Os Headless Services são um tipo de serviço que não possui um IP Cluster. Eles são utilizados para descoberta de Pods através de DNS. Quando um Headless Service é criado, o Kubernetes cria um DNS A Record para cada Pod que faz parte do Service. Isso permite que os Pods sejam acessados diretamente através de seu nome.

O StatefulSet e os Headless Services

Os StatefulSets e os Headless Services são utilizados em conjunto para garantir que os Pods tenham nomes e endereços consistentes e estáveis ao longo do tempo. Quando um StatefulSet é criado, o Kubernetes cria um Headless Service para o StatefulSet. Esse Headless Service é utilizado para descoberta de Pods através de DNS.

Criando um StatefulSet

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

Criando um Headless Service

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: http
  clusterIP: None
  selector:
    app: nginx