Como criar um volume para um app
Este guia explica como provisionar um PersistentVolumeClaim (PVC) no cluster e referenciá-lo em um app via GitOps.
Toda a gestão de storage é feita no repositório homelab. O ArgoCD detecta automaticamente novos PVCs e os provisiona sem intervenção manual.
Pré-requisitos
- Acesso de escrita ao repositório
homelab - Acesso de escrita ao repositório
kelbi-applications(para associar o volume a um app)
Passo 1 — Criar o PVC no homelab
Crie um diretório em homelab/storage/ com o nome do PVC e um arquivo values.yaml:
homelab/
└── storage/
└── meu-pvc/
└── values.yaml
homelab/storage/meu-pvc/values.yaml:
name: meu-pvc
namespace: apps
size: 5Gi
storageClass: local-path
accessMode: ReadWriteOnce
description: "Descrição do que esse volume armazena e qual app o usa"
| Campo | Obrigatório | Descrição |
|---|---|---|
name | Sim | Nome do PVC no Kubernetes |
namespace | Não | Padrão: apps |
size | Sim | Tamanho do volume (ex: 5Gi, 20Gi) |
storageClass | Não | Padrão: local-path (k3s) |
accessMode | Não | Padrão: ReadWriteOnce |
description | Não | Documentação — quem usa esse volume |
Use nomes descritivos que identifiquem o app e o conteúdo. Exemplos: halk-en-patch-data, kelbi-static-assets.
Passo 2 — Abrir PR e fazer merge
Depois do merge na branch principal do homelab, o ApplicationSet cluster-storage detecta o novo values.yaml automaticamente e cria uma Application no ArgoCD.
O ArgoCD então aplica o PVC no cluster via o chart kelbi-storage. O local-path-provisioner do k3s provisiona o volume imediatamente.
Para verificar:
kubectl get pvc -n apps meu-pvc
# NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
# meu-pvc Bound pvc-... 5Gi RWO local-path 1m
Se o PVC ficar em Pending com a mensagem waiting for first consumer to be created before binding, é comportamento esperado. A StorageClass local-path-immediate usa volumeBindingMode: WaitForFirstConsumer — o volume só é provisionado quando o primeiro pod montar o PVC.
Isso significa que o PVC vai vincular automaticamente quando o app for deployado no Passo 3. Não é necessária nenhuma ação manual.
Para verificar o motivo do Pending:
kubectl describe pvc -n apps meu-pvc

O chart aplica helm.sh/resource-policy: keep e o ApplicationSet usa prune: false. O PVC nunca é deletado automaticamente — nem por helm delete, nem por sync do ArgoCD. Para deletar, é necessário executar kubectl delete pvc manualmente.
Passo 3 — Referenciar o PVC no app
No repositório kelbi-applications, adicione o bloco storage no values.yaml do app:
# kelbi-applications/apps/<org>/<app>/values.yaml
storage:
- name: meu-volume # nome lógico interno ao pod
claim: meu-pvc # nome do PVC criado no passo 1
mountPath: /app/data
readOnly: false
O chart kelbi-app gera automaticamente o volume e o volumeMount no Deployment.
O bloco storage faz parte da RFC 0001 — Storage. O campo volumes/volumeMounts raw continua funcionando enquanto a migração não é concluída.
Exemplo completo
Cenário: novo volume para meu-api
1. homelab``/storage/meu-api-data/values.yaml
name: meu-api-data
size: 10Gi
description: "Dados persistentes do meu-api — uploads de usuários"
2. kelbi-applications/apps/Invasor-de-Fronteiras/meu-api/values.yaml
app:
name: meu-api
image: ghcr.io/invasor-de-fronteiras/meu-api:latest
port: 3000
storage:
- name: data
claim: meu-api-data
mountPath: /app/data