Um Guia Simples para Implementar Armazenamento Persistente no Kubernetes

Aprenda a implementar armazenamento persistente para aplicações com estado no Kubernetes. Este guia desmistifica Volumes Persistentes (PVs) e Reivindicações de Volume Persistente (PVCs), explicando modos de acesso e Classes de Armazenamento. Inclui exemplos práticos em YAML para definir PVCs e montar armazenamento nos seus Pods, permitindo a persistência de dados confiável nas suas aplicações conteinerizadas.

33 visualizações

Um Guia Simples para Implementar Armazenamento Persistente no Kubernetes

No mundo da orquestração de contêineres, o Kubernetes se destaca na gestão de aplicações sem estado – aquelas que não precisam reter dados entre reinícios ou eventos de escalonamento. No entanto, muitas aplicações modernas, como bancos de dados, filas de mensagens e lojas de chave-valor, são inerentemente com estado. Essas aplicações exigem uma maneira confiável de armazenar e acessar dados de forma persistente, mesmo que os Pods que as executam sejam reagendados ou substituídos. É aqui que o Armazenamento Persistente do Kubernetes entra em jogo.

Este guia desmistificará os conceitos de PersistentVolumes (PVs) e PersistentVolumeClaims (PVCs), que são os componentes centrais para gerenciar o armazenamento persistente no Kubernetes. Nós mostraremos como definir, solicitar e vincular armazenamento aos seus Pods com exemplos práticos em YAML, permitindo que você implante com confiança aplicações com estado em seu cluster Kubernetes.

Entendendo PersistentVolumes (PVs) e PersistentVolumeClaims (PVCs)

Antes de mergulhar na implementação, é crucial entender os papéis dos PVs e PVCs:

  • PersistentVolume (PV): Um PV é um pedaço de armazenamento no cluster que foi provisionado por um administrador ou provisionado dinamicamente usando StorageClasses. PVs são recursos do cluster, muito parecidos com os Nós (Nodes). Eles têm um ciclo de vida independente de qualquer Pod individual que use o PV. PVs abstraem os detalhes da implementação de armazenamento subjacente (por exemplo, NFS, iSCSI, armazenamento de bloco de provedor de nuvem).
  • PersistentVolumeClaim (PVC): Um PVC é uma solicitação de armazenamento por um usuário. Ele consome recursos de armazenamento que estão disponíveis no cluster como PVs. PVCs são semelhantes aos Pods, pois consomem recursos de computação, e são delimitados a um namespace. Um PVC especifica a capacidade de armazenamento desejada, modos de acesso e, opcionalmente, uma StorageClass.

Esta separação de preocupações permite que os administradores do cluster provisionem e gerenciem recursos de armazenamento de forma independente, enquanto os desenvolvedores de aplicações podem solicitar armazenamento sem precisar conhecer os detalhes de implementação subjacentes.

Conceitos Chave: Modos de Acesso e StorageClasses

Dois conceitos importantes a serem compreendidos ao trabalhar com PVs e PVCs são Modos de Acesso e StorageClasses:

Modos de Acesso

Modos de acesso definem como um volume pode ser montado em um Pod. Os modos de acesso disponíveis são:

  • ReadWriteOnce (RWO): O volume pode ser montado como leitura-gravação por um único nó.
  • ReadOnlyMany (ROX): O volume pode ser montado como somente leitura por muitos nós.
  • ReadWriteMany (RWX): O volume pode ser montado como leitura-gravação por muitos nós.

É importante notar que o suporte real para esses modos depende do provedor de armazenamento subjacente.

StorageClasses

Uma StorageClass fornece uma maneira para os administradores descreverem as "classes" de armazenamento que eles oferecem. Diferentes classes podem ser mapeadas para níveis de qualidade de serviço, políticas de backup ou políticas arbitrárias determinadas pelos administradores do cluster. Uma StorageClass possui um provisionador que provisiona o armazenamento e um conjunto de parâmetros para o provisionador. Quando um PVC é criado sem um PV específico, e ele solicita uma StorageClass, o Kubernetes provisionará dinamicamente um PV usando a StorageClass especificada.

Implementando Armazenamento Persistente: Passo a Passo

Vamos percorrer um cenário comum: solicitando e usando armazenamento persistente para um Pod.

Passo 1: Definir um PersistentVolumeClaim (PVC)

Primeiro, você precisa criar um PVC que especifique seus requisitos de armazenamento. Este PVC atuará como a solicitação de armazenamento da sua aplicação.

Exemplo pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Neste exemplo:

  • name: my-pvc: Este é o nome do nosso PVC.
  • accessModes: - ReadWriteOnce: Estamos solicitando armazenamento que pode ser montado como leitura-gravação por um único nó.
  • resources.requests.storage: 1Gi: Estamos solicitando 1 Gigabyte de armazenamento.

Aplicando o PVC:

Salve o conteúdo acima em um arquivo chamado pvc.yaml e aplique-o ao seu cluster:

kubectl apply -f pvc.yaml

Após aplicar, você pode verificar o status do PVC:

kubectl get pvc my-pvc

Você deverá ver uma saída indicando que o PVC está Bound (Vinculado) se um PV adequado estiver disponível ou tiver sido provisionado dinamicamente.

Passo 2: Criar um Pod que Usa o PVC

Agora, vamos criar um Pod que utilizará o armazenamento solicitado pelo nosso PVC. Montaremos o volume fornecido pelo PVC em um diretório específico dentro do nosso contêiner.

Exemplo pod-with-pv.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: my-stateful-pod
spec:
  containers:
    - name: my-container
      image: nginx
      ports:
        - containerPort: 80
      volumeMounts:
        - name: my-persistent-storage
          mountPath: /usr/share/nginx/html
  volumes:
    - name: my-persistent-storage
      persistentVolumeClaim:
        claimName: my-pvc

Neste exemplo:

  • volumes: Definimos um volume chamado my-persistent-storage.
  • persistentVolumeClaim.claimName: my-pvc: Isso vincula nosso volume ao PVC que criamos anteriormente.
  • volumeMounts: Dentro da definição do contêiner, especificamos onde este volume deve ser montado (mountPath: /usr/share/nginx/html).

Aplicando o Pod:

Salve o conteúdo acima em um arquivo chamado pod-with-pv.yaml e aplique-o:

kubectl apply -f pod-with-pv.yaml

Agora, seu contêiner nginx terá acesso ao armazenamento persistente definido por my-pvc no caminho /usr/share/nginx/html. Quaisquer dados gravados neste caminho dentro do contêiner serão persistidos mesmo que o Pod seja excluído e recriado, desde que o PVC e seu PV subjacente permaneçam.

Provisionamento Dinâmico com StorageClasses

Criar PVs manualmente pode ser complicado. O Kubernetes oferece provisionamento dinâmico, onde os PVs são criados automaticamente quando um PVC solicita armazenamento que não pode ser satisfeito por PVs existentes. Isso é alcançado através de StorageClasses.

A maioria dos provedores de nuvem (AWS, GCP, Azure) oferece StorageClasses pré-configuradas. Você pode inspecioná-las com:

kubectl get storageclass

Para usar o provisionamento dinâmico, você simplesmente adiciona um campo storageClassName à sua definição de PVC:

Exemplo pvc-dynamic.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-dynamic-pvc
spec:
  storageClassName: standard # Replace 'standard' with an actual StorageClass name
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Ao aplicar este PVC, o Kubernetes procurará por uma StorageClass chamada standard (ou qualquer nome que você especificar) e instruirá seu provisionador a criar um novo PV de 5Gi e vinculá-lo a este PVC.

Dicas e Melhores Práticas

  • Escolha o Modo de Acesso Correto: Considere cuidadosamente o modo de acesso exigido pela sua aplicação. ReadWriteOnce é comum para bancos de dados de réplica única, enquanto ReadWriteMany é necessário para sistemas de arquivos compartilhados usados por múltiplos Pods.
  • Entenda o Desempenho do Armazenamento: Diferentes provedores de armazenamento e StorageClasses oferecem características de desempenho variadas (IOPS, throughput). Escolha uma StorageClass que atenda às necessidades de desempenho da sua aplicação.
  • Estratégia de Backup: Armazenamento persistente não significa automaticamente backup. Implemente uma estratégia de backup robusta para seus volumes persistentes, especialmente para dados críticos.
  • Política de Reclamação de PV: PVs possuem uma reclaimPolicy que pode ser Delete (padrão), Retain (Reter) ou Recycle (Reciclar, descontinuado). Retain é útil para garantir que os dados não sejam perdidos se um PV for excluído, mas o armazenamento subjacente ainda existir.
  • Considerações sobre Namespace: PVCs são delimitados por namespace. Certifique-se de que seu Pod e PVC estejam no mesmo namespace para que a vinculação ocorra.

Conclusão

Implementar armazenamento persistente é um requisito fundamental para executar aplicações com estado no Kubernetes. Ao entender e utilizar PersistentVolumes e PersistentVolumeClaims, juntamente com a flexibilidade das StorageClasses, você pode gerenciar de forma confiável os dados da sua aplicação. Este guia forneceu o conhecimento fundamental e exemplos práticos para você começar, permitindo que você implante cargas de trabalho com estado mais sofisticadas e resilientes no Kubernetes.