# 2026-05-12 — Kubernetes (Flannel fix, MetalLB, Traefik, DNS) + Architecture multi-modèles

## Résumé

Cluster Kubernetes opérationnel : correction du crash Flannel, déploiement MetalLB L2 +
Traefik + wildcard DNS `*.lab.local`. Mise en place de l'architecture multi-modèles sur
gpu-01 : 1 instance GPU + 2 instances CPU avec isolation CPUAffinity/MemoryMax.
Création des 5 profils Hermes. Documentation complète admin/install/.

---

## Flannel CrashLoopBackOff

**Symptôme** : 2 pods flannel en `CrashLoopBackOff` dans kube-system.

**Cause** : Le `ClusterRoleBinding flannel` pointait vers le namespace `kube-flannel`
(supprimé) au lieu de `kube-system`.

**Fix** :
```bash
kubectl patch clusterrolebinding flannel --type='json' \
  -p='[{"op":"replace","path":"/subjects/0/namespace","value":"kube-system"}]'
```

---

## MetalLB + Traefik + DNS wildcard

- MetalLB L2 mode : pool `192.168.10.200-230`
- Traefik : `loadBalancerIP: 192.168.10.200`, helm `logs.general.level=INFO`
  (pas `log.level` — paramètre invalide → rollback helm)
- dnsmasq wildcard : `address=/.lab.local/192.168.10.200`
  → toutes les entrées `*.lab.local` résolvent vers Traefik

---

## Architecture multi-modèles gpu-01

### Instances llama-server

| Service | Port | Modèle | Infra | Isolation |
|---|---|---|---|---|
| `llama-server` | 1234 | Qwen3-8B Q4_K_M | GPU RX 6700XT | ROCm |
| `llama-server-system` | 1236 | Qwen3-1.7B Q4_K_M | CPUs 0-6,16-22 | 6G RAM |
| `llama-server-monitor` | 1237 | Qwen3-1.7B Q4_K_M | CPUs 7-13,23-29 | 6G RAM |

GPU = RX 6700XT 12 GB VRAM, CPU = Ryzen 9 5950X 16c/32t (32 GB RAM)

### Masquage GPU pour les instances CPU

Les instances CPU crashaient en SEGV car ROCm tentait d'initialiser le GPU même
avec `--n-gpu-layers 0` :
```ini
Environment=ROCR_VISIBLE_DEVICES=
Environment=HIP_VISIBLE_DEVICES=-1
```

### Ouverture firewall

```bash
firewall-cmd --permanent --add-port=1235/tcp --add-port=1236/tcp --add-port=1237/tcp
firewall-cmd --reload
```

---

## 5 profils Hermes

Créés avec `HERMES_HOME=/srv/data/hermes hermes profile create <nom>` puis configurés
dans `/srv/data/hermes/profiles/<nom>/config.yaml`.

| Profil | Modèle LiteLLM | Rôle |
|---|---|---|
| `funk-ai` | `qwen3-8b` (GPU) | Principal — par défaut |
| `brain` | `claude-sonnet-4-6` (API) | Analyse complexe |
| `dev` | `qwen2.5-7b-dev` (CPU) | Développement (supprimé en session suivante) |
| `system` | `qwen3-1.7b-system` (CPU) | Tâches système rapides |
| `monitor` | `qwen3-1.7b-monitor` (CPU) | Monitoring rapide |

Tous pointent vers LiteLLM (`http://127.0.0.1:4000/v1`) qui route selon le modèle.

### Problème HERMES_HOME vs HOME

Les profils créés sans `HERMES_HOME` explicite étaient créés dans `/opt/hermes/.hermes/`
(HOME du compte hermes) au lieu de `/srv/data/hermes/` (HERMES_HOME).

**Fix** : Toujours préfixer avec `HERMES_HOME=/srv/data/hermes` pour toutes les commandes hermes.

### Problème contexte 64k minimum

Hermes exige un contexte ≥ 64 000 tokens pour tout modèle. Override via config.yaml :
```yaml
model:
  context_length: 65536  # override le check Hermes — llama-server peut rester à 32768
```

### Profil par défaut

```bash
HERMES_HOME=/srv/data/hermes hermes profile use funk-ai
```

---

## Documentation créée

| Fichier | Contenu |
|---|---|
| `admin/install/storage-01.md` | Guide complet installation AlmaLinux → RAID5 → 8 phases Ansible |
| `admin/install/gpu-01.md` | AlmaLinux → ROCm → NFS → llama-server |
| `admin/install/kubernetes.md` | Talos → talhelper → MetalLB → Traefik → DNS wildcard |
| `admin/install/README.md` | Index + ordre d'installation |
| `admin/README.md` | Refonte — 2 sections : guides install vs référence opérationnelle |

---

## État final

- Cluster k8s : Flannel OK, MetalLB OK, Traefik OK, DNS wildcard OK
- gpu-01 : 3 instances llama-server (GPU + 2 CPU)
- LiteLLM : 5 modèles routés (qwen3-8b, qwen3-1.7b-system/monitor, claude-sonnet/opus)
- Hermes : 5 profils créés, `funk-ai` par défaut
