Kubernetes
Deploy BlixtFS on Kubernetes with the Helm chart, as a scale-out cluster serving NFS and SMB to clients inside or outside the cluster.
The Helm chart is in early access. Contact us to get the chart, and for help planning a production deployment.
What the chart deploys
| Component | Kind | Default |
|---|---|---|
| Config server | Deployment | 1 replica |
| File servers | Deployment with autoscaling | 3–12 replicas |
| Cache servers | StatefulSet with persistent volumes | 3 replicas |
| Write servers | StatefulSet with persistent volumes | 3 replicas |
| Indexing, updater, replication | Deployments | 1 replica each |
| NFS and SMB gateways | Deployments behind LoadBalancer Services | enabled |
| PostgreSQL | StatefulSet (or bring your own) | enabled |
| Notifier | Deployment | disabled |
All pods run in one namespace, bfs in the examples below.
Prerequisites
- A Kubernetes cluster with a default StorageClass for the cache, write and database volumes.
kubectland Helm 3.- A bucket, and a way for pods to reach it: workload identity (recommended on GCP, AWS, Azure and Oracle) or a Secret holding keys.
Install
helm install bfs ./blixtfs -n bfs --create-namespace \
--set backend=gcp \
--set gcp.project=my-project \
--set 'buckets={gs://my-bucket}' \
--set auth.token="$(openssl rand -hex 32)"
auth.token is the shared token BlixtFS services use to authenticate each
other. The chart stores it in the bfs-auth Secret. Always set your own: the
chart’s default is a placeholder.
backend is one of gcp, aws, azure, oracle, minio, cloudflare,
coreweave or local.
Wait for the pods, then find the gateway addresses:
kubectl -n bfs get pods
kubectl -n bfs get svc nfs smb
Mount from any client that can reach the NFS Service’s external IP:
sudo mount -t nfs -o vers=4 <EXTERNAL-IP>:/ /mnt/blixt
Credentials
Workload identity (GCP, AWS, Azure, Oracle): the chart annotates its service account for your cloud’s workload identity. Grant that identity access to the bucket in your cloud’s IAM, and no key is stored in the cluster.
Keys (MinIO, Cloudflare R2, CoreWeave): set them in your values file, and
the chart stores them in a Secret (bfs-minio, bfs-cloudflare or
bfs-coreweave):
backend: cloudflare
buckets:
- r2://my-bucket
cloudflare:
accountId: 0123456789abcdef
accessKey: ...
secretKey: ...
apiToken: ... # optional: change notifications
For production, keep keys out of values files that live in version control. Manage the Secrets with a tool such as Sealed Secrets or External Secrets.
Commonly changed values
| Value | Purpose |
|---|---|
image.tag |
BlixtFS version. Pin it, for example 2.9.0. |
buckets |
List of bucket specs to serve. |
file.replicas, file.autoscaling.* |
File server count and autoscaling. |
cache.replicas, write.replicas |
Size of the cache and write tiers. |
postgres.enabled, externalDatabase.* |
Use the bundled PostgreSQL or your own. |
protocol.nfs.enabled, protocol.smb.enabled |
Which gateways to run. |
auth.enabled |
Require the shared token between services. |
serviceMonitor.enabled |
Create a Prometheus Operator ServiceMonitor. |
eventLog.enabled, notifier.enabled |
Turn on the event log. Set both together. |
Kubernetes workloads: the CSI driver
Pods inside the cluster can mount buckets as volumes through the BlixtFS CSI driver, instead of going through NFS. The driver can also provision a new bucket dynamically for a PersistentVolumeClaim. Contact us for the driver manifests while it is in early access.
Applying configuration changes
After changing values, upgrade the release and restart the config server so every server picks up the change:
helm upgrade bfs ./blixtfs -n bfs -f my-values.yaml
kubectl -n bfs rollout restart deploy/config
Security notes
- The NFS gateway pod runs privileged, and the images currently run as root. Place BlixtFS in a dedicated namespace and restrict it with network policies.
- Expose the NFS and SMB Services only to the networks that need them. The internal gRPC ports should never leave the cluster.