Dokumentation

Dokumentation

Einstiegspunkt für die Konductly-API und die produktbezogene Bedienung — von GraphQL und Auth bis Cost Report und Waste Detection.

Getting Started

API-Referenz

Das Backend stellt eine GraphQL-API bereit. REST wird ausschließlich für Authentifizierung und Kubeconfig-Upload genutzt; alle übrigen Operationen laufen über GraphQL.

GraphQL-Endpunkt

Sämtliche Queries und Mutations werden per POST /query abgesetzt. In Nicht-Release-Umgebungen ist unter GET /playground ein interaktiver GraphQL-Playground verfügbar.

bash
curl -X POST https://api.konductly.io/query \  -H "Authorization: Bearer $ACCESS_TOKEN" \  -H "Content-Type: application/json" \  -d '{"query":"{ health }"}'
  • Queries: health, clusters, pods, costReport, dockerContainers, me
  • Mutations: addCluster, removeCluster, deletePod, restartDeployment, scalePods, startContainer, stopContainer, restartContainer, createUser
  • Autorisierung über Directives: @auth (gültiges Access-Token) und @hasRole(role: ADMIN) für privilegierte Felder

Core Concepts

Auth-Flow (JWT)

Die Anmeldung erfolgt per POST /auth/login und liefert ein kurzlebiges Access-Token (HS256, 15 Minuten) sowie ein Refresh-Token. Passwörter werden serverseitig mit bcrypt gehasht.

bash
curl -X POST https://api.konductly.io/auth/login \  -H "Content-Type: application/json" \  -d '{"email":"admin@example.com","password":"••••••"}'
  • Access-Token im Header senden: Authorization: Bearer <token>
  • Refresh über POST /auth/refresh — das Refresh-Token (7 Tage, in Redis) wird dabei rotiert
  • Rollenmodell: ADMIN (voller Zugriff) und VIEWER (read-only)

WebSocket-Subscriptions

Echtzeit-Updates laufen über GraphQL-Subscriptions per WebSocket auf GET /query (Protokoll graphql-transport-ws). Die Authentifizierung wird im Init-Payload geprüft — der Upgrade findet erst nach erfolgreicher Prüfung statt.

graphql
subscriptionsubscription ClusterMetrics($id: ID!) {  clusterMetrics(clusterId: $id) {    nodeCount    nodesReady  }}
  • clusterMetrics(clusterId): Node-Anzahl und Node-Status eines Clusters
  • costUpdated(clusterId): aktualisierter Cost Report
  • podStatusChanged(clusterId, namespace): Pod-Status-Events aus dem K8s-Watch

Rate Limits

Die API ist gegen Resource-Exhaustion abgesichert. Limits gelten pro Identität (authentifiziert per Nutzer-ID, sonst per IP).

  • Rate-Limiting: standardmäßig 60 Requests pro Minute (Fixed-Window, Redis-basiert)
  • GraphQL-Depth-Limit: maximale Verschachtelungstiefe 8 (Code DEPTH_LIMIT_EXCEEDED)
  • GraphQL-Complexity-Limit: maximale Query-Komplexität 100

Cluster Setup

Cluster hinzufügen

Cluster werden über addCluster mit einer Base64-kodierten Kubeconfig angelegt; alternativ lässt sich die Kubeconfig per POST /clusters/:id/kubeconfig hochladen. Zugangsdaten werden mit AES-256-GCM verschlüsselt gespeichert und erst zur Laufzeit im Arbeitsspeicher entschlüsselt — nie im Klartext geloggt.

graphql
mutationmutation AddCluster($name: String!, $kubeconfig: String!) {  addCluster(inputinput: { name: $name, kubeconfig: $kubeconfig }) {    id    name  }}
  • Unterstützte Auth-Typen: Kubeconfig, ServiceAccount-Token, Bearer-Token
  • Pro Request wird ein dynamischer Kubernetes-Client aus den entschlüsselten Zugangsdaten gebaut
  • Nur Admins können Cluster hinzufügen oder entfernen

Pods & Deployments verwalten

Über die GraphQL-Mutations lassen sich Workloads steuern. Mutierende Aktionen sind Admins vorbehalten; Viewer haben ausschließlich Lesezugriff.

  • deletePod(clusterId, namespace, name): Pod löschen
  • restartDeployment(clusterId, namespace, name): Deployment neu starten
  • scalePods(clusterId, namespace, name, replicas): Replica-Anzahl anpassen
  • Docker-Container: startContainer / stopContainer / restartContainer (idempotent, mit Audit-Log)

Cost & Waste

Cost Report lesen

costReport(clusterId) liefert die monatlichen Gesamtkosten, eine Effizienzkennzahl und konkrete Optimierungsvorschläge. Die Preisbasis ist eine fixe Preisliste (on-prem/Hetzner, kein Cloud-Pricing-API).

graphql
queryquery Cost($id: ID!) {  costReport(clusterId: $id) {    totalPerMonth    efficiency    recommendations {      typetype      target    }  }}
  • Node-Kosten: 50 % CPU / 50 % Memory
  • Pod-Kosten: (CPU-Request × Cost-per-Core) + (Memory-Request × Cost-per-GB)
  • Felder: totalPerMonth, efficiency, recommendations

Waste Detection verstehen

Waste Detection misst die Differenz zwischen angeforderten (Requested) und tatsächlich genutzten (Actual) Ressourcen und leitet daraus Empfehlungen ab.

  • Waste % = (Requested − Actual) / Requested × 100
  • Über 50 % Waste → Empfehlung RIGHTSIZE
  • Weitere Empfehlungstypen: IDLE (ungenutzt) und DOWNSCALE (überdimensioniert)

Security

Credentials & Verschlüsselung

Kubeconfigs und Cluster-Zugangsdaten werden mit AES-256-GCM verschlüsselt gespeichert und ausschließlich zur Laufzeit entschlüsselt. Der Schlüssel stammt aus dem Secret-Management und liegt nie im Repository oder in Images.

  • JWT: Access-Token HS256, 15 Minuten; Refresh-Token 7 Tage in Redis, Rotation bei Refresh
  • Passwörter: bcrypt (Cost ≥ 10)
  • GraphQL: Depth-Limit 8, Complexity-Limit 100, Rate-Limiting pro Identität
  • WebSocket: Auth-Check vor dem Upgrade; nur autorisierte Cluster/Namespaces/Pods

Changelog

Releases & Änderungen

Alle veröffentlichten Releases — was neu ist und was behoben wurde — werden auf der Changelog-Seite gepflegt (Keep a Changelog). Geplante Funktionen stehen auf der Roadmap.

  • Changelog: vollständige Versionshistorie unter /changelog
  • Roadmap: geplante Funktionen unter /roadmap