DEV Community

Daniel
Daniel

Posted on

StatefulSets - Kubernetes (BR)

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 um statefulSets gerencia os pods 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 ?

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
Enter fullscreen mode Exit fullscreen mode

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

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

Top comments (0)