S3 Buckets & Object Storage¶
Überblick¶
Die Polycrate API verwaltet S3-Cluster (technischer Speicher-Cluster, z. B. MinIO, Ceph RadosGW) und S3-Buckets (logische Einheiten für Anwendungsdaten) mit vollständigem Lifecycle (Create, Provision, Credentials, Capacity, Delete). Buckets können über Web-UI, API oder – seit CLI 0.35.0 – deklarativ über Kubernetes Custom Resources angelegt werden.
graph LR
User[User / K8sApp] --> Bucket[S3Bucket]
Bucket --> Cluster[S3Cluster<br/>MinIO / RadosGW]
Bucket --> Creds[Credentials<br/>Access/Secret Key]
Bucket --> Capacity[Capacity-Tracking] | Konzept | Zweck |
|---|---|
| S3Cluster | Einer technischer Storage-Cluster mit Endpoint, Region, Provider-Typ |
| S3Bucket | Logischer Bucket innerhalb eines Clusters mit eigenem IAM-User und Credentials |
| S3Region | Region-String, den User im Request angeben (Polycrate löst auf S3Cluster auf) |
Buckets anlegen – drei Wege¶
1. Web-UI¶
Storage → S3 Buckets → New
| Feld | Wert |
|---|---|
| Name | eindeutiger Bucket-Name (DNS-konform) |
| Region | gewählte Region – wird zu einem konkreten S3-Cluster aufgelöst |
| Organization / Workspace | automatische Zuordnung oder manuell wählbar |
| CORS Allow All | optional, öffnet CORS für Public-Use-Cases |
| Labels / Annotations | frei nutzbar für eigene Zwecke |
Polycrate erzeugt beim Speichern synchron:
- Bucket auf dem S3-Cluster (MinIO oder RadosGW)
- IAM-User mit Access-/Secret-Key (nur für diesen Bucket)
- Credentials-Datensatz, der verschlüsselt gespeichert wird
2. REST API¶
POST /api/v1/s3/buckets/
{
"name": "my-app-data",
"region": "eu-central",
"organization": "11111111-2222-3333-4444-555555555555",
"workspace": "66666666-7777-8888-9999-000000000000",
"cors_allow_all": false
}
Fehlt region, nutzt die API die Einstellung System Config → Default S3-Bucket-Cluster. Ist auch diese nicht gesetzt: HTTP 400 mit klarer Fehlermeldung.
3. Kubernetes Custom Resource (neu mit CLI 0.35.0)¶
apiVersion: polycrate.io/v1alpha1
kind: S3Bucket
metadata:
name: my-app-data
namespace: my-app
spec:
region: eu-central # optional; fällt auf Default zurück
corsAllowAll: false
credentialsSecretName: my-app-s3 # optional; Default: <cr-name>-s3
Sobald die CR im Cluster angewendet wird:
- Der Polycrate Operator erzeugt den Bucket in der Polycrate API (inkl. IAM-User und Credentials)
-
Der Access-/Secret-Key wird als Kubernetes Secret im selben Namespace abgelegt:
-
Im Status der CR erscheinen die Phasen
Pending → Provisioning → Ready - Beim Löschen der CR (
kubectl delete s3bucket my-app-data) wird der Bucket in der API deprovisioniert und das Secret entfernt (Finalizer-Pattern)
Adopt-Pattern
Existiert in der Polycrate API bereits ein Bucket mit demselben Namen + Region, wird er adoptiert statt neu angelegt. So können bestehende Buckets nachträglich per CR verwaltet werden.
Idealer Workflow für K8sApps
S3Bucket-CRs gehören in das Manifest-Set Ihrer App (GitOps). Die App kann direkt via envFrom: secretRef die Credentials konsumieren – kein manuelles Secret-Management nötig.
Region-Auflösung¶
Die Region im Request (region: eu-central) wird in dieser Reihenfolge auf einen S3-Cluster aufgelöst:
- Organisations-Cluster: Hat die Organisation einen eigenen S3-Cluster mit dieser Region? → nehmen
- Platform-Service-Cluster: Gibt es einen shared Cluster mit dieser Region? → nehmen
- Erster verfügbarer Cluster mit dieser Region
- Default aus SystemConfig (wenn
regionganz fehlt) - Sonst:
HTTP 400
Hat der aufgelöste Cluster allow_new_buckets=false (z. B. weil Kapazität erschöpft ist), wird der Request mit einer verständlichen Fehlermeldung abgelehnt.
Capacity-Tracking¶
Polycrate holt pro S3-Cluster regelmäßig Statistiken vom Provider (MinIO Admin API bzw. Ceph-Telemetry) und speichert sie pro Bucket:
| Metrik | Beschreibung |
|---|---|
| Belegung (Bytes) | Live-Nutzung pro Bucket |
| Object Count | Anzahl Objekte pro Bucket |
| Cluster-Belegung | Aggregiert pro S3-Cluster (für Kapazitätsplanung) |
Diese Werte fließen in die Pricing-Logik ein und sind über Prometheus-Metriken abrufbar.
Credentials-Zugriff¶
- UI: Bucket-Detail → Tab Credentials (zeigt Access/Secret nur nach explizitem "Reveal")
- API:
GET /api/v1/s3/buckets/{id}/credentials/ - Via CR: automatisch als Kubernetes Secret im App-Namespace
Jeder Bucket hat einen eigenen IAM-User – Compromise eines Buckets betrifft andere Buckets nicht.
Produktisierung & Abrechnung¶
S3Bucket ist ein productized model: beim Anlegen wird automatisch ein Default-Produkt (kind=object-storage) zugewiesen, das aus System Config → Default Products stammt. Pricing folgt dem Modell des Produkts (Flat-Rate oder mengenabhängig über Capacity-Tracking). Details: Pricing & Business Layer.
Siehe auch¶
- Operator (CLI) – Controller-Details für
S3BucketCR - Release CLI 0.35.0 – S3Bucket Controller
- Release CLI 0.35.2 – Agent-Token Auto-Assignment
- Release API 0.15.0 – Capacity-Tracking, Region-Default, Filter
- Pricing & Business Layer