← KI-Engineering und Agentic AI
Deployment-Infrastruktur · Produktion AKS · Bicep-IaC

Agentisches ERP: die Deployment-Infrastruktur

Die Pipeline, die den Copilot auf echte Infrastruktur bringt, mit den 6 Prüfungen, die vor jedem Release bestehen müssen.

6
Bicep-Infrastrukturmodule
AKS, ACR, Postgres, Redis, CosmosDB, Monitor
2
Kustomize-Overlays
Staging und Produktion
6
Prüfungen im Smoke-Test
Health, Doku, WebSocket, Human-Gate, Injection, Frontend
OIDC
Authentifizierung
ohne Schlüssel, keine Registry-Zugangsdaten in der CI

Eine CI/CD-Architektur aus zwei Repositories

Das Entwicklungs-Repository fährt bei jedem Push auf master eine GitHub-Actions-Pipeline aus 6 Jobs: Qualitäts-Gates im Backend (ruff, black, mypy, bandit, pytest-Unittests), tsc im Frontend, Integrationstests, ein Red-Team-Job (promptfoo) und ein Build, der die Images mit schlüsselloser OIDC-Authentifizierung in die Azure Container Registry schiebt. Ein repository_dispatch-Ereignis stößt danach dieses Deployment-Repository an.

Dieses Deployment-Repository nimmt das Ereignis auf und startet einen Deploy-Job, der über eine GitHub-Umgebung auf eine manuelle Freigabe wartet. Nach der Freigabe läuft kubectl apply, dann rollout wait, dann der Smoke-Test mit 6 Prüfungen. Das Deployment in einem eigenen Repository zieht die Produktionsgrenze dorthin, wo eine prüfende Person sie sieht: kein Commit erreicht die Produktion ohne ein zweites Augenpaar.

Infrastruktur als Code: die Bicep-Module

Modul Detail
AKS Ein System-Knotenpool (Standard_D2s_v3) und ein GPU-Knotenpool (Standard_NC6s_v3), mit aktiviertem OIDC-Issuer für eine schlüssellose Workload Identity.
Azure Container Registry Premium-SKU mit Georeplikation. GitHub Actions pusht über OIDC, also liegen keine Registry-Zugangsdaten in den CI-Secrets.
Postgres (Flexible Server) pgvector aktiviert, nur über einen privaten Endpunkt erreichbar, mit erzwungenem SSL.
Redis Cache Standard-C1-SKU, trägt den semantischen Cache (SHA-256- und Kosinus-Suche) und die Entscheidungs-UUIDs des Human-Gates (Lebensdauer 24 Stunden).
CosmosDB Serverlos, mit Lesereplikaten in mehreren Regionen. Hält den Gesprächsverlauf und die Audit-Protokolle.
Azure Monitor / App Insights Das OTel-DaemonSet leitet OTLP-Traces und -Metriken weiter. Die Dashboards decken Solver-Latenz, Cache-Trefferquote und die Zahl der Human-Gate-Entscheidungen ab.

Die Kustomize-Overlays

Ein Basissatz an Kubernetes-Manifesten (Deployment, Service, ConfigMap, HorizontalPodAutoscaler) gilt für alle Umgebungen. Die Kustomize-Overlays patchen nur, was Staging und Produktion unterscheidet: Anzahl der Replicas, Ressourcenanforderungen und -grenzen sowie Image-Tags. Kein Manifest wird dupliziert.

Der NGINX-Ingress-Controller leitet /api und /ws an das FastAPI-Backend und / an das Vite-Frontend. Die Upgrade-Header für WebSocket werden ausdrücklich weitergereicht, damit der Benachrichtigungskanal des Human-Gates den Ingress passiert, statt dort still zu verschwinden.

Observability: das OTel-DaemonSet

Ein DaemonSet mit dem OpenTelemetry Collector läuft auf jedem AKS-Knoten, nimmt OTLP-Traces und -Metriken aus den Anwendungs-Pods entgegen und leitet sie über den OTLP/HTTP-Exporter an Azure Monitor Application Insights weiter. Die Dashboards verfolgen die Solver-Latenz je Intent (mcnf_solve, vrp_route und die übrigen), die Trefferquote des Redis-Caches, die Zahl der Human-Gate-Entscheidungen samt Freigabequote und die Ergebnisse der Red-Team-Sonden aus dem CI-Gate.

Der Smoke-Test: 6 Prüfungen

Sobald kubectl rollout status einen gesunden Stand meldet, läuft das Skript smoke-test.sh mit 6 Prüfungen nacheinander und bricht beim ersten Fehler ab:

  • Health-Endpunkt. GET /health liefert 200.
  • OpenAPI-Doku. GET /docs liefert 200, was bestätigt, dass FastAPI korrekt gestartet ist.
  • WebSocket-Erreichbarkeit. Ein kurzer Handshake zum Benachrichtigungskanal des Human-Gates gelingt.
  • Router des Human-Gates. Ein Test-Solver-Aufruf über der Schwelle von 10.000 $ erreicht den Gate-Knoten und liefert einen wartenden Status statt eines Fehlers.
  • Injection-Sonde. Eine bekannte Prompt-Injection kommt abgewiesen zurück, was bestätigt, dass die Bereinigung personenbezogener Daten und die RBAC-Schicht aktiv sind.
  • Erreichbarkeit des Frontends. GET / liefert 200 mit dem HTML des Vite-Bundles.

Die Sicherheitslage

Postgres, Redis und CosmosDB liegen hinter privaten Endpunkten und sind aus dem öffentlichen Internet nicht erreichbar. Die Workload Identity von AKS (OIDC) authentifiziert die Pods gegenüber den Azure-Ressourcen ohne statische Zugangsdaten, und der GitHub-Actions-Workflow nutzt OIDC-Föderation, um Images nach ACR zu schieben, also liegt nirgends ein Registry-Passwort. Die JWT für den API-Zugriff nutzen HS256 mit einem Ablauf nach 60 Minuten.

  • Azure AKS
  • Bicep
  • Kustomize
  • GitHub Actions
  • OIDC
  • OTel
  • Azure Monitor
  • NGINX ingress
  • Postgres + pgvector
  • Redis
  • CosmosDB
  • ACR