Almacenamiento

StorageClasses

StorageClass Provisioner Qué es Sobrevive a la caída del nodo
longhorn driver.longhorn.io Bloque replicado entre nodos (/var/lib/longhorn/) ✅ sí, si hay réplicas sanas en otros nodos
longhorn-static driver.longhorn.io Igual, para volúmenes creados a mano ✅
local-path rancher.io/local-path Directorio del nodo (/var/lib/rancher/k3s/storage/) ❌ no: el pod queda atado a ese nodo

⚠️ Hay dos StorageClasses marcadas como default (local-path y longhorn). Un PVC sin storageClassName cae en cualquiera de las dos. Hay que quitar la marca de local-path:

kubectl patch sc local-path -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

k3s vuelve a poner esa anotación al reiniciar si no se arranca con --default-local-storage-path o con el addon desactivado. Comprobar después de reiniciar un master.

Longhorn

Volúmenes

PVC Namespace Tamaño Estado Nodo de uso
elasticsearch-data-elasticsearch-es-default-0 logging 20 Gi attached master-3
es-snapshots logging 50 Gi attached master-3
minio minio 20 Gi attached worker-2
local-home-confluence-0 confluence 1 Gi attached worker-2
n8n-data-longhorn n8n 5 Gi attached master-1
portainer-longhorn portainer 10 Gi attached worker-1
homelable-data homelable 1 Gi attached master-3
prometheus-grafana monitoring 2 Gi attached worker-2 (Grafana fijado ahí, cableado): 2 réplicas con dataLocality: best-effort (grafana_local.sh)
pihole-config-longhorn pihole 1 Gi detached (sin uso) —
dnsmasq-config-longhorn pihole 1 Gi detached (sin uso) —
local-home-confluence-temp confluence 1 Gi detached (sin uso) —

Los tres volúmenes detached son restos de migraciones a medias. Se pueden borrar cuando se confirme que no hacen falta.

local-path: aplicaciones atadas a un nodo

Si cae el nodo, estas aplicaciones se paran hasta que vuelva:

PVC Namespace Tamaño Nodo En uso
data-0-my-cluster-dual-role-0 kafka 100 Gi master-2 ✅ broker y controller de Kafka (1 réplica)
jenkins jenkins 8 Gi master-2 ✅
data-postgres-central-postgresql-0 infra-db 20 Gi master-1 ✅ Postgres central (n8n, Confluence…)
data-jira-postgres-postgresql-0 jira 8 Gi master-1 ✅ Postgres de Jira
pihole-config, dnsmasq-config pihole 1 Gi + 1 Gi master-1 ✅ Pi-hole (además, nodeSelector a master-1)
data-jira-postgres-new-postgresql-0 jira 8 Gi master-3 ❌ sin uso (intento anterior)
jira-backups jira 10 Gi master-3 ❌ sin uso
portainer portainer 10 Gi master-3 ❌ sin uso (Portainer ya usa portainer-longhorn)

PVs en estado Released (datos retenidos sin PVC): elasticsearch-data-original y el antiguo local-home-confluence-0.

Aplicaciones sin almacenamiento persistente

Aplicación Volumen Qué se pierde al reiniciar
Jira local-home y shared-home como emptyDir Adjuntos, índices y configuración local. Las incidencias están a salvo en Postgres.
Prometheus sin volumeClaimTemplates Todo el histórico de métricas

Antes de mover o reiniciar algo con datos

Reglas aprendidas a base de incidentes (ver incidentes.md):

  1. Nunca ejecutar k3s-agent-uninstall.sh ni k3s-uninstall.sh en un nodo con PVCs local-path sin copiar antes /var/lib/rancher/k3s/storage/. El script lo borra sin avisar.
  2. Antes de quitar un nodeSelector o forzar el primer reinicio de un pod que lleva mucho tiempo arrancado, revisa sus initContainers por si tienen comandos destructivos sobre el mismo PVC:
    kubectl -n <ns> get deploy/<name> -o jsonpath='{.spec.template.spec.initContainers}'
    
  3. Haz un snapshot de Longhorn del volumen justo antes de tocarlo.