ADR-005 — GPU em LXC mantido como cluster K3s standalone
Status
Vigente — 2026-05-02. Substitui versão anterior que recomendava migração pra VM.
Histórico
A versão inicial deste ADR recomendava migrar gpu-sp-01 de LXC pra VM com PCIe Passthrough antes de adicionar Cilium, assumindo que Cilium em LXC seria inviável.
Após reavaliação honesta com o time:
- ADR-002 revisado: Cilium em LXC privileged é o caminho CPPS, com trade-offs aceitos
- A equação de risco “VM vs LXC” pra GPU mudou: agora ambos são compatíveis com Cilium
gpu-sp-01permanece em LXC, e pode adotar Cilium se houver caso de uso (consistência com cluster principal)
Contexto
gpu-sp-01 hoje é um LXC privileged com nesting=True e keyctl=True (ver infra/proxmox-sp/config.py) rodando K3s standalone + flannel default + A5000 via dispositivos passados ao container (/dev/nvidia*).
LXC + K3s + GPU tem trade-offs reais:
Vantagens:
- Performance GPU ~zero overhead (vs ~5-15% perda em VM com nested virt)
- Driver NVIDIA instalado uma vez no Proxmox, LXCs compartilham
- RAM não é “presa” como em VM (que reserva o total declarado)
- Live migration via LINSTOR funciona (VM com PCIe Passthrough geralmente não)
- Setup atual já validado em produção sem incidentes documentados
Desvantagens:
- Compartilhamento de kernel: erro de driver pode derrubar host (raro em workloads bem-comportadas, real em código CUDA experimental)
- LXC privileged compromete isolamento de segurança (aceitável em lab single-tenant)
- Sync de driver NVIDIA entre host e LXC exige disciplina
- Cilium não roda em LXC com confiabilidade (ADR-002)
A questão crítica: gpu-sp-01 é cluster K3s standalone (a) ou worker node do cluster K3s SP unificado (b)?
- (a) Standalone: Cilium não toca esse cluster → restrição de ADR-002 não aplica → LXC viável
- (b) Worker do cluster SP: Cilium tem que rodar nele → LXC inviável → exige migração pra VM
Hoje, o Pulumi provisiona gpu-sp-01 como ContainerLegacy independente, com K3s standalone. Arquitetura (a) é o estado real.
Decisão
gpu-sp-01 mantido como cluster K3s standalone em LXC privileged + flannel default. Sem Cilium nesse cluster.
A decisão é forçada pelo hardware Tier 3 dos hosts SP (ver Tiers de hardware):
pve-ippri-31(host atual de gpu-sp-01) é Tier 3 — Ryzen sem iGPU, A5000 disputada entre display físico e workload- VM com PCIe Passthrough faria host perder display
- Cilium em LXC privileged é território não-suportado upstream (ADR-002)
Implicações:
- K3s SP “principal” (em VMs Tier 1/2A/2B) e K3s GPU SP (em LXC Tier 3) são clusters separados, stacks diferentes:
- Principal: VM + Cilium + Hubble + ClusterMesh com Franca
- GPU SP: LXC + flannel default + comunicação via Traefik HTTP
- Cluster GPU Franca futuro vai pra VM com Cilium (hosts
pve-labri-31/32/33são Tier 2A com iGPU — permite passthrough preservando display) - Assimetria intencional: cluster GPU SP (LXC+flannel) ≠ cluster GPU Franca (VM+Cilium). Não é problema — herança de hardware diferente entre sites.
- ArgoCD SP gerencia ambos clusters SP via multi-cluster registration; ArgoCD Franca gerencia clusters Franca
A questão “Cilium ou não no cluster GPU” deixa de existir como escolha — é decidida pelo hardware.
Alternativas rejeitadas
-
Migrar pra VM com PCIe Passthrough (recomendação anterior): rejeitada porque
- Performance perdida (~5-15%) é significativa pra cargas de IA
- RAM reservada na VM custa headroom de outros workloads
- Live migration via LINSTOR fica inviável
- Setup atual está validado e estável
- Risco de kernel panic em workloads bem-comportadas é teórico, não observado em prod
-
Forçar Cilium sobre LXC privileged: rejeitada — fragilidade real, contradiz ADR-002
-
vGPU NVIDIA GRID: rejeitada — A5000 não tem suporte oficial vGPU;
vgpu-unlocké hack instável
Consequências
Positivas:
- Performance GPU preservada em produção
- Estado atual permanece válido — sem migração arriscada
- Driver NVIDIA self-contained no Proxmox host
- Live migration funciona via LINSTOR
- Cilium e seu rationale ficam restritos ao cluster K3s SP “principal”
Negativas:
- Sem Cilium NetworkPolicy no cluster GPU — segurança intra-K8s mais fraca
- Sem Hubble — observabilidade de rede do cluster GPU vai pelo OpenObserve sem L7 detalhado
- Sem ClusterMesh — service discovery cross-cluster manual (via Traefik + DNS)
- 2 clusters K3s pra operar em SP em vez de 1 — overhead de gestão (mas mitigado por ArgoCD multi-cluster)
- LXC privileged + nesting compromete isolamento (aceitável pra lab single-tenant)
Riscos aceitos explicitamente:
- Falha de driver NVIDIA pode derrubar host Proxmox — mitigação: workloads passam por revisão antes de produção, monitoring no host pra detectar early
- Sync de driver entre host + LXC: documentar procedimento em runbook
Critério de revisão
Revisitar essa decisão se:
- gpu-sp-01 sofrer kernel panic real que derrube Proxmox host — gatilho pra migrar pra VM
- Self-service GPU multi-tenant virar requisito (pesquisadores rodando código arbitrário) — LXC privileged perde aceitabilidade
- Cilium ClusterMesh virar requisito de service discovery cross-cluster (em vez de Traefik HTTP) — exige Cilium nos 2 lados
- Compliance institucional exigir isolamento de kernel formal
- Aparecer alternativa (containerd direto no Proxmox host? sandbox/gVisor com GPU?) que cubra GPU sem LXC privileged
Notas operacionais
- Cluster K3s GPU é standalone, não join com cluster SP principal
- ArgoCD SP registra esse cluster com
argocd cluster add gpu-spapontando pra kubeconfig - Apps GPU em
apps/sp-gpu/separados deapps/sp/ - Driver NVIDIA: documentar versão exata em
docs/operacoes/nvidia-driver-sync.md(criar) - Quando migrar driver no Proxmox, plano de rollback documentado
- Monitoring do host Proxmox pra dmesg + nvidia-smi (alerta de erro de driver) — Fase 8 (observability)