Post

Case: Longhorn em K3s para substituir NFS instável

Case: Longhorn em K3s para substituir NFS instável

Contexto

Um cluster K3s local usava NFS como storage de desenvolvimento e sofria instabilidade (PVs caindo, pods crashando). Precisávamos de um provisionador estável, fácil de reinstalar e sem dependência do NFS.

O que foi feito

  • Scripts para instalar Longhorn em K3s a partir do bundle upstream (1.6.x, 1.9.x), dividindo manifestos em partes aplicáveis.
  • Patches específicos para K3s (paths de kubelet, registrador CSI, volumeBindingMode e réplicas ajustadas).
  • Preflight anti-downgrade: bloqueia instalar versão mais antiga se já houver Longhorn no cluster.
  • Scripts de delete/reinstall que limpam CRDs e finalizers para evitar stuck resources.
  • Script de status para inspecionar pods, eventos, logs do CSI/manager e serviços de webhook.

Fluxo (simplificado)

flowchart LR
  Install[install.sh] --> Fetch[fetch_upstream.sh\nbaixa bundle]
  Fetch --> Split[split_upstream.sh\nquebra manifestos]
  Split --> Patch[patch_k3s.sh\npaths + defaults]
  Patch --> ApplyCRD[apply CRDs/RBAC/manager/CSI/UI]
  ApplyCRD --> Restart[rollout restart manager]
  Restart --> Wait[wait pods Ready]

  Delete[delete.sh] --> Cleanup[remove UI/CSI/manager/RBAC]
  Cleanup --> Finalizers[limpa finalizers\nvolumes/replicas/etc.]
  Finalizers --> RemoveCRD[delete CRDs + namespace]

Operação e devX

  • install.sh: instala namespace, baixa/splita bundle, aplica patches, instala CRDs/RBAC/manager/CSI/UI, aplica defaults e reinicia manager; espera pods ficarem Ready.
  • delete.sh: remove componentes, limpa finalizers de CRs e apaga CRDs/namespace.
  • reinstall.sh: combina delete + install para rebuild limpo.
  • status.sh: mostra pods, últimos eventos, logs de CSI/manager e status dos webhooks.

Impacto (anonimizado)

  • Troca de NFS instável por storage Longhorn estável no cluster local.
  • Reinstalação previsível (scripts idempotentes, com preflight anti-downgrade).
  • Diagnóstico rápido de falhas (eventos/logs consolidados em um comando).

O que você pode reutilizar

  • Patching de paths K3s (/var/lib/kubelet) em bundles upstream antes de aplicar.
  • Preflight que bloqueia downgrade acidental do longhorn-manager.
  • Script de limpeza que remove finalizers para evitar CRs presas ao desinstalar.
Esta postagem está licenciada sob CC BY 4.0 pelo autor.