Après funk-stop --k8s, les nœuds reviennent Ready mais SchedulingDisabled (cordon stocké dans etcd). Sans uncordon, tous les pods restent Pending. Ajouts dans funk-start --k8s : - kubectl uncordon sur les nœuds SchedulingDisabled uniquement (idempotent) - Attente ArgoCD Running (jusqu'à 3 min) — confirme que le GitOps est opérationnel Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6.2 KiB
Gestion du cluster Funk
Script central : /usr/local/bin/funk-cluster sur storage-01.
Fonctions bash configurées dans ~/.bashrc du poste perso.
Commandes
# 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)
- Allumer storage-01 et gpu-01 manuellement (bouton physique)
- Attendre ~30s que storage-01 boot
- Depuis le poste perso :
funk-start - Le script démarre les services et attend que gpu-01 soit prêt (~3 min pour les modèles LLM)
- Vérifier l'état :
funk-status
Allumer le homelab complet (avec k8s)
- Allumer storage-01 et gpu-01 manuellement
- Lancer le démarrage :
funk-start --k8s - 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)
- Le script attend automatiquement que les nœuds k8s soient
Ready(3 min max)
WOL sur les compute nodes nécessite
Wake on LANactivé dans le BIOS (Gigabyte :Advanced → ACPI Settings). Tant que ce n'est pas configuré, allumage manuel requis.
Éteindre le homelab (sans k8s)
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)
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), embeddings, llama-server CPU (:1236/:1237)
- Cluster k8s : ping compute-01/02/03, kubectl get nodes Ready
funk-start [--k8s]
- Démarre postgresql-16, qdrant, litellm, hermes-agent sur storage-01
- Envoie un paquet Wake-on-LAN à gpu-01 si éteint, attend le ping + SSH
- Attend le montage NFS
/mnt/modelssur gpu-01 - Attend le chargement du modèle GPU (jusqu'à 4 min)
- Attend les modèles CPU (jusqu'à 2 min)
--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èsfunk-stop --k8s) - Attend qu'ArgoCD soit Running (signe que le GitOps redémarre les workloads)
funk-stop [--k8s]
- Arrête hermes-agent et litellm sur storage-01 (timeout 10s + SIGKILL si besoin)
--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)
- Éteint gpu-01 (
shutdown -h nowvia SSH) - Arrête qdrant et postgresql-16 sur storage-01
- Éteint storage-01 (
shutdown -h now) — connexion SSH coupée
GitOps — ArgoCD
Les workloads k8s sont gérés par ArgoCD. Ne jamais faire helm install ou kubectl apply manuellement pour les workloads.
# Déployer quelque chose : modifier k8s/ → git push → ArgoCD applique (~3 min)
# Vérifier l'état des applications
kubectl get applications -n argocd
# Forcer un refresh si ArgoCD n'a pas encore détecté un commit
kubectl -n argocd annotate application <nom> argocd.argoproj.io/refresh=hard --overwrite
UI : http://argocd.lab.local — voir argocd.md pour la doc complète.
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)
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 :
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 |