StatefulSets - Kubernetes (BR)
Tags: kubernetes, devops
Published: 2023-08-19 17:23:05

---
title: StatefulSets - Kubernetes (BR)
published: true
description: StatefulSets kubernetes
tags: #kubernetes #devops
# cover_image: https://direct_url_to_image.jpg
# Use a ratio of 100:42 for best results.
# published_at: 2023-08-19 15:44 +0000
---
## O que é um `StatefulSets`?
É um objeto de carga de trabalho usado para gerenciar aplicações de demandam ter estado.

## Para que serve ?
Como um [Deployment](https://dev.to/daniellcas/deployment-kubernetes-1ja4) um `statefulSets` gerencia os [pods](https://dev.to/daniellcas/pods-kubernetes-507k) baseado em uma especificação no template. `StatefulSets` mantém uma identidade fixa para cada um de seus pods, por isso os pods não são trocáveis, são criados da mesma especificação porém cada um identificador persistente.

## Quando devo escolher trabalhar com `StatefulSets`?
- Caso precise de um armazenamento persistente.
- Identificadores de rede estáveis ​​e exclusivos.
- Implantação e dimensionamento ordenados e elegantes.
- Atualizações contínuas ordenadas e automatizadas.

Caso não precise de persistência é aconselhável usar Deployment ou ReplicaSet.

## Limitações
1. O armazenamento de um determinado pod deve ser provisionado por um **PersistentVolume**.
2. Ao reduzir/Excluir as replicas, seu armazenamento não sera excluído, isso é feito para garantir a segurança de seus dados.
3. O statefulSets não garante enceramento de todos os pods.
recomendado reduzir as replicas para zero, antes da exclusão.

## Como criar ?
```yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # tem que combinar com .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # default é 1
  minReadySeconds: 10 # default é 0
  template:
    metadata:
      labels:
        app: nginx # tem que combinar com .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1Gi
```

No exemplo acima criamos um statefulSets chamado de web, com uma especificação de 3 replicas de contêineres nginx, o `volumeClaimTemplates` fornecerá armazenamento estável usando **PersistentVolumes**, e um **Headless Service**, chamado nginx, é usado para controlar o domínio da rede.

Os pods de um statefulSets tem identidade exclusiva, uma identidade de rede estável e armazenamento estável.

---

## Máximo de pods indisponíveis.
Você pode controlar o número máximo de pods indisponíveis durante alguma atualização, em `.spec.updateStrategy.rollingUpdate.maxUnavailable`. Lembrando que o número tem que ser um absoluto ou percentual. 

## Estratégias de atualização.
No campo `.spec.updateStrategy` você pode definir o tipo de estratégia que ira utilizar.
1. OnDelete -> nesse caso você deve excluir os pods manualmente para o controlador criar novos pods.
2. RollingUpdate -> já nesse caso as atualizações são continuas vem como opção default.

## Atualizações contínuas.
Quando o `.spec.updateStrategy.type` é definido como `RollingUpdate`, o controlador excluirá e recriará cada pod,
atualizando sempre o último para o primeiro, ele vai para o próximo quando o ultimo estiver em execução e pronto. você também pode mudar o tempo em `.spec.minReadySeconds`, tempo de atualização entre um pod e outro.

---

## Conclusão
![StateFulSet](https://loft.sh/images/blog/posts/stateful-set-bp-2.png?nf_resize=fit&w=1040)

O `Statefulset` gerencia os pods que precisam de um armazenamento persistente, ele utiliza o PersistentVolumeClaim para persistir seus volumes, lembrando que o `statefulset` precisa de um gerenciamento próprio do seu serviço como **Headless Service**.

---

> ### Referências
>> [Kubernetes](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset)