Sobes.tech
Junior

Mantém-se algum estado ao fazer o deployment?

sobes.tech IA

Resposta da IA

Ao implementar um Deployment no Kubernetes, o estado não é guardado dentro do próprio controlador Deployment. O Deployment gere um ReplicaSet, que por sua vez gere os Pods. Os Pods são por natureza efémeros e podem ser reiniciados ou eliminados.

A preservação do estado para aplicações implementadas com Deployment geralmente é realizada através de outros mecanismos:

  • Persistent Volumes (PV) e Persistent Volume Claims (PVC): Usados para armazenar dados que devem permanecer acessíveis mesmo após a eliminação ou reinício dos Pods. O PV fornece armazenamento, e o PVC faz a solicitação.
  • ConfigMaps e Secrets: Usados para armazenar dados de configuração e informações sensíveis (senhas, chaves), separados da imagem do contêiner.
  • StatefulSets: Controlador especificamente desenvolvido para gerir aplicações com estado. Os StatefulSets garantem uma identificação de rede estável e armazenamento persistente para cada Pod, bem como uma implementação e escalonamento ordenados.

Exemplo de pedido PVC num manifesto de Pod:

# Definição de um Pod que usa PVC
apiVersion: v1
kind: Pod
metadata:
  name: minha-aplicacao-com-estado
spec:
  containers:
  - name: meu-conteiner
    image: minha-imagem
    volumeMounts:
    - name: volume-de-dados
      mountPath: /dados
  volumes:
  - name: volume-de-dados
    persistentVolumeClaim:
      claimName: minha-pvc

Exemplo de definição de StatefulSet:

# Definição de StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: meu-statefulset
spec:
  serviceName: "meu-servico"
  replicas: 3
  selector:
    matchLabels:
      app: minha-aplicacao-com-estado
  template:
    metadata:
      labels:
        app: minha-aplicacao-com-estado
    spec:
      containers:
      - name: meu-conteiner
        image: minha-imagem
        volumeMounts:
        - name: meu-volume
          mountPath: /dados
  volumeClaimTemplates:
  - metadata:
      name: meu-volume
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Portanto, o próprio Deployment não armazena estado. A sua tarefa é garantir a quantidade necessária de réplicas de Pods sem guardar a sua identidade ou estado entre reinícios. Para aplicações com estado, usam-se StatefulSets, PV/PVC, ConfigMaps e Secrets.