Longhorn
Storage distribuido del cluster (StorageClass por defecto).
Resumen
Longhorn es el storage por defecto del cluster k3s: provee volúmenes con
replicación entre nodos (replica=2) y, más adelante, snapshots y backups a
objeto storage. Sustituye al StorageClass local-path (que queda degradado
pero disponible).
Estado
| Campo |
Valor |
| Estado |
Operativo |
| Argo CD Application |
longhorn |
| Namespace |
longhorn-system |
Despliegue
| Campo |
Valor |
| Método |
Helm longhorn/longhorn (multi-source) |
| Versión |
1.12.1 |
| App |
clusters/luka/apps/longhorn/application.yaml |
| Config |
clusters/luka/config/longhorn/ |
| Prereqs de nodo |
k3s/ansible/roles/longhorn-prereqs/ |
Red
Acceso y usuarios
- La UI no trae autenticación integrada: queda solo LAN (VLAN 20).
Proteger con Authentik queda pendiente.
Configuración
persistence.defaultClass: true → StorageClass longhorn por defecto.
persistence.defaultClassReplicaCount: 2 → 2 réplicas por volumen (sobrevive a
la caída de una VM individual, no del host).
preUpgradeChecker.jobEnabled: false → desactiva el hook pre-upgrade (deadlock
con Argo CD en la primera instalación; ver longhorn#6415). Revisar al actualizar.
local-path se degrada (anotación is-default-class: "false"), no se borra.
defaultSettings.engineImagePodLivenessProbeTimeout: "10" (era 4s) y
engineImagePodLivenessProbePeriod: "10" (era 5s): el liveness del pod
engine-image (/data/longhorn version --client-only) mataba el pod con
SIGKILL bajo contención de I/O en nodos de 2 vCPU (incidencia
2026-09-24-longhorn-io-kyrie).
Almacenamiento
- Réplicas en los discos de los nodos k3s (20 GB/nodo, ~15 GB útiles). Con
replica=2 el espacio lógico total es ~22,5 GB (3 × ~15 GB / 2), menos tras las
reservas de Longhorn. Para media hará falta ampliar disco.
Dependencias
- Depende de: k3s, Ansible (prereqs
open-iscsi).
- Usado por: futuros servicios con estado (CloudNativePG, Vaultwarden, …).
Backup y recuperación
- Pendiente: backup off-host a R2/NAS (pieza del backup 3-2-1).
Sin él, no hay protección contra la caída del NUC (las réplicas solo cubren
fallo de nodo). Junto a CNPG (que ya hace backup a R2), completa el 3-2-1.
Monitorización
- Scrapeado vía ServiceMonitor
longhorn (longhorn-backend, puerto manager
:9500) en clusters/luka/config/servicemonitors/longhorn.yaml.
- ⚠️ Pendiente: el manager escucha en
:9500 (verificado con ss), pero
Prometheus recibe connection refused al scrapear el pod IP. Posible acceso
restringido del manager (forwarder) o binding a pod IP. Investigar.
- Alertas (Grafana Alerting,
GrafanaAlertRuleGroup longhorn-io en
clusters/luka/config/grafana-operator/alertrules.yaml):
- Reinicios de pods por nodo (
kube_pod_container_status_restarts_total,
con join a kube_pod_info para el label node) → detecta la cascada de
reinicios concentrados en un nodo.
- Filesystem read-only (
node_filesystem_readonly) → señal genérica de
errores de I/O del host. ⚠️ No cubre los volúmenes Longhorn (montados en
namespaces de pod, no visibles por node-exporter); su caída se detecta por
la alerta de reinicios.
Referencias
- https://longhorn.io/
- Chart: https://charts.longhorn.io
Notas / TODO
- Habilitar backup a R2 (backup 3-2-1).
- Proteger la UI con Authentik.
- Evaluar subir
replicaCount a 3 al añadir un segundo nodo físico.
- Ruido de logs (catalogado):
Warning: v1 Endpoints is deprecated in v1.33+
(client-go en longhorn-manager; se corrige al actualizar Longhorn) y
Error reading from wire ... use of closed network connection en
instance-manager (cierre normal al attach/detach). Ver runbook del operador.