Aller au contenu

Traefik

Aperçu

Traefik sert de reverse proxy et contrôleur d'ingress Kubernetes pour AKKO. Il gère la terminaison TLS, le routage automatique des services via les ressources Ingress, et le middleware d'authentification forward-auth OAuth2 pour les services dépourvus de support OIDC natif.

Architecture

  Internet / Navigateur
  Traefik (:443 / :80)
    ├── Terminaison TLS (auto-signé ou Let's Encrypt)
    ├── Middleware forward-auth ──→ OAuth2 Proxy ──→ Keycloak
    ├──→ akko.local             ──→ akko-cockpit:80
    ├──→ federation.akko.local       ──→ akko-trino:8080
    ├──→ jupyterhub.akko.local  ──→ akko-jupyterhub:8000
    ├──→ orchestrator.akko.local     ──→ akko-airflow-webserver:8080
    ├──→ bi.akko.local    ──→ akko-superset:8088
    ├──→ identity.akko.local    ──→ akko-keycloak:8080
    ├──→ grafana.akko.local     ──→ akko-grafana:3000
    ├──→ minio.akko.local       ──→ akko-minio:9001
    ├──→ experiments.akko.local      ──→ akko-mlflow:5000
    └──→ ...                    ──→ (tous les autres services)

Chaque service AKKO est accessible via Traefik — aucun service n'expose ses ports directement sur le réseau hôte.

Ports

Port Fonction Exposé
80 HTTP — redirige tout le trafic vers HTTPS (port 443) Oui (NodePort / LoadBalancer)
443 HTTPS — point d'entrée avec terminaison TLS pour tous les services Oui (NodePort / LoadBalancer)
8080 Dashboard Traefik (désactivé en production) Interne uniquement

Fonctionnalités principales

  • Routage automatique des ingress — lit les ressources Kubernetes Ingress et configure les routes sans redémarrage
  • Terminaison TLS — utilise des certificats auto-signés en dev (k3d), supporte Let's Encrypt / cert-manager en production
  • Middleware forward-auth — protège les services sans OIDC natif (Dashboards, MLflow, LiteLLM, Cockpit) en déléguant l'authentification à OAuth2 Proxy
  • Redirection HTTP vers HTTPS — tout le trafic du port 80 est redirigé vers le 443
  • Chaînes de middlewares — supporte la limitation de débit, les en-têtes et la compression via les CRDs middleware Kubernetes

Configuration

Exemple de ressource Ingress

Chaque service définit sa propre ressource Ingress dans son sous-chart Helm :

ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: akko-superset
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    traefik.ingress.kubernetes.io/router.tls: "true"
spec:
  rules:
    - host: bi.akko.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: akko-superset
                port:
                  number: 8088

Middleware Forward-Auth

Les services nécessitant une protection OAuth2 utilisent une annotation middleware Traefik :

metadata:
  annotations:
    traefik.ingress.kubernetes.io/router.middlewares: >-
      akko-oauth2-proxy-forward-auth@kubernetescrd

Cela transfère chaque requête à OAuth2 Proxy, qui valide la session auprès de Keycloak avant d'autoriser l'accès.

Chart Helm

Traefik est déployé via le chart Helm officiel de la communauté Traefik :

Chart.yaml (dépendance)
- name: traefik
  version: "34.3.0"
  repository: https://traefik.github.io/charts

Valeurs clés

values.yaml
traefik:
  ports:
    web:
      redirectTo:
        port: websecure
    websecure:
      tls:
        enabled: true
  providers:
    kubernetesIngress:
      enabled: true
  logs:
    general:
      level: INFO

Mappage de ports k3d

Dans les clusters de développement k3d, les ports 80 et 443 sont mappés vers l'hôte via k3d cluster create --port "80:80@loadbalancer" --port "443:443@loadbalancer". Le script k3d-create.sh gère cela automatiquement.

Dépannage

Problèmes courants

  • 502 Bad Gateway : Le pod du service cible n'est pas prêt ou le nom/port du Service est incorrect. Vérifiez kubectl get endpoints <nom-du-service> pour confirmer que les endpoints existent. Vérifiez également que la sonde de disponibilité du service passe correctement.
  • Boucle de redirection avec OAuth2 : Assurez-vous que le domaine du cookie OAuth2 Proxy correspond au hostname de l'ingress. En k3d, tous les services doivent partager le même domaine de base (.akko.local). Vérifiez que le client Keycloak a la bonne URI de redirection.
  • Erreurs de certificat TLS dans Safari : Les certificats auto-signés nécessitent une approbation manuelle sur macOS. Ajoutez le CA au Trousseau d'accès, ou utilisez --insecure pour les outils CLI. Pour k3d, le script deploy.sh génère et approuve un CA local.