Aller au contenu

AKKO Cockpit

Aperçu

Le Cockpit AKKO est le portail de découverte de services et tableau de bord opérationnel de la plateforme. Construit avec nginx, HTML et JavaScript vanilla, il fournit une vue unifiée de tous les services avec des vérifications de santé en temps réel, des liens d'accès rapide et des indicateurs clés de performance.

Architecture

  Navigateur ──→ Traefik (:443)
             Cockpit (nginx :80)
              ├── index.html      (cartes de services, DevHub)
              ├── app.js          (polling santé, URLs dynamiques)
              ├── style.css       (thème sombre AKKO)
              └── nginx.conf      (routes proxy de santé)
                     ▼  /health/* proxy inverse
             ┌───────┼───────┐
             ▼       ▼       ▼
          Trino   Airflow  Polaris  ... (tous les services)

Le serveur nginx du cockpit agit comme proxy de vérification de santé, transférant les requêtes /health/<service> vers le point de santé interne de chaque service. Cela évite les problèmes CORS et maintient des URLs de santé cohérentes pour le frontend.

Ports

Port Fonction Exposé
80 HTTP — sert l'interface du portail et proxifie les vérifications de santé Oui (via ingress Traefik)

Accédez au cockpit via https://cockpit.akko.local (k3d) ou le nom d'hôte d'ingress configuré.

Fonctionnalités principales

  • Cartes de services — chaque service de la plateforme dispose d'une carte avec nom, version, indicateur de santé (vert/rouge) et lien direct
  • Proxy de santé — les blocs location /health/* de nginx proxifient vers le point de santé natif de chaque service, normalisant les réponses pour le frontend
  • Thème sombre — suit le Design System AKKO (--bg-primary: #0a0a14, --accent: #6c63ff, police : Inter)
  • Section DevHub — liens rapides vers JupyterHub, Superset, Airflow, MLflow, Dashboards et la documentation
  • Affichage des versions — lit versions.json (généré par scripts/generate-versions.sh) pour afficher les versions épinglées de chaque service

Portail 8 pages (Sprint 14)

Le cockpit est organisé en huit pages dédiées :

Page Objectif Route
Home Cartes de services avec health checks et liens rapides /
DevHub Raccourcis développeur (JupyterHub, Airflow, Superset, MLflow, docs dbt) /devhub/
AI Playground des UDF SQL IA, info passerelle LiteLLM, statut Ollama/vLLM /ai/
Governance Catalogue OpenMetadata, policies OPA, dashboard RBAC /governance/
Architecture Diagramme d'architecture interactif (Mermaid) /architecture/
Logs Visionneur de logs logs layer (LogQL, live tail, filtres par pod/namespace) /logs/
Monitoring Métriques Prometheus (CPU, mémoire, taux de requêtes, HPA) /monitoring/
Alerts Alertes AlertManager actives/silenciées avec sévérité, receiver et annotations /alerts/

Les pages Logs, Monitoring et Alerts font un reverse-proxy via nginx vers les services internes logs layer, Prometheus et AlertManager — aucun DNS/TLS externe requis.

Configuration

nginx.conf

La configuration nginx du cockpit définit les routes proxy de santé pour chaque service :

branding/cockpit/nginx.conf
location /health/trino {
    proxy_pass http://akko-trino:8080/v1/info/state;
}

location /health/airflow {
    proxy_pass http://akko-airflow-webserver:8080/health;
}

location /health/polaris {
    proxy_pass http://akko-polaris:8182/q/health;
}

ConfigMap Kubernetes

En déploiement Helm, la configuration nginx est montée via un ConfigMap depuis le sous-chart akko-cockpit. Le fichier branding/cockpit/nginx.conf de l'ère Docker sert de source de vérité et est copié dans helm/akko/charts/akko-cockpit/files/.

app.js

Le frontend JavaScript interroge les endpoints /health/* toutes les 30 secondes et met à jour l'indicateur de statut sur chaque carte de service. Les URLs des services sont construites dynamiquement en fonction du pattern de nom d'hôte courant (utilise les domaines *.akko.local, configurable via global.domain dans les valeurs Helm).

Chart Helm

Le cockpit est déployé via le sous-chart personnalisé akko-cockpit :

helm/akko/charts/akko-cockpit/
├── Chart.yaml
├── values.yaml
├── files/
│   ├── index.html
│   ├── app.js
│   ├── style.css
│   └── nginx.conf
└── templates/
    ├── deployment.yaml
    ├── service.yaml
    ├── configmap.yaml      # monte les fichiers via .Files.Get
    └── ingress.yaml

Valeurs clés

values.yaml
akko-cockpit:
  image:
    repository: akko-cockpit
    tag: "2026.03"
  ingress:
    enabled: true
    hostname: cockpit.akko.local

Fichiers statiques via .Files.Get

Tous les fichiers HTML, CSS, JS et de configuration nginx doivent être lus via .Files.Get depuis le répertoire files/. Ne jamais passer du contenu statique par .Values — cela produit des fichiers de 0 octet.

Dépannage

Problèmes courants

  • Vérifications de santé toutes rouges : Vérifiez que les noms DNS des services sont résolus depuis l'intérieur du pod cockpit. Lancez kubectl exec deploy/akko-cockpit -- nslookup akko-trino pour vérifier. Une cause fréquente est le déploiement du cockpit avant que les autres services soient prêts.
  • Page blanche / pas de cartes : Vérifiez que le ConfigMap est correctement monté. Lancez kubectl exec deploy/akko-cockpit -- cat /usr/share/nginx/html/index.html pour vérifier que le fichier n'est pas vide (problème de .Files.Get à 0 octet).
  • Boucle de redirection OAuth2 : Le cockpit est protégé par oauth2-proxy via le middleware forward-auth de Traefik. Assurez-vous que le client Keycloak akko-oauth2-proxy a la bonne URI de redirection (https://cockpit.akko.local/oauth2/callback).