Topologies d'hébergement
Cette page décrit où et comment héberger la Navin Platform : serveurs sur site installés par paquets, clusters Kubernetes, topologie de haute disponibilité, plusieurs sites et reprise après sinistre. Chaque topologie indique ce que fournit le dépôt et ce qui reste à la charge de l'équipe d'hébergement.
Serveurs sur site (paquets OS)
| Topologie | Hôtes | Quand |
|---|---|---|
| Standalone | Un serveur : Navin Manager, agent, plateforme (API, worker, portail) et PostgreSQL local | Pilote, petite entité, site isolé |
| Cluster | Un hôte Navin Manager, des nœuds avec l'agent navin-manager-agent ; le Manager installe les services sur les nœuds | Plusieurs serveurs sans Kubernetes |
| Plateforme avec les services de la banque | Hôte de la plateforme avec les serveurs PostgreSQL, Keycloak, Redis et OpenBao que la banque exploite déjà | Infrastructure partagée, exploitation centrale |
Les services écoutent en HTTP clair (8080, 3300) : un proxy inverse TLS de la banque est toujours placé devant eux
(TLS). La base se déplace vers un serveur externe avec navin-platform-db external, en TLS
(sslmode=verify-full). Installation guidée : paquets OS ; Manager et nœuds :
os/install/README.fr.md.
La haute disponibilité des services installés par le Navin Manager (PostgreSQL avec Patroni et etcd, Redis Sentinel,
NATS JetStream R3) est décrite dans navin-manager/docs/availability.fr.md, avec les temps de bascule mesurés en local
et leurs limites (réplication asynchrone : la perte nulle est mesurée, pas garantie).
Kubernetes
Un cluster par environnement (dev, staging, prod), chacun enregistré dans Argo CD avec le label
eai.io/environment. Les namespaces sont créés par l'amorçage avec leur niveau Pod Security :
| Namespace | Contenu |
|---|---|
enterprise-ai | API Control Plane, worker, portail, LiteLLM, vLLM, Ollama, workers média |
eai-sandbox | Bacs à sable des outils et de l'interpréteur de code (gVisor, Kata) |
eai-data | PostgreSQL, Redis, NATS, Qdrant, Temporal, LiveKit |
eai-security | Keycloak, OpenFGA, OPA |
openbao | OpenBao (raft) |
observability, observability-agents | Prometheus, OpenSearch, Jaeger, Opik, ClickHouse, OpenTelemetry Collector, Alloy |
apisix | Passerelle d'API |
toolhive-system, mcp-<id> | ToolHive Operator et les namespaces du Runtime MCP |
Installation : Kubernetes avec Helm.
Topologie de haute disponibilité
Utilisez values-prod.yaml puis values-ha.yaml sur un cluster d'au moins trois nœuds répartis sur trois zones.
| Composant | Topologie | Source |
|---|---|---|
| API Control Plane | 3 à 20 réplicas (HPA), PDB minAvailable: 2, anti-affinité de zone obligatoire, répartition par nom d'hôte, arrêt gracieux de 60 s | values-prod.yaml, values-ha.yaml |
| Portail, LiteLLM | 3 réplicas minimum, PDB minAvailable: 2 | values-prod.yaml, values-ha.yaml |
| Worker | 1 réplica actif par plan, verrou consultatif PostgreSQL ; les réplicas supplémentaires attendent le verrou | values.yaml (worker) |
| PostgreSQL | CloudNativePG, 3 instances, bascule automatique, archive WAL vers S3 | deploy/data/postgres/cluster.yaml |
| NATS JetStream | 3 réplicas | deploy/data/nats/values.yaml |
| Qdrant | 3 nœuds, 3 shards, 2 réplicas par shard : un nœud peut être perdu | deploy/data/qdrant/values.yaml, EAI_QDRANT_* |
| OpenBao | Raft à 3 nœuds | deploy/openbao/values.yaml |
| Temporal | 3 réplicas | deploy/data/temporal/values.yaml |
| Redis | Réplication par l'opérateur ; les limites de débit d'APISIX tolèrent une perte passagère ; aucune sauvegarde nécessaire (cache reconstruit depuis PostgreSQL) | deploy/data/redis/values.yaml |
| vLLM | Réplicas d'un modèle sur des nœuds GPU distincts avec vllm.antiAffinity: required, PodDisruptionBudget | values.yaml (vllm) |
Un manifeste rendu prouve seulement la configuration (HA_CONFIGURED). Une topologie n'est validée (HA_VALIDATED)
qu'après un test de bascule enregistré sur un vrai cluster.
Objectifs de reprise
Objectifs de Haute disponibilité et PRA :
| Périmètre | RPO | RTO |
|---|---|---|
| PostgreSQL (CloudNativePG, WAL continu) | 5 min | 30 min |
| Archive d'audit WORM (verrouillage d'objet S3, réplication) | 0 (écriture synchrone) | 1 h |
| Configuration Kubernetes (Velero horaire et GitOps) | 1 h | 1 h |
| Index Qdrant (instantanés quotidiens, réindexation possible) | 24 h | 4 h |
| OpenBao (instantané raft quotidien, raft à 3 nœuds) | 24 h | 1 h |
| Inférence vLLM (sans état) | sans objet | 15 min (modèle depuis le cache) |
Multi-site et reprise après sinistre
Le dépôt fournit un site actif par environnement et un site de reprise restauré depuis les sauvegardes. Un déploiement
actif-actif sur plusieurs sites n'est pas fourni : le Navin Manager marque MULTI_CLUSTER comme non pris en charge.
- Plusieurs clusters, un seul Argo CD. Un Argo CD central gère plusieurs clusters : enregistrez chacun avec
argocd cluster add <contexte-kube> --label eai.io/environment=<env>et ajoutez son adresse dansdestinationsdedeploy/argocd/appproject.yaml. Le second site reçoit les mêmes manifestes depuis Git. - Sauvegardes hors du site. CloudNativePG archive le WAL et une sauvegarde de base quotidienne vers
s3://eai-backups/cnpg(conservation 30 jours, chiffrée). Velero lanceeai-platform-daily(volumes,pg_dumpall, instantané Qdrant, hooks d'instantané raft OpenBao, 30 jours) eteai-config-hourly(configuration, 7 jours). Répliquez ces buckets et le bucket WORM vers le stockage objet du site de reprise. - Reprise. Sur le cluster de reprise : socle et couche
infra, OpenBao restauré depuis son instantané raft, PostgreSQL restauré avec un nouveauClusterCloudNativePG etbootstrap.recovery(instant donné avecrecoveryTarget.targetTime), puisvelero restore create --from-backup <sauvegarde>et la coucheapps. - Exercice chaque trimestre. Restaurez dans des namespaces isolés (
deploy/velero/restore-test.yaml, ou--namespace-mappings enterprise-ai:enterprise-ai-drill), lancezGET /v1/audit/verify, consignez le RPO et le RTO mesurés. - Site isolé. Réinstallez depuis le bundle signé vérifié hors ligne (Installation déconnectée).
La procédure de reprise n'a été validée que hors ligne (manifestes rendus et contrôlés contre les schémas épinglés). Faites l'exercice sur un cluster de recette avant de vous fier aux objectifs ci-dessus.