mapfs-csi Kubernetes Deployment
This directory contains everything needed to deploy mapfs-csi (a CSI driver
for object storage) to a Kubernetes cluster.
Two separate concerns, don't confuse them:
- Installing the driver (once per cluster, no cloud/bucket knowledge needed) —
a Helm chart. - Configuring a storage backend (repeat for every bucket/cloud you want
to use — a single driver install can serve many of these at once) —
plain YAML templates, applied withkubectl apply -f.
Download the storage-backend templates
$ wget https://mapfs.cloud/dist/mapfs-csi-manifests-2.3.tar.gz
$ tar xzf mapfs-csi-manifests-2.3.tar.gz && cd mapfs-csi-manifests
This archive contains the Phase 2 templates (cloud-secret.yaml,
storageclass.yaml), the eks/ and example/ directories — everything
except the driver itself, which is installed via Helm (see Phase 1 below).
Directory layout
mapfs-csi-manifests/
├── cloud-secret.yaml # Cloud credentials Secret template (Phase 2)
├── storageclass.yaml # StorageClass template for dynamic provisioning (Phase 2)
│
├── eks/ # AWS EKS examples (arm64 nodes)
│ ├── storageclass.yaml # Example pointed at real AWS S3
│ ├── cloud-secret.yaml
│ ├── test-pods.yaml # Advanced example: verify cross-node RWX mounting
│ └── test-pod-same-node.yaml # Advanced example: verify same-node mount reuse
│
└── example/ # Usage examples, not required for installation
├── pv.yaml / pvc.yaml # Generic static-provisioning template (S3, etc.)
├── azure-pv.yaml / azure-storageclass.yaml # Azure Blob Storage example
└── minio-*.yaml # Self-hosted MinIO (S3-compatible) static/dynamic examples
Prerequisites
- A Kubernetes cluster with
kubectlandhelm(v3+) configured against it - A valid mapfs license (email + token, from https://mapfs.cloud/)
- Access credentials for your target cloud storage (access_key/secret_key,
or an Azure connectionString) - An existing bucket / container
Quick start (generic S3-compatible cloud)
Phase 1: Install the driver
This is a one-time, per-cluster step. It doesn't need any cloud/bucket
information — just your mapfs license.
-
Install the chart:
helm install mapfs-csi oci://registry-1.docker.io/wyflow/mapfs-csi-chart --version 2.3 \ --set license.email=you@example.com \ --set license.token=<token-from-mapfs-portal>On AWS EKS with Graviton (arm64) nodes, also add:
--set nodeSelector."kubernetes\.io/arch"=arm64 -
Check status:
kubectl -n kube-system get pod -l app=mapfs-csi-controller kubectl -n kube-system get pod -l app=mapfs-csi-node
To upgrade to a newer version later:
helm upgrade mapfs-csi oci://registry-1.docker.io/wyflow/mapfs-csi-chart --version <new-version>
Phase 2: Configure a storage backend
Repeat this phase for every bucket/cloud you want to expose to the
cluster — it's independent of Phase 1, and doesn't require reinstalling or
upgrading the driver.
-
Create the cloud credentials Secret:
kubectl create secret generic mapfs-cloud-creds -n kube-system \ --from-literal=access_key=<AccessKeyID> \ --from-literal=secret_key=<SecretAccessKey>For Azure Blob Storage, use
connectionStringinstead of the two fields
above — see the comments incloud-secret.yaml. -
Edit
storageclass.yamland fill in at leastcloudandbucket(some
clouds also needregion/endpoint/accountId/ociNamespace— see the
comments in the file for details), then apply it:kubectl apply -f storageclass.yaml
Usage examples
Dynamic provisioning (recommended)
Once storageclass.yaml is applied, just create a PVC — the PV is created
automatically by csi-provisioner:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 1Ti
storageClassName: mapfs-s3 # must match metadata.name in storageclass.yaml
Static provisioning
To point at an existing bucket/volume manually instead of using dynamic
provisioning, start from example/pv.yaml + example/pvc.yaml: replace the
placeholders __PV_NAME__, __VOLUME_NAME__, __CLOUD__,
__BUCKET_NAME__, etc. with real values, then kubectl apply -f.
Azure Blob Storage
Use example/azure-pv.yaml (static) or example/azure-storageclass.yaml
(dynamic) instead of the S3 versions — credentials use connectionString
instead of access_key/secret_key.
Self-hosted MinIO / other S3-compatible storage
See example/minio-pv.yaml (static) or example/minio-storageclass.yaml +
example/minio-dynamic-pvc.yaml (dynamic) — set cloud to s3compatible
and fill in endpoint.
Deploying to AWS EKS
If the target cluster is EKS with Graviton (arm64) nodes, add
--set nodeSelector."kubernetes\.io/arch"=arm64 to the helm install
command in Phase 1 — the chart pins both the controller Deployment and the
node DaemonSet to arm64 nodes. The rest of the flow (Phase 2) is the same;
eks/storageclass.yaml and eks/cloud-secret.yaml are examples pointed at
real AWS S3. eks/test-pods.yaml and eks/test-pod-same-node.yaml are
optional, advanced examples that verify cross-node/same-node RWX mounting
behavior.
Uninstalling
Removing a storage backend (Phase 2)
kubectl delete -f storageclass.yaml
kubectl -n kube-system delete secret mapfs-cloud-creds
A StorageClass/PV with reclaimPolicy: Retain never deletes data in the
cloud bucket — deleting the PV only removes the Kubernetes record.
Uninstalling the driver (Phase 1)
Only do this once no storage backend depends on it anymore.
helm uninstall mapfs-csi