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-patho con el addon desactivado. Comprobar después de reiniciar un master.
Longhorn
- Versión 1.11.1 (Helm). Values: cluster/helm/longhorn-system/longhorn.yaml.
defaultReplicaCount: 2en los values, pero los volúmenes tienen 3 réplicas: los PVCs usan la StorageClass, que es la que manda. Excepción:prometheus-grafana, con 2 ydataLocality: best-effortdesdegrafana_local.sh(cambio en el volumen: si se recrea el PVC, vuelve a 3).- Discos en
/var/lib/longhorn/en los 5 nodos amd64. worker-3 no participa. - No hay backup target configurado, ni recurring jobs. Solo existen snapshots locales, y si se pierde el clúster entero se pierden con él (ver backups.md).
- El worker-1 tiene un HDD mecánico: las reconstrucciones de réplicas ahí son lentas y generan mucha presión de I/O.
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):
- Nunca ejecutar
k3s-agent-uninstall.shnik3s-uninstall.shen un nodo con PVCslocal-pathsin copiar antes/var/lib/rancher/k3s/storage/. El script lo borra sin avisar. - Antes de quitar un
nodeSelectoro forzar el primer reinicio de un pod que lleva mucho tiempo arrancado, revisa susinitContainerspor si tienen comandos destructivos sobre el mismo PVC:kubectl -n <ns> get deploy/<name> -o jsonpath='{.spec.template.spec.initContainers}' - Haz un snapshot de Longhorn del volumen justo antes de tocarlo.