Como guardar dados no Kubernetes sem perdê-los: PVC com local-path do k3s ou Longhorn replicado, com prós, contras e passo a passo.
Para que serve
Containers são descartáveis: tudo o que é gravado dentro deles some quando o pod é recriado. Bancos de dados, uploads e filas precisam de armazenamento persistente no Kubernetes, feito com PersistentVolumeClaims (PVC). Este artigo compara as duas opções mais usadas em k3s num servidor dedicado: o local-path, que já vem instalado, e o Longhorn, que replica os volumes entre nós.
Pré-requisitos
- Cluster k3s funcionando (veja Como instalar o k3s em servidor dedicado) e Helm instalado (veja Helm na prática).
- Para o Longhorn: preferencialmente três nós, cada um com um disco virtual dedicado (ex.: 100 GB) e sistema de arquivos ext4 ou XFS.
Comparação rápida
| local-path (k3s) | Longhorn | |
|---|---|---|
| Onde ficam os dados | Pasta no disco de um nó (/var/lib/rancher/k3s/storage) | Réplicas em vários nós |
| Se o nó cair | O pod só volta quando o nó voltar | O pod sobe em outro nó com a réplica |
| Desempenho | Velocidade do disco local (NVMe) | Menor: cada escrita vai pela rede para as réplicas |
| Limite de tamanho do PVC | Não é aplicado | Aplicado; permite expandir |
| Snapshots e backup para S3 | Não (use Velero) | Sim, integrados |
| Complexidade | Nenhuma | Média: mais pods, interface web, requisitos de pacotes |
Opção 1: usar o local-path
- Confira o StorageClass padrão:
Deve aparecerkubectl get storageclasslocal-path (default). - Crie um PVC e um pod de teste (
pvc-teste.yaml):
Aplique comapiVersion: v1 kind: PersistentVolumeClaim metadata: name: dados spec: accessModes: [ReadWriteOnce] storageClassName: local-path resources: requests: storage: 5Gi --- apiVersion: v1 kind: Pod metadata: name: teste-volume spec: containers: - name: app image: busybox:1.37 command: ["sh", "-c", "date >> /dados/log.txt; sleep 3600"] volumeMounts: - name: dados mountPath: /dados volumes: - name: dados persistentVolumeClaim: claimName: dadoskubectl apply -f pvc-teste.yaml. O volume só é criado quando o pod é agendado (modoWaitForFirstConsumer). - Mude o local de gravação, se quiser. Para usar um disco específico (ex.: um NVMe montado em
/srv/k8s), inicie o k3s comdefault-local-storage-path: /srv/k8sno/etc/rancher/k3s/config.yaml. Faça isso antes de criar volumes. - Pensando em backup com Velero: por padrão o local-path cria volumes do tipo
hostPath, que o backup de sistema de arquivos do Velero ignora. Para volumes novos, adicione a anotaçãovolumeType: localno PVC. Detalhes no artigo Backup de Kubernetes com etcd snapshot e Velero.
Opção 2: instalar o Longhorn
- Prepare todos os nós (Debian/Ubuntu):
apt update apt install -y open-iscsi nfs-common cryptsetup dmsetup systemctl enable --now iscsid - Monte o disco dedicado em cada nó. Adicione um disco à VM no Proxmox, formate e monte em
/var/lib/longhorn:
Confira o nome do disco commkfs.ext4 /dev/sdb mkdir -p /var/lib/longhorn echo '/dev/sdb /var/lib/longhorn ext4 defaults 0 2' >> /etc/fstab mount -alsblkantes de formatar. - Valide os requisitos com a ferramenta oficial
longhornctl(baixe a versão igual à do Longhorn na página de releases do projeto) e rodelonghornctl check preflight. Corrija o que ela apontar. - Instale pelo Helm sem torná-lo o StorageClass padrão (o k3s recria o local-path como padrão a cada reinício, e dois padrões causam confusão):
Com apenas dois nós, usehelm repo add longhorn https://charts.longhorn.io helm repo update helm install longhorn longhorn/longhorn \ --namespace longhorn-system --create-namespace \ --version 1.13.0 \ --set persistence.defaultClass=false \ --set persistence.defaultClassReplicaCount=3 kubectl -n longhorn-system get podsdefaultClassReplicaCount=2. Confira na documentação a versão atual e a versão mínima de Kubernetes exigida. - Use o Longhorn nos PVCs com
storageClassName: longhorn. Volumes do Longhorn sãoReadWriteOnce; ele também ofereceReadWriteManyvia NFS interno, útil para pastas compartilhadas. - Acesse a interface web com segurança. Ela não tem login; não a publique em Ingress sem autenticação. Use um túnel temporário:
e abrakubectl -n longhorn-system port-forward svc/longhorn-frontend 8080:80http://localhost:8080. Lá você configura o backup target (um bucket S3) e agenda snapshots e backups recorrentes.
Como saber se funcionou
kubectl get pvc,pv
kubectl exec teste-volume -- cat /dados/log.txt
kubectl delete pod teste-volume && kubectl apply -f pvc-teste.yaml
kubectl exec teste-volume -- cat /dados/log.txt
O PVC deve estar Bound e, depois de recriar o pod, o arquivo deve ter duas linhas: os dados sobreviveram. No Longhorn, a interface deve mostrar o volume como Healthy, com todas as réplicas.
Problemas comuns
PVC fica em Pending
Com local-path é normal até um pod usar o PVC. Se persistir, veja kubectl describe pvc dados: nome de StorageClass errado ou falta de espaço são as causas mais comuns.
Pod não sobe: "volume node affinity conflict"
Volume local-path fica preso ao nó onde foi criado. Se o nó saiu do cluster, os dados estão no disco dele; restaure de backup ou devolva o nó.
Longhorn com volume Degraded
Uma réplica está faltando ou reconstruindo, geralmente porque um nó reiniciou ou o disco encheu. O Longhorn reconstrói sozinho quando o nó volta; mantenha pelo menos 25% de espaço livre nos discos dos nós.
Pods do Longhorn em CrashLoop com erro de iSCSI
Falta o open-iscsi ou o iscsid não está ativo em algum nó. Rode o passo 1 em todos os nós.
Perguntas frequentes
Posso usar NFS em vez de Longhorn?
Sim, com o provisionador csi-driver-nfs apontando para um servidor NFS (por exemplo, uma VM dedicada). É simples, mas bancos de dados costumam ter desempenho ruim e problemas de lock sobre NFS.
E o Ceph do Proxmox?
O Ceph faz sentido com três ou mais servidores físicos. Em um único servidor ele adiciona complexidade sem ganho de redundância.
Banco de dados deve ficar no Kubernetes?
Pode, com operadores maduros (CloudNativePG, por exemplo) e armazenamento local rápido. Muitas equipes preferem manter o banco em uma VM separada e só as aplicações no cluster.
Leitura complementar
- Armazenamento no k3s
- Requisitos e instalação do Longhorn
- Persistent Volumes (documentação do Kubernetes)
Precisa de ajuda?
Se um NVMe apresentar erros ou o espaço do servidor não bater com o esperado, abra um ticket com a saída de lsblk e smartctl -a do disco.
