Aller au contenu principal

H-05 Mise à l'échelle automatique

Brique H de la plateforme Enterprise AI. Technologie : Kubernetes HPA (CPU, mémoire, métriques personnalisées) + KEDA (retard NATS JetStream, requêtes Prometheus). Version anglaise : ../../en/bricks/H-05-autoscaling.md.

Rôle et responsabilités​

  • Mettre à l'échelle les services sans état sur CPU et débit, les workers GPU sur le retard de file et les requêtes en attente, jusqu'à zéro pour les pools GPU inactifs.

Position et interactions​

  • Chemin d'exécution : boucle de contrôle.
  • Les valeurs vllm.keda et workers.items[].keda définissent les ScaledObjects.

Part open source et part développée​

  • Open source réutilisé : HPA, KEDA, Cluster Autoscaler ou Karpenter.
  • Développé dans la plateforme : Profils de mise à l'échelle par charge, politique de pool chaud pour les modèles à faible latence.

Modèle de données​

Tables du Control Plane (schéma eai) : eai.gpu_samples.

Chaque table de tenant a tenant_id uuid NOT NULL et une politique de sécurité au niveau des lignes sur current_setting('app.tenant_id', true)::uuid. ClickHouse usage_events est la réplique analytique de eai.usage_events (ReplacingMergeTree par event_id).

Contrat : contracts/v1/usage-event.schema.json (schema_version 1.0). L'usage est toujours remonté avec contracts/v1/usage-event.schema.json, l'audit avec contracts/v1/audit-event.schema.json.

Endpoints d'API​

MéthodeChemin
GET/v1/providers/catalog
GET/v1/telemetry/overview

GET /v1/providers/catalog​

Réponse :

{
"items": [
{
"id": "vllm",
"label": "vLLM (local inference engine)",
"local": true,
"base_url": "http://vllm-llama-70b:8000/v1",
"provider_id": "7fcf4489-04d6-4992-9187-0ccca12986e6",
"enabled": true,
"discovery": "api"
}
]
}

GET /v1/telemetry/overview​

Réponse :

{
"window": "24h",
"requests": 18234,
"error_rate": 0.012,
"p95_latency_ms": 2140,
"tokens": {
"input": 9120044,
"output": 1203400
},
"top_models": [
{
"model_id": "gpt-4o-mini",
"share": 0.61
}
]
}

Exemples SDK​

Python​

from enterprise_ai import EnterpriseAI

client = EnterpriseAI(base_url="<control-plane-url>", api_key="eai_live_xxx", tenant="acme", locale="fr")
client.providers.catalog()
client.telemetry.overview(days=1)

TypeScript​

import { EnterpriseAI } from "@enterprise-ai/sdk";

const client = new EnterpriseAI({ baseUrl: "<control-plane-url>", apiKey: process.env.EAI_API_KEY, tenant: "acme", locale: "fr" });
await client.providers.catalog();
await client.telemetry.overview({ days: 1 });

Java​

EnterpriseAIClient client = EnterpriseAIClient.builder()
.baseUrl("<control-plane-url>")
.apiKey(System.getenv("EAI_API_KEY"))
.tenant("acme")
.locale(Locale.FRENCH)
.build();
client.providers().catalog();
client.telemetry().overview(Map.of("days", 1));

Go​

client, err := eai.NewClient(eai.WithBaseURL("<control-plane-url>"), eai.WithAPIKey(os.Getenv("EAI_API_KEY")), eai.WithTenant("acme"), eai.WithLocale("fr"))
if err != nil { log.Fatal(err) }
ctx := context.Background()
_, err = client.Providers.Catalog(ctx)
_, err = client.Telemetry.Overview(ctx, eai.WithQuery(map[string]string{"days": "1"}))

Configuration​

Aucune variable EAI_* : configuration par les valeurs Helm et la configuration propre de l'outil.

Clés de valeurs Helm (deploy/helm/enterprise-ai/values.yaml) : controlPlane.autoscaling, portal.autoscaling, litellm.autoscaling, vllm.keda, workers.items[].keda.

Sécurité​

  • KEDA lit les métriques avec un compte de service en lecture seule.
  • Tenant déduit de l'identifiant d'accès, jamais du corps ; sécurité au niveau des lignes PostgreSQL sur chaque table de tenant.
  • Chaque mutation et décision de politique écrit un événement d'audit chaîné par hachage (G-11).
  • Les erreurs utilisent l'enveloppe standard avec message_i18n en et fr.

Observabilité​

  • Nombre de réplicas par rapport à la cible, événements de mise à l'échelle.
  • traceparent W3C propagé, X-Request-Id renvoyé, les spans portent eai.tenant_id, eai.project, eai.agent_id, eai.run_id.

Unités FinOps​

  • Le scale à zéro et le nombre max de réplicas sont des leviers de coût ; le temps GPU inactif est visible dans H-04.

Modes de défaillance et résilience​

  • Source de métriques indisponible -> le HPA garde les réplicas actuels (pas de tempête de réduction).

Adoption autonome​

Les valeurs Helm sont réutilisables dans le cluster du client.

Tests d'acceptation​

  1. Un test de charge augmente les réplicas du control plane en 2 minutes puis revient au minimum.

Feuille de route d'implémentation