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
- O armazenamento de um determinado pod deve ser provisionado por um PersistentVolume.
- Ao reduzir/Excluir as replicas, seu armazenamento não sera excluído, isso é feito para garantir a segurança de seus dados.
- 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
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.
- OnDelete -> nesse caso você deve excluir os pods manualmente para o controlador criar novos pods.
- 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
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
Top comments (0)