Skip to main content

Ceph S3 Object Gateway

← All Topics

Was ist das Ceph S3 Object Gateway?

Das Ceph S3 Object Gateway (RGW) ist eine RESTful API die zur Amazon S3 (Amazon Simple Storage Service) API kompatibel ist.

Ceph bietet so die Möglichkeit Tools, welche S3 als Backend nutzen, nativ mit Ceph als Speicherlösung zu verwenden. Alle Dateien werden hier, wie gewohnt, redundant und verteilt gespeichert. Außerdem wird der Service, welcher den Endpoint für die API bereitstellt, redundant betrieben.

Da dieses Setup zusätzlichen Verwaltungs-/Bereitstellungsaufwand für uns bedeutet, ist das RGW nicht in unserem Standard Kubernetes Setup verfügbar. Bei Interesse an einer S3 kompatiblen Speicherlösung, kontaktieren Sie uns gerne.

Wichtig: Wie bereits in unserem Backup Artikel erwähnt, dürfen S3 Objekte nicht mit einem / am Anfang beginnen. Legen Sie diese immer mit einem relativen Pfad ab, ansonsten können wir keine Backups dieser Objekte erstellen.

Nutzung von Ceph S3

Erstellung eines Buckets

Ein Bucket wird, ähnlich zu einem RBD Blockdevice oder CephFS Volume, über eine StorageClass innerhalb von Kubernetes erstellt. Um einen Bucket im Namespace "test" zu erstellen, gehen Sie beispielsweise wie folgt vor:

apiVersion: objectbucket.io/v1alpha1
kind: ObjectBucketClaim
metadata:
  name: test-bucket
  namespace: test
spec:
  generateBucketName: test
  storageClassName: rook-ceph-bucket

Alternativ kann auch statt "generateBucketName: <Name>" der Parameter "bucketName: <Name>" genutzt werden. Hier ist allerdings zu beachten, dass jeder Bucketname einzigartig über alle Buckets in allen Namespaces hinweg sein muss. Wir empfehlen daher "generateBucketName" zu nutzen, welches eine eindeutige ID als Suffix anhängt.

Weitere Konfigurationsmöglichkeiten können Sie der Dokumentation von Rook entnehmen.

Nutzung eines Buckets

Nach der Erstellung eines Buckets, wird dieser automatisch innerhalb von Ceph angelegt. Die erstellte Ressource wird um den vollständigen Namen bei der Nutzung von "generateBucketName" ergänzt. Sie finden diesen unter "bucketName". Im Beispiel ist dieser dann "test-<lange zufällige ID>".

Außerdem wird ein Secret angelegt, welches die Zugangsdaten "AWS_ACCESS_KEY_ID" und "AWS_SECRET_ACCESS_KEY" enthält. Mit diesen Informationen können Sie auf den erstellten Bucket zugreifen. Als S3 Endpoint nutzen Sie hierfür, falls nicht anderweitig abgesprochen: "https://s3.<Domain Ihres Kubernetes Clusters>".

Standardmäßig wird der Zugriff auf den RGW Endpoint nur innerhalb des Clusters erlaubt. Falls sie externen Zugriff benötigen, geben Sie uns bitte Bescheid, damit wir die notwendigen Änderungen für Sie durchführen.

Weitere Konfigurationsmöglichkeiten

Bucket Notifications für Webhooks/Kafka/AMQP

Ein häufig genutztes Feature sind sogenannte Bucket Notifications. Diese ermöglichen es, bei bestimmten Änderungen (bspw. Upload einer Datei), eine Notification via Webhook/Kafka/AMQP zu senden. Diese kann dann weitere Aufgaben auslösen, bspw. das hinzufügen von Metadaten an dem soeben veränderten Objekt.

Im folgenden Beispiel wird eine Bucket Notification eingerichtet, welche einen Webhook auslöst, sobald eine Datei vom Typ "txt" hochgeladen wird.

Zuerst wird ein Bucket Topic angelegt. Hier wird angegeben wohin die Notifications gesendet werden sollen. Ein Bucket Topic kann von mehreren Notifications genutzt werden, genauso kann eine Notification von mehreren Buckets genutzt werden.

Im zweiten Schritt wird das Event (hier der Upload der Datei) und ein Filter (hier Dateiendung "txt) in der Notification festgelegt und welche Topic dafür genutzt werden soll.

apiVersion: ceph.rook.io/v1
kind: CephBucketTopic
metadata:
  name: test-topic
  namespace: test
spec:
  objectStoreName: tralios-rgw-store
  objectStoreNamespace: rook-ceph
  endpoint:
    http:
      uri: https://<your_webhook_endpoint>
      disableVerifySSL: false
---
apiVersion: ceph.rook.io/v1
kind: CephBucketNotification
metadata:
  name: http-notification
  namespace: test
spec:
  topic: test-topic
  events:
    - s3:ObjectCreated:*
  filter:
    keyFilters:
      - name: suffix
        value: .txt

Im letzten Schritt muss noch der zuvor erstellte ObjectBucketClaim angepasst werden. Hier wird via Label die Notification hinzugefügt:

apiVersion: objectbucket.io/v1alpha1
kind: ObjectBucketClaim
metadata:
  name: test-bucket
  namespace: test
labels:
  bucket-notification-http-notification: http-notification
spec:
  generateBucketName: test
  storageClassName: rook-ceph-bucket