Einen Agenten im eigenen Cluster testen lassen
In diesem Schritt fährt ein Coding-Agent die Schleife aus dem Schnellstart für dich: Er legt einen Wegwerf-Cluster an, deployt upcheck dort aus deiner upcheck.yaml, lässt deine Tests dagegen laufen, berichtet und löscht den Cluster. Er arbeitet über die MCP-Tools des Portals, mit einem API-Schlüssel, der nur die Scopes trägt, die er braucht, und jeder seiner Aufrufe wird festgehalten.
Was du am Ende hast
Abschnitt betitelt „Was du am Ende hast“Einen Bericht deines Agenten über eine Version von upcheck, getestet in einem Cluster, den es nur für den Test gab, und ein Protokoll jedes Aufrufs, den der Agent gemacht hat, vom Anlegen dieses Clusters bis zum Löschen. upcheck-prod bleibt unberührt.
Was du brauchst
Abschnitt betitelt „Was du brauchst“- Die Schritte 1 und 2. Der erste Cluster deines Teams hat sein Abonnement gestartet; die API kann keines starten (sie antwortet
payment_method_required), darum wird der erste Cluster eines Teams immer im Portal angelegt. Behalte deineupcheck.yaml. - Ein Release mit der PaaSbox Platform,
2026.10.2oder neuer, im Kanal stable. Ein Cluster, den der Agent anlegt, bekommt das Release seines Kanals, stable, wenn der Aufruf keinen anderen nennt. - Das Konto eines Team-Admins. Nur Team-Admins legen Schlüssel an, und ein Schlüssel handelt mit den Rechten des Admins, der ihn angelegt hat: Cluster anlegen und löschen braucht einen Team-Admin.
- Ein Hetzner-Projekt für Testcluster, verbunden wie das aus Schritt 1. Ein Wegwerf-Cluster bekommt eine Kopie des Tokens seines Projekts, so hat der Agent nie ein Hetzner-Token in der Hand; in einem Projekt, das nur Testcluster hält, erreicht diese Kopie nichts sonst.
- Einen Coding-Agenten, der MCP über HTTP spricht, etwa Claude Code, auf einem Rechner mit
kubectlund Python 3.10 oder neuer. - Das Image, das getestet werden soll, in einer Registry, aus der der Cluster ziehen kann, und deine Tests: einen Befehl, der die App über HTTP prüft, wenn er ihre Adresse bekommt. Was die Tests prüfen, entscheidest du.
- Platz für einen weiteren Cluster in der Grenze deines Teams von 10.
Den Schlüssel anlegen
Abschnitt betitelt „Den Schlüssel anlegen“-
Öffne API keys & agents. Trag unter Create a key als Name
claude-codeein, hake bei Scopesk3s:read,k3s:write,k3s:accessundk3s:destructivean und setz Expires auf in 30 days. Wähle Create key. -
Kopier den Schlüssel. Die Seite zeigt ihn einmal und behält nur einen Hash davon.
Jeder Scope öffnet eine Gruppe von Tools, und der Agent bekommt genau diese. k3s:read listet Projekte, Servertypen, Cluster, Add-ons und Operationen. k3s:write schaltet Add-ons, hier die PaaSbox Platform auf dem Testcluster; er würde auch Snapshots machen und Upgrades einplanen. k3s:access holt Kubeconfigs. k3s:destructive legt Cluster an und löscht sie.
Ein Scope gilt nicht nur für einen Cluster: Dieser Schlüssel könnte auch auf upcheck-prod Add-ons schalten, ihn upgraden oder löschen. Gib k3s:destructive nur einem Agenten, dem du zusiehst, wie hier. Ein Schlüssel für einen Agenten, der nur an deinen Stages arbeitet, sollte ihn nicht tragen. Soll die Produktion ganz außer Reichweite eines Schlüssels sein, halte sie in einem Team, zu dem der Schlüssel nicht gehört (Leitplanken für Agenten).
Den Agenten verbinden
Abschnitt betitelt „Den Agenten verbinden“-
Connect your agent auf derselben Seite zeigt den MCP-Endpunkt, die Adresse des Portals gefolgt von
/mcp/. Füg ihn in Claude Code hinzu:Terminal-Fenster export PAASBOX_API_KEY=<der Schlüssel>claude mcp add --transport http paasbox https://<das Portal>/mcp/ \--header "Authorization: Bearer $PAASBOX_API_KEY" -
Lade das Kubeconfig-Hilfsskript, das die Seite verlinkt,
paasbox_kubeconfig.py, in das Arbeitsverzeichnis des Agenten und führpip install cryptographyaus. -
Lass den Agenten dich fragen, bevor er
create_cluster,delete_cluster,restore_snapshotoderdetach_clusteraufruft: In Claude Code nimmst du sie nicht in die erlaubten Tools auf.
Wenn der Agent sich verbindet, sagt ihm der Server, in welchem Team er handelt, als wer und mit welchen Scopes. Mit allen vier Scopes sieht er alle 18 Tools.
Ihm die Aufgabe geben
Abschnitt betitelt „Ihm die Aufgabe geben“Starte den Agenten in dem Verzeichnis mit upcheck.yaml und deinen Tests und gib ihm die Aufgabe:
Test the upcheck image registry.example.com/upcheck:<tag> in a throwaway PaaSbox cluster.1. Create the cluster upcheck-test-1 in the Hetzner project for tests, location fsn1, server type cpx22, with a copy of the project's token. Open its API only to this machine's address.2. Wait until it is ready. Switch on the paasbox-platform add-on, profile saas-http01, ACME e-mail you@example.com, with Flux, and wait until it reports applied.3. Get an admin kubeconfig for one hour with paasbox_kubeconfig.py. Never show it or the private key.4. Apply upcheck.yaml in namespace upcheck with spec.image set to the image above and without spec.exposure. Wait until the SaaSApplication is Ready.5. Port-forward svc/upcheck-web to localhost:8000 and run ./smoke-test.sh http://localhost:8000.6. Report what passed and what failed.7. Delete the cluster without a final snapshot.Du kannst die Aufgabe auch auf Deutsch stellen. Was der Agent damit tut:
-
Er ruft
list_projectsundlist_server_typesauf, für die ID des Projekts und die Servertypen mit ihrem Speicher und Hetzners monatlichem Nettopreis. -
Er ruft
create_clusterauf, mitnameundconfirmbeideupcheck-test-1,hcloud_token{"mode": "copy"}und deiner Adresse inallowed_api_ranges. Dein Agent fragt dich vorher; sag ja. Das Portal lehnt den Aufruf ab, wennconfirmnicht der Name des neuen Clusters ist, und macht die Prüfungen der Seite zum Anlegen: die Grenze deines Teams, die akzeptierten Bedingungen, die Abrechnung. -
Er fragt
get_clusterab, bisstatereadyist. Im Labor war ein Cluster 2 Minuten 46 Sekunden nach der Anfrage bereit; 69 davon gingen in das Kopieren des Node-Images ins Projekt, auf das nur der erste Cluster eines Projekts wartet. -
Er ruft
set_addonauf, mitaddonpaasbox-platform,enabledtrue,options{"profile": "saas-http01", "acmeEmail": "you@example.com"}undalso["flux"], das Flux im selben Speichern einschaltet, und fragtlist_addonsab, bis die Plattformappliedmeldet. Der Aufruf zum Anlegen hat auch ein Feldplatform, aber die API hat kein Feld für die ACME-E-Mail, die jedes Profil braucht, darum wird ein Anlegen mitplatformabgelehnt; die Seite zum Anlegen im Portal fragt nach der E-Mail, die API nicht. -
Er erzeugt ein Schlüsselpaar mit
python3 paasbox_kubeconfig.py keygen --out key.pem, gibt die öffentliche Hälfte anrequest_kubeconfigmitroleadminund fragtget_kubeconfig_resultab. Das Ergebnis ist für seinen Schlüssel verschlüsselt und wird einmal ausgegeben;paasbox_kubeconfig.py decryptöffnet es auf dem Rechner des Agenten. Das Portal kann es nicht lesen. -
Er wendet die geänderte Kopie von
upcheck.yamlan, die auch den Namespaceupcheckanlegt. Ohnespec.exposureveröffentlicht die Plattform nichts: kein Ingress, kein Zertifikat, kein DNS-Name, auf den zu warten wäre, und das Django-Profil nimmt jeden Hostnamen über einfaches HTTP an.kubectl -n upcheck get saasappzeigt die PhaseReady, sobald die Migration gelaufen ist und die Komponenten laufen. -
Er lässt deine Tests über
kubectl -n upcheck port-forward svc/upcheck-web 8000:80laufen und berichtet. -
Er ruft
delete_clusterauf, mitconfirmupcheck-test-1undfinal_snapshotfalse: Der Cluster hat keinen Bucket, und ein letzter Snapshot bliebe auf der Platte, die gelöscht wird. Dein Agent fragt dich wieder. Die Abrechnung endet sofort; im Labor dauerte ein Löschen 14 Sekunden, und keine Ressource mit dem Label des Clusters blieb übrig.
Nachlesen, was er getan hat
Abschnitt betitelt „Nachlesen, was er getan hat“Auf API keys & agents listet Recent activity die letzten Aufrufe; All activity hat alle, filterbar nach Key. Jeder MCP-Aufruf ist eine Zeile, Lesezugriffe und Ablehnungen eingeschlossen: wann er lief, der Schlüssel, der Aufruf, der Cluster und das Ergebnis, bei einer Ablehnung mit ihrem Code, etwa confirmation_required. Die Argumente bleiben erhalten, jedes Geheimnis darin ersetzt durch [redacted]. Was der Agent mit kubectl gemacht hat, steht nicht in diesem Protokoll: Diese Aufrufe gingen an die eigene API des Clusters.
In Arbeit Paddle berechnet einen weiteren Cluster, sobald er zum ersten Mal bereit ist, anteilig bis zum Ende des Abrechnungszeitraums, und schreibt den Rest gut, wenn er gelöscht wird; upcheck-prod hält das Abonnement des Teams währenddessen am Laufen. Den Server des Testclusters rechnete Hetzner stundenweise ab, zu seinem eigenen Preis.
Die Referenz der MCP-Tools listet jedes Tool mit seinem Scope und seinen Argumenten; Leitplanken für Agenten sagt, was jede Grenze aufhält und was nicht.
Was du jetzt hast
Abschnitt betitelt „Was du jetzt hast“Einen Agenten, der eine Änderung in einem Cluster testet, der für den Test gebaut ist, und den Cluster danach entfernt, mit einem Schlüssel, der die Scopes trägt, die du gewählt hast, und ein Protokoll jedes Aufrufs. Der nächste Schritt gibt upcheck eine zweite Stage.