Mover arquivos para um PVC
Procedimento para migrar dados de um volume hostPath existente para um PersistentVolumeClaim gerenciado pelo homelab.
Faz parte da Fase 2 da RFC 0001 — Storage.
Pré-requisitos
- PVC já criado e visível no cluster (
kubectl get pvc -n apps) - Acesso ao nó via SSH (para verificar paths se necessário)
- App com downtime tolerado durante a janela de migração (ou migração a quente se o app suportar)
Procedimento
1. Confirmar que o PVC existe
kubectl get pvc -n apps <nome-do-pvc>
Status esperado: Pending (normal — WaitForFirstConsumer até o primeiro pod montar).
2. Criar pod de migração
O pod monta simultaneamente o hostPath de origem e o PVC de destino. Isso dispara o provisionamento do PVC e permite a cópia dentro do próprio cluster.
Salvar o manifesto em um arquivo temporário (substituindo os placeholders):
apiVersion: v1
kind: Pod
metadata:
name: migrate-<nome-do-pvc>
namespace: apps
spec:
restartPolicy: Never
containers:
- name: migrate
image: alpine
command: ["sleep", "infinity"]
volumeMounts:
- name: source
mountPath: /source
- name: dest
mountPath: /dest
volumes:
- name: source
hostPath:
path: /root/kelbi-volumes/<path-de-origem>
type: Directory
- name: dest
persistentVolumeClaim:
claimName: <nome-do-pvc>
kubectl apply -f migration.yaml
Aguardar o pod ficar Running:
kubectl wait pod -n apps migrate-<nome-do-pvc> --for=condition=Ready --timeout=60s
O PVC deve ter mudado para Bound:
kubectl get pvc -n apps <nome-do-pvc>
3. Copiar os dados
kubectl exec -n apps migrate-<nome-do-pvc> -- sh -c "cp -av /source/. /dest/"
4. Verificar a cópia
Confirmar que os arquivos chegaram e que o tamanho bate:
# contagem de arquivos na origem
kubectl exec -n apps migrate-<nome-do-pvc> -- find /source -type f | wc -l
# contagem de arquivos no destino
kubectl exec -n apps migrate-<nome-do-pvc> -- find /dest -type f | wc -l
# uso de disco comparado
kubectl exec -n apps migrate-<nome-do-pvc> -- du -sh /source /dest
5. Remover o pod de migração
kubectl delete pod -n apps migrate-<nome-do-pvc>
6. Atualizar o app em kelbi-applications
Substituir o volume hostPath raw pelo bloco storage[]:
# antes
advanced:
volumes:
- name: data
hostPath:
path: /root/kelbi-volumes/<path-de-origem>
type: Directory
volumeMounts:
- name: data
mountPath: /app/data
# depois
storage:
- name: data
claim: <nome-do-pvc>
mountPath: /app/data
Fazer merge e aguardar o ArgoCD sincronizar.
7. Verificar o app
# confirmar que o pod subiu com o PVC
kubectl get pod -n apps -l app=<nome-do-app>
kubectl describe pod -n apps <nome-do-pod> | grep -A5 "Volumes:"
# confirmar que o PVC está bound e em uso
kubectl get pvc -n apps <nome-do-pvc>
Referência rápida — volumes a migrar
| PVC | hostPath de origem | Apps |
|---|---|---|
halk-en-patch-data | /root/kelbi-volumes/halk-patch-server/en | halk-en-api, halk-en-cdn |
halk-jp-patch-data | /root/kelbi-volumes/halk-patch-server/jp | halk-jp-api, halk-jp-cdn |
kelbi-static-assets | /root/kelbi-volumes/kelbi/static | kelbi-api, kelbi-cdn, kelbi-jobs |
Quando mais de um app usa o mesmo PVC (ex: halk-en-api e halk-en-cdn), migrar todos ao mesmo tempo na mesma janela de manutenção para evitar inconsistência entre o app que escreve (hostPath) e o que lê (PVC).
Rollback
Se algo der errado após o Passo 6, reverter o values.yaml do app para o hostPath original e fazer merge. O ArgoCD vai re-deployar com o volume antigo. Os dados no hostPath continuam intactos — o pod de migração não remove a origem.