S3 endpoints
RustFS
A newer, Apache-2.0 object store written in Rust.
What it is#
RustFS is the youngest project here and covers everything the driver needs for ephemeral and durable volumes, including POST policies. It is also the least battle-tested of the six, so weigh it accordingly.
| Project | https://github.com/rustfs/rustfs |
|---|---|
| Licence | Apache-2.0 |
| Image tested | rustfs/rustfs:1.0.0-alpha.60 |
| S3 port | 9000 |
Run it#
A single-node setup, enough to archive into and to try the driver against. It is not a production topology for any of these products; each project's own documentation covers that.
services:
rustfs:
image: rustfs/rustfs:1.0.0-alpha.60
environment:
RUSTFS_ACCESS_KEY: archiver-key
RUSTFS_SECRET_KEY: archiver-secret
RUSTFS_ADDRESS: 0.0.0.0:9000
RUSTFS_VOLUMES: /data
RUSTFS_CONSOLE_ENABLE: "false"
ports:
- "9000:9000"
volumes:
- rustfs-data:/data
volumes:
rustfs-data:Point the driver at it#
Endpoint and credentials go on the volume; nothing about the driver's installation
changes. pathStyle is on because a container reached by address has no
per-bucket DNS, which is the usual shape outside AWS.
apiVersion: v1
kind: Secret
metadata:
name: rustfs-credentials
namespace: default
stringData:
accessKeyId: archiver-key
secretAccessKey: archiver-secret
---
apiVersion: v1
kind: Pod
metadata:
name: writer
spec:
containers:
- name: app
image: busybox:1.36
command: ["sh", "-c", "echo hello > /dumps/first.txt; sleep 3600"]
volumeMounts:
- { name: dumps, mountPath: /dumps }
volumes:
- name: dumps
csi:
driver: s3archiver.csi.trion.de
nodePublishSecretRef:
name: rustfs-credentials
volumeAttributes:
bucket: archives
prefix: "{namespace}/{podName}/"
endpoint: http://rustfs.storage.svc.cluster.local:9000
pathStyle: "true"
region: us-east-1To make it the default for every volume instead, set S3A_ENDPOINT,
S3A_PATH_STYLE and S3A_REGION on the DaemonSet and leave them off
the volumes. The configuration
reference lists both halves.
What works#
Measured, not claimed. An opt-in test suite runs every one of these against RustFS through the driver's own code paths.
| Capability | What it gives you | |
|---|---|---|
| Single PutObject | yes | Archiving anything at all. |
| Multipart upload | yes | Files over the 64 MiB threshold. A heapdump is almost always over it. |
| ListObjectsV2 | yes | Segment compaction and durable volumes. Ephemeral archiving never lists. |
| DeleteObject | yes | Compaction removes fragments it has assembled; durable volumes mirror deletions. |
| GetObject | yes | Restoring a durable volume at pod start. Ephemeral volumes never read back. |
| UploadPartCopy | yes | Server-side append and segment assembly. Without it a growing file is re-uploaded whole. |
| Offset append 1 | no | The cheapest append, one request carrying only the new bytes. An S3 Express feature. |
| SSE-S3 | no | Requesting AES256 encryption per volume. A bucket default covers you regardless. |
| SSE-KMS | no | Per-volume encryption with a customer-managed key. |
| Presigned PUT | yes | Presigned credential mode, where the node holds no S3 keys. |
| Presigned POST policy | yes | Signer-less mode, with one prefix-scoped policy in the volume Secret. |
8 of 11 supported. Missing: Offset append, SSE-S3, SSE-KMS. The driver degrades rather than failing for all of these except where noted below.