Skip to content

feat(kube): défauts Kubernetes (namespace par projet, Traefik, cloudflared) + test réel k3s - #300

Merged
bobdivx merged 1 commit into
mainfrom
feat/kubernetes-defaults
Nov 2, 2026
Merged

bobdivx merged 1 commit into
mainfrom
feat/kubernetes-defaults

Conversation

@bobdivx

@bobdivx bobdivx commented Nov 2, 2026

Copy link
Copy Markdown
Owner

Choix par défaut pour faire tourner DevForge dans un cluster Kubernetes : GHCR + imagePullSecret, Traefik, local-path (Longhorn documenté en multi-nœud), tunnel Cloudflare (cloudflared → Service Traefik), un namespace par projet (devforge-<projet>). Docker reste le backend par défaut.

Changements

  • crates/kube : AppSpec.project / AppRef, namespace de projet créé à la demande (labels PodSecurity ; refus d'un namespace existant non étiqueté managed-by=devforge), liste multi-namespaces filtrable, IngressClass traefik par défaut, recopie du secret de pull, mode single conservé, preStop.sleep.
  • /api/v1/kube/* : paramètre ?project= ; /info expose namespace_mode, préfixe, PodSecurity.
  • Chart : apps.namespaceMode (ClusterRole en perProject, Role en single), cloudflared optionnel, Traefik par défaut ; deploy/kubernetes/traefik-values.yaml.
  • Docs : wiki/Kubernetes.md, deploy/kubernetes/README.md, FAQ.

Test réel (k3s v1.31.4, mono-nœud, Traefik 3.7.16 via Helm, local-path 0.0.32)

Chart installé, DevForge (binaire de cette branche) dans le cluster, app nginxinc/nginx-unprivileged déployée via l'API : pods Running, Service, Ingress traefik, HTTP 200 via Traefik, logs, restart, stop/start, rolling update (680/680 requêtes OK pendant update + restart), suppression, garde-fou namespace, copie du secret de pull, mode single. live_cluster.rs passe avec le jeton du ServiceAccount du chart.

Bugs corrigés

  1. Chart : init wait-postgres bloqué (pg_isready sans -U sous uid 1000).
  2. Rolling update avec 502/timeouts → preStop sleep 5 s, grace 35 s.
  3. Snapshot de bascule (pg_dump via Docker) lancé en mode Kubernetes.
  4. Valeurs Traefik invalides pour le chart 42 (logs, service.spec.type).

Non testé : Talos réel, Longhorn, vrai tunnel Cloudflare.

…lared) + correctifs du test réel k3s

Choix par défaut : GHCR + imagePullSecret, Traefik, local-path (Longhorn documenté en
multi-nœud), tunnel Cloudflare, un namespace par projet.

- kube : AppSpec.project / AppRef ; namespace `devforge-<projet>` créé à la demande
  (labels PodSecurity, refus d'un namespace existant non géré) ; liste multi-namespaces
  filtrable par projet ; IngressClass `traefik` par défaut (`none` pour la classe du
  cluster) ; secret de pull recopié dans les namespaces de projet ; mode `single` conservé.
- routes /api/v1/kube/* : `?project=` ; /info expose namespace_mode, préfixe, PodSecurity.
- chart : apps.namespaceMode/namespacePrefix, ClusterRole en perProject (Role en single),
  cloudflared optionnel (Secret token / existingSecret), Traefik par défaut ;
  deploy/kubernetes/traefik-values.yaml.
- docs : wiki/Kubernetes.md et deploy/kubernetes/README.md (choix et comment les changer).

Bugs trouvés au test réel (k3s 1.31, Traefik 3.7, local-path) :
- chart : init `wait-postgres` bloqué indéfiniment (pg_isready sans -U sous uid 1000 →
  « no attempt ») ;
- rolling update avec coupures (502 / timeouts) : preStop sleep 5 s + grace 35 s ;
- serveur : snapshot de bascule pg_dump via Docker lancé en mode Kubernetes (erreur /30 s) ;
- valeurs Traefik : `logs` refusé par le schéma, type de Service sous `service.spec`.
@bobdivx
bobdivx merged commit c61c62c into main Nov 2, 2026
4 checks passed
@bobdivx
bobdivx deleted the feat/kubernetes-defaults branch November 2, 2026 11:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant