Saltar a contenido

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

Campo Valor
Service longhorn-frontend (ClusterIP)
URL interna https://longhorn.local.gorkarevilla.com
URL externa — (solo interna)
TLS cert-manager wildcard *.local.gorkarevilla.com

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.