Funk-lab/admin/ops/etat-cluster.md
ALI YESILKAYA af98b47018
docs(cluster): aligne la doc sur l'état réel + re-ingest RAG + fix ubatch embed (#44)
* fix(rag): ubatch=2048 pour llama-embed + retry rag-ingest + nettoie defaults rag

L'instance llama-embed (:1238) tournait avec l'ubatch llama.cpp par défaut (512).
En mode --embeddings + pooling, toute l'entrée doit tenir dans un seul ubatch →
tout chunk > 512 tokens échouait en HTTP 500 « input too large to process.
increase the physical batch size ». ~46 chunks du RAG (CHUNK_MAX=2000 chars ≈
700 tokens) n'étaient pas indexés.

- llama_server : ajoute llama_embed_ubatch_size (2048 = ctx) + flags
  --batch-size/--ubatch-size dans le template llama-embed.service.
- rag-ingest : retry (5×, backoff) sur erreurs transitoires 5xx/réseau de l'embed.
- rag/defaults : aligne embed_url/embed_model sur nomic :1238 (étaient des vars
  mortes pointant encore qwen3-8b :1234 — trompeuses).

Résultat : ré-ingestion 436/436 chunks, 0 erreur.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs(cluster): aligne la doc sur l'état réel (relevé 2026-06-21) + snapshot

Passe de vérification terrain (SSH s01/g01 + kubectl) pour corriger les écarts
doc↔réalité, et ajout d'un document de référence vérifié.

- admin/ops/etat-cluster.md (nouveau) : snapshot daté — machines, services+ports
  par hôte, workloads k8s, namespaces, IngressRoute, bases PG, modèles LiteLLM,
  RAG/Qdrant, + procédure pour régénérer le relevé.
- OS AlmaLinux 9.7 → 9.8 (s01/g01) ; précise k8s v1.33.1 (CLAUDE/README/install/talos).
- RAG funk-docs : retire le warning périmé « supprimée 2026-06-17 / à re-ingérer » →
  reconstruite (436 chunks, nomic-embed-text :1238 dim 768, CPU). Maj rag.md,
  incidents.md, stt.md.
- Namespace sacrifice (hors-repo, hors ArgoCD) + bases PG grafana/sacrifice +
  services ai via IngressRoute + registry in-cluster (CLAUDE.md, k9s.md).
- Services de résilience (llm-heartbeat, llama-watchdog/embed) et instances CPU
  manuelles :1236/:1237 (souvent éteintes) documentés.
- Journal progress/2026-06-21.md : section relevé + RAG.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 23:29:05 +02:00

8.6 KiB

État réel du cluster Funk — snapshot vérifié

Relevé 2026-06-21 directement sur les machines (SSH s01/g01 + kubectl). Ce document reflète l'état observé, pas l'état souhaité de l'IaC — en cas d'écart, les écarts connus sont signalés (⚠️). Pour la procédure de relevé, voir la fin du fichier.


Machines

Machine IP OS / kernel Uptime relevé Rôle
storage-01 192.168.10.1 (LAN) / 192.168.1.200 (WAN) AlmaLinux 9.8 (Olive Jaguar), 5.14.0-687.5.3.el9_8 20 j Passerelle + bastion + données + IA hors-cluster
gpu-01 192.168.10.20 AlmaLinux 9.8, 5.14.0-687.5.3.el9_8 llama-server (RX 6700XT, ROCm 7.x) hors-cluster
compute-01 192.168.10.11 Talos v1.13 / k8s v1.33.1 40 j k8s control-plane
compute-02 192.168.10.12 Talos v1.13 / k8s v1.33.1 40 j k8s worker
compute-03 192.168.10.13 Talos v1.13 / k8s v1.33.1 40 j k8s worker

⚠️ CLAUDE.md indiquait AlmaLinux 9.7 pour s01/g01 — la réalité est 9.8.


storage-01 — services actifs (systemd)

Service Port(s) écoute Rôle
litellm 0.0.0.0:4000 Proxy multi-modèles (Hermes + ask-agent + STT-server)
llm-heartbeat Anti-502 : garde chaud le tuyau LiteLLM↔llama-server (rôle litellm)
hermes-agent (pas de port WAN) Agent Hermes — appli TUI, pas d'API HTTP (le « gateway :8080 » de la doc historique n'écoute pas)
hermes-auto-improve 0.0.0.0:9095 Trigger HTTP analyse doc quotidienne
hermes-exec 0.0.0.0:9096 Exécuteur d'actions vocales hermes -z --yolo (jeton Bearer) — assistant STT
qdrant 0.0.0.0:6333 / :6334 Base vectorielle (RAG funk-docs + mémoire STT stt-memory)
postgresql-16 192.168.10.1:5432 PostgreSQL 16 (8 bases, cf. plus bas)
dnsmasq 192.168.10.1:53 DNS + wildcard *.lab.local
nfs-* (mountd/idmapd/statd) :2049 :111 :20048 Export NFS modèles + PVCs k8s
node_exporter :9100 Métriques Prometheus
alertmanager-webhook 0.0.0.0:9093 Pont AlertManager → Hermes monitor
postfix :25 Relais SMTP sortant (Gmail App Password)

Note : :9093 côté s01 = alertmanager-webhook (storage-01), à ne pas confondre avec l'Alertmanager k8s (alertmanager.lab.local, in-cluster).


gpu-01 — services llama-server (systemd)

Service Port État relevé Rôle
llama-server :1234 actif Chat principal qwen3-8b (GPU, ROCm)
llama-embed :1238 actif Embeddings dédiés nomic-embed-text (CPU, dim 768, --ubatch-size 2048)
llama-embed-heartbeat actif Garde chaud le slot embeddings :1238
llama-watchdog actif Auto-réparation du llama-server figé (bug ROCm gfx1031)
llama-server CPU :1236 :1236 ⚠️ éteint Instance manuelle (profil Hermes system) — non gérée par IaC
llama-server CPU :1237 :1237 ⚠️ éteint Instance manuelle (profil Hermes monitor) — non gérée par IaC

⚠️ Au relevé, seuls :1234 et :1238 écoutent. Les instances CPU :1236/:1237 sont arrêtées → les profils Hermes system et monitor (qui pointent dessus) sont actuellement dégradés. Ce sont des services manuels (gap IaC connu, cf. ansible/roles/llama_server/README.md).

⚠️ GPU : rocminfo rapporte gfx1030 (et non gfx1031) — c'est l'effet attendu de HSA_OVERRIDE_GFX_VERSION=10.3.0, indispensable car la RX 6700XT (gfx1031) n'est pas officiellement supportée par ROCm.


LiteLLM — modèles exposés (:4000)

Alias Backend
hermes-default Alias consommé par Hermes (bascule via hermes-switch)
qwen3-8b llama-server GPU gpu-01 :1234
claude-sonnet-4-6 API Anthropic (profil brain, facturé)
claude-opus-4-7 API Anthropic (facturé)

Cluster k8s — workloads

Nœuds : compute-01/02/03 tous Ready, k8s v1.33.1 (40 j d'uptime).

Namespaces & pods (tous Running au relevé) :

Namespace Workloads
ai ghostfolio, ghostfolio-redis, n8n, open-webui, stt-server
argocd application-controller, applicationset, notifications, redis, repo-server, server
infra traefik (LB 192.168.10.200), registry (registry Docker in-cluster)
monitoring kube-prometheus-stack (Prometheus, Alertmanager, Grafana 13.0.1, kube-state-metrics, operator, node-exporters)
metallb-system controller + speakers
nfs-provisioner nfs-subdir-external-provisioner
kube-system coredns, flannel, kube-proxy, control-plane statiques
sacrifice sacrifice-web (sacrifice.lab.local) + CronJob sacrifice-assign-renfort

⚠️ Namespace sacrifice non documenté dans CLAUDE.md. C'est le projet de jeu FPS Sacrifice (monorepo séparé). Déployé hors du repo Funk-lab et hors ArgoCD (absent de la liste des Applications) — sa propre chaîne le pousse. Il possède aussi sa base PostgreSQL sacrifice sur storage-01.

ArgoCD Applications (toutes Synced / Healthy) : root · ghostfolio · n8n · open-webui · stt · monitoring · kube-prometheus-stack · nfs-provisioner · nfs-subdir-external-provisioner.

Exposition HTTP :

Type Hôtes
Ingress standard argocd.lab.local, grafana.lab.local, prometheus.lab.local, alertmanager.lab.local, sacrifice.lab.local
IngressRoute (CRD Traefik) ai/open-webui, ai/n8n, ai/ghostfolio, ai/stt-server, infra/traefik-dashboard

Les services du namespace ai (openwebui, n8n, ghostfolio, stt) passent par des IngressRoute Traefik (CRD), pas par des Ingress standards.


PostgreSQL 16 (storage-01) — bases

hermes · litellm · n8n · openwebui · ghostfolio · grafana · sacrifice · postgres

⚠️ Bases non listées dans CLAUDE.md : grafana (Grafana k8s utilise un PG externe sur s01) et sacrifice (projet hors-repo).


RAG / Qdrant — état

Collection Points Statut Dim / distance
funk-docs 436 🟢 green 768 / Cosine
stt-memory 🟢 768 / Cosine

funk-docs reconstruite et complète (436 chunks, 0 erreur) — le warning « collection supprimée le 2026-06-17, re-ingest requis » de CLAUDE.md/README/admin/ia/rag.md est périmé. Embeddings via nomic-embed-text (:1238, dim 768), plus qwen3-8b.

🐛 Fix de ce lot — embeddings tronqués à 512 tokens : le relevé initial montrait 389 points avec ~46 chunks manquants (HTTP 500 input too large to process. increase the physical batch size (current: 512)). Cause : llama-embed (:1238) tournait avec l'ubatch llama.cpp par défaut (512), or en mode --embeddings+pooling toute l'entrée doit tenir dans un seul ubatch → tout chunk > 512 tokens échouait (CHUNK_MAX=2000 chars ≈ 700 tokens). Corrigé : --batch-size /--ubatch-size = 2048 (= ctx) → ré-ingestion 436/436, 0 erreur. Fix durable dans le rôle llama_server (llama_embed_ubatch_size) ; appliqué en live via drop-in systemd sur g01 (à réconcilier au prochain make apply-gpu). rag-ingest gagne aussi un retry sur 5xx transitoires.

⚠️ Drift IaC mineur (corrigé) : ansible/roles/rag/defaults/main.yml mentionnait encore embed_url: :1234 / embed_model: qwen3-8b (variables mortes — les scripts déployés hardcodent nomic :1238).


Comment régénérer ce snapshot

Depuis le poste perso (accès ssh storage-01 = user ansible ; g01 via root@192.168.10.20 ; kubeconfig /home/ansible/.kube/config sur s01) :

# Services + ports s01
ssh storage-01 'systemctl list-units --type=service --state=running | grep -iE "litellm|hermes|qdrant|postgres|nfs|dnsmasq|node_exporter|alertmanager|postfix"; ss -tlnp'
# gpu-01
ssh storage-01 'ssh root@192.168.10.20 "systemctl list-units llama* ; ss -tlnp | grep :12"'
# k8s
ssh storage-01 'KUBECONFIG=/home/ansible/.kube/config kubectl get nodes,pods,ingress,ingressroute -A'
ssh storage-01 'KUBECONFIG=/home/ansible/.kube/config kubectl get applications -n argocd'
# Bases PG + Qdrant + LiteLLM
ssh storage-01 'sudo -u postgres psql -tAc "SELECT datname FROM pg_database WHERE datistemplate=false"'
ssh storage-01 'curl -s localhost:6333/collections | python3 -m json.tool'
ssh storage-01 'curl -s localhost:4000/v1/models -H "Authorization: Bearer lm-studio" | python3 -m json.tool'