mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-08 22:34:41 +02:00
Trois instances llama-server CPU manuelles (hors Ansible) tournaient sur gpu-01
sans servir : déjà orphelines de LiteLLM (alias absents de config.yaml, d'où le
bruit "Invalid model name"). Suppression complète :
gpu-01 (opérationnel, déjà fait) :
- systemctl disable --now + rm des units llama-server-{system,monitor,dev}
- ports firewall 1235/1236/1237 fermés
Repo :
- monitoring : scrape jobs (values.yaml) + alertes LlamaServer{System,Monitor}Down
(alerts-ai.yaml) retirés → plus de "target down"/alertes fantômes ; panneaux de
statut dashboard-infrastructure recyclés (system→llama-embed, monitor supprimé).
- docs admin/ + hermes-skills (souls funk-ai/brain, SKILL agent-delegation) mises à
jour : inventaire modèles, profils Hermès system/monitor sans backend (à repointer
sur qwen3-8b), litellm, ops, monitoring.
Les profils Hermès system/monitor existent toujours mais sans backend dédié.
Dashboards Grafana dashboard-ai (panneaux graphiques CPU) laissés tels quels
(cosmétique, séries vides, aucune alerte).
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
161 lines
5.8 KiB
Markdown
161 lines
5.8 KiB
Markdown
# Gestion du cluster Funk
|
|
|
|
Script central : `/usr/local/bin/funk-cluster` sur storage-01.
|
|
Fonctions bash configurées dans `~/.bashrc` du poste perso.
|
|
|
|
---
|
|
|
|
## Commandes
|
|
|
|
```bash
|
|
# Depuis le poste perso
|
|
funk-status # État complet (storage-01 + gpu-01 + k8s)
|
|
funk-start # Démarre gpu-01 (WOL) + tous les services
|
|
funk-start --k8s # Idem + démarre le cluster k8s (compute-01/02/03)
|
|
funk-stop # Arrête services + gpu-01 + storage-01
|
|
funk-stop --k8s # Idem + éteint le cluster k8s avant
|
|
```
|
|
|
|
> `funk-stop` éteint storage-01 en dernier — la connexion SSH se coupe, c'est normal.
|
|
|
|
---
|
|
|
|
## Procédures d'utilisation
|
|
|
|
### Allumer le homelab (sans k8s)
|
|
|
|
1. **Allumer storage-01 et gpu-01 manuellement** (bouton physique)
|
|
2. Attendre ~30s que storage-01 boot
|
|
3. Depuis le poste perso :
|
|
```bash
|
|
funk-start
|
|
```
|
|
4. Le script démarre les services et attend que gpu-01 soit prêt (~3 min pour les modèles LLM)
|
|
5. Vérifier l'état :
|
|
```bash
|
|
funk-status
|
|
```
|
|
|
|
### Allumer le homelab complet (avec k8s)
|
|
|
|
1. **Allumer storage-01 et gpu-01 manuellement**
|
|
2. Lancer le démarrage :
|
|
```bash
|
|
funk-start --k8s
|
|
```
|
|
3. Le script envoie des paquets WOL aux compute nodes — **si WOL non configuré dans le BIOS, allumer compute-01/02/03 manuellement pendant l'attente ping** (~30s de fenêtre)
|
|
4. Le script attend automatiquement que les nœuds k8s soient `Ready` (3 min max)
|
|
|
|
> WOL sur les compute nodes nécessite `Wake on LAN` activé dans le BIOS (Gigabyte : `Advanced → ACPI Settings`). Tant que ce n'est pas configuré, allumage manuel requis.
|
|
|
|
### Éteindre le homelab (sans k8s)
|
|
|
|
```bash
|
|
funk-stop
|
|
```
|
|
|
|
La connexion SSH se coupe à la fin (storage-01 s'éteint lui-même). C'est normal.
|
|
|
|
### Éteindre le homelab complet (avec k8s)
|
|
|
|
```bash
|
|
funk-stop --k8s
|
|
```
|
|
|
|
Ordre d'arrêt : hermes-agent + litellm → cordon+drain compute-02/03 → drain compute-01 → vérif NFS → talosctl shutdown → gpu-01 → qdrant + postgresql → storage-01.
|
|
Ordre de démarrage : storage-01 déjà up → gpu-01 (WOL) → compute-01/02/03 (WOL) → uncordon → ArgoCD up → workloads.
|
|
|
|
---
|
|
|
|
## Ce que fait chaque commande
|
|
|
|
### `funk-status`
|
|
|
|
Vérifie dans l'ordre :
|
|
- Services storage-01 : postgresql-16, qdrant, litellm, hermes-agent
|
|
- Santé : PostgreSQL (connexion réelle), Qdrant (collections), LiteLLM (modèles), Hermes, NFS export
|
|
- gpu-01 : ping, NFS /mnt/models, llama-server GPU (:1234), embed nomic CPU (:1238)
|
|
- Cluster k8s : ping compute-01/02/03, kubectl get nodes Ready
|
|
|
|
### `funk-start [--k8s]`
|
|
|
|
1. Démarre postgresql-16, qdrant, litellm, hermes-agent sur storage-01
|
|
2. Envoie un paquet Wake-on-LAN à gpu-01 si éteint, attend le ping + SSH
|
|
3. Attend le montage NFS `/mnt/models` sur gpu-01
|
|
4. Attend le chargement du modèle GPU (jusqu'à 4 min)
|
|
5. Attend les modèles CPU (jusqu'à 2 min)
|
|
6. `--k8s` :
|
|
- Envoie WOL aux 3 nœuds, attend ping, attend nœuds Ready (3 min max)
|
|
- **Uncordon** des nœuds s'ils sont `SchedulingDisabled` (état résiduel après `funk-stop --k8s`)
|
|
- Attend qu'ArgoCD soit Running (signe que le GitOps redémarre les workloads)
|
|
|
|
### `funk-stop [--k8s]`
|
|
|
|
1. Arrête hermes-agent et litellm sur storage-01 (timeout 10s + SIGKILL si besoin)
|
|
2. `--k8s` — arrêt propre du cluster en 6 étapes :
|
|
- **Cordon** des 3 nœuds → plus aucun pod ne peut être replanifié
|
|
- **Drain compute-02** → SIGTERM aux pods, 30s grace period, PVCs NFS démontés
|
|
- **Drain compute-03** → idem (Prometheus, Grafana flushent leur WAL/SQLite)
|
|
- **Drain compute-01** → ArgoCD, kube-state-metrics, etc.
|
|
- **Vérification NFS** → confirme que plus aucune session NFS active depuis k8s
|
|
- **talosctl shutdown** → halt propre (plus rien ne tourne, rien n'écrit)
|
|
3. Éteint gpu-01 (`shutdown -h now` via SSH)
|
|
4. Arrête qdrant et postgresql-16 sur storage-01
|
|
5. Éteint storage-01 (`shutdown -h now`) — connexion SSH coupée
|
|
|
|
---
|
|
|
|
## GitOps
|
|
|
|
Modifier `k8s/` → `git push` → ArgoCD applique (~3 min).
|
|
UI : http://argocd.lab.local — doc complète : [k8s/argocd.md](../k8s/argocd.md)
|
|
|
|
---
|
|
|
|
## Machines et MACs
|
|
|
|
| Machine | IP | MAC | Rôle |
|
|
|---|---|---|---|
|
|
| storage-01 | 192.168.10.1 / 192.168.1.200 | — | Passerelle + services IA |
|
|
| gpu-01 | 192.168.10.20 | `a8:a1:59:72:a6:11` | LLM GPU + CPU |
|
|
| compute-01 | 192.168.10.11 | `6c:4b:90:82:8e:47` | k8s control-plane |
|
|
| compute-02 | 192.168.10.12 | `6c:4b:90:cf:7f:c5` | k8s worker |
|
|
| compute-03 | 192.168.10.13 | `6c:4b:90:b6:49:20` | k8s worker |
|
|
|
|
---
|
|
|
|
## Fonctions bash (`~/.bashrc` poste perso)
|
|
|
|
```bash
|
|
funk-start() { ssh storage-01 "sudo /usr/local/bin/funk-cluster start $*"; }
|
|
funk-stop() { ssh storage-01 "sudo /usr/local/bin/funk-cluster stop $*"; }
|
|
alias funk-status='ssh storage-01 "sudo /usr/local/bin/funk-cluster status"'
|
|
alias funk-pull='ssh storage-01 "sudo -u ansible git -C /srv/data/lab pull"'
|
|
```
|
|
|
|
Les fonctions bash transmettent les arguments — `funk-start --k8s` et `funk-stop --k8s` fonctionnent directement.
|
|
|
|
---
|
|
|
|
## Déploiement du script
|
|
|
|
Le script est versionné dans `ansible/roles/litellm/files/funk-cluster`.
|
|
Pour le redéployer sur storage-01 :
|
|
|
|
```bash
|
|
scp ansible/roles/litellm/files/funk-cluster s01:/tmp/
|
|
ssh s01 "sudo cp /tmp/funk-cluster /usr/local/bin/funk-cluster && sudo chmod +x /usr/local/bin/funk-cluster"
|
|
```
|
|
|
|
---
|
|
|
|
## Points d'attention
|
|
|
|
| Sujet | Détail |
|
|
|---|---|
|
|
| Ordre d'arrêt | Hermes/LiteLLM → cordon+drain k8s (optionnel) → gpu-01 → Qdrant/PG → storage-01 |
|
|
| Ordre de démarrage | storage-01 (toujours déjà up) → gpu-01 → k8s (optionnel) |
|
|
| WOL compute nodes | BIOS non configuré → allumer manuellement pendant l'attente ping de `funk-start --k8s` |
|
|
| LiteLLM bloquant | `systemctl stop --timeout=10` + SIGKILL automatique si timeout |
|
|
| talosctl path | `/home/ansible/.config/talos/config` requis explicitement (sudo change HOME) |
|
|
| SSH coupée à l'arrêt | Normal — storage-01 s'éteint lui-même en fin de `funk-stop` |
|