Control Volume Placement Using FlashArray Pods
Use FlashArray pods to control where PX-CSI provisions volumes when multiple FlashArrays are connected to your Kubernetes cluster. This feature lets you direct volumes to specific arrays based on performance tiers, geographic location, or other organizational requirements.
This feature requires Purity//FA version 6.6.11 or later.
Use FlashArray pod-based volume placement when:
- You have multiple FlashArrays connected to your cluster.
- You need to provision volumes on specific arrays (such as performance or capacity tiers).
- You want to organize volumes by workload type, department, or geographic location.
- You are implementing secure multi-tenancy with FlashArray realms and pods.
How it works
When you specify pure_fa_pod_name in a StorageClass:
- PX-CSI receives a volume provisioning request.
- PX-CSI searches for the specified pod name across all connected FlashArrays.
- After PX-CSI finds the pod, it provisions the volume inside that pod on the FlashArray where the pod exists.
- PX-CSI names the volume using the convention:
<pod-name>::px_<cluster-uuid-prefix>-pvc-<pvc-uuid>
If the same pod name exists on multiple FlashArrays, PX-CSI will schedule volumes on any of those arrays. To target a specific FlashArray, make sure the pod name is unique to that array.
Example use case
The following example shows how to separate high-performance and capacity-optimized workloads across different FlashArrays.
Scenario: You need to provision storage for two different workload types:
- Database workload: Requires high IOPS and low latency for transactional operations
- Backup workload: Requires large capacity for storing backups, where performance is less critical
Environment: Four FlashArrays: two high-performance arrays and two capacity-optimized arrays.
Configuration:
- Create a pod named
performance-podon both high-performance arrays. - Create a pod named
capacity-podon both capacity-optimized arrays. - Create a
performance-array-scStorageClass withpure_fa_pod_name: "performance-pod"for database volumes. - Create a
capacity-array-scStorageClass withpure_fa_pod_name: "capacity-pod"for backup volumes.
Result:
- Database volumes (using
performance-array-sc) are provisioned on high-performance arrays with IOPS and bandwidth limits. - Backup volumes (using
capacity-array-sc) are provisioned on capacity-optimized arrays without performance constraints.
Create FlashArray pods
Before configuring StorageClasses, create the required pods on your FlashArrays.
- FlashArray without secure multi-tenancy
- FlashArray with secure multi-tenancy
Create a pod on each FlashArray where you want to provision volumes:
purepod create <pod-name>
Example:
# Create performance pod on high-performance arrays
purepod create performance-pod
# Create capacity pod on capacity-optimized arrays
purepod create capacity-pod
If using FlashArray realms for secure multi-tenancy, create pods within the realm:
purepod create <realm-name>::<pod-name>
Example:
# Create performance pod within realm on high-performance arrays
purepod create realm1::performance-pod
# Create capacity pod within realm on capacity-optimized arrays
purepod create realm1::capacity-pod
Configure StorageClass with pod placement
Create StorageClass YAML manifests that specify the FlashArray pod name using the pure_fa_pod_name parameter.
In this example, you create two StorageClasses:
- Performance StorageClass: For database workloads requiring high IOPS (50,000) and bandwidth (10G)
- Capacity StorageClass: For backup workloads where capacity is more important than performance
- FlashArray without secure multi-tenancy
- FlashArray with secure multi-tenancy
-
Create StorageClass YAML manifests for different performance tiers:
performance-sc.yamlkind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: performance-array-sc
provisioner: pxd.portworx.com
parameters:
backend: "pure_block"
pure_fa_pod_name: "performance-pod"
max_iops: "50000"
max_bandwidth: "10G"
volumeBindingMode: Immediatecapacity-sc.yamlkind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: capacity-array-sc
provisioner: pxd.portworx.com
parameters:
backend: "pure_block"
pure_fa_pod_name: "capacity-pod"
volumeBindingMode: ImmediatetipFor a complete list of
StorageClassparameters, see the StorageClass reference. -
Apply the StorageClasses:
kubectl apply -f performance-sc.yaml -f capacity-sc.yamlstorageclass.storage.k8s.io/performance-array-sc created
storageclass.storage.k8s.io/capacity-array-sc created
-
Create StorageClass YAML manifests for different performance tiers:
performance-sc.yamlkind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: performance-array-sc
provisioner: pxd.portworx.com
parameters:
backend: "pure_block"
pure_fa_pod_name: "realm1::performance-pod"
max_iops: "50000"
max_bandwidth: "10G"
volumeBindingMode: Immediatecapacity-sc.yamlkind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: capacity-array-sc
provisioner: pxd.portworx.com
parameters:
backend: "pure_block"
pure_fa_pod_name: "realm1::capacity-pod"
volumeBindingMode: ImmediatetipFor a complete list of
StorageClassparameters, see the StorageClass reference. -
Apply the StorageClasses:
kubectl apply -f performance-sc.yaml -f capacity-sc.yamlstorageclass.storage.k8s.io/performance-array-sc created
storageclass.storage.k8s.io/capacity-array-sc created
Create PVCs using pod-based StorageClasses
Create PVCs that reference the appropriate StorageClass with pod placement. The configuration is the same for both standard and multi-tenancy deployments.
In this example, you create two PVCs:
- Database PVC: 100Gi volume on high-performance arrays for database workloads
- Backup PVC: 1Ti volume on capacity-optimized arrays for backup storage
-
Create PVC YAML manifests:
database-pvc.yamlkind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: database-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
storageClassName: performance-array-sc # Uses performance-podbackup-pvc.yamlkind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: backup-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Ti
storageClassName: capacity-array-sc # Uses capacity-podtipFor a complete list of
PersistentVolumeClaimfields and annotations, see the PersistentVolumeClaim reference. -
Apply the PVCs:
kubectl apply -f database-pvc.yaml -f backup-pvc.yamlpersistentvolumeclaim/database-claim created
persistentvolumeclaim/backup-claim created
Verify volume placement
After creating a PVC, verify that the volume was provisioned in the correct FlashArray pod.
- FlashArray without secure multi-tenancy
- FlashArray with secure multi-tenancy
-
Get the PersistentVolume name:
kubectl get pvc database-claimNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
database-claim Bound pvc-a1b2c3d4-xxxx-xxxx-xxxx-105a73740493 100Gi RWO performance-array-sc 2m -
Find the PureVolume associated with your PVC:
kubectl get pvol -n portworx | grep pvc-a1b2c3d4xxxxxxxx-xxxx-xxxx-xxxx-d7e4a5255d7d px_20e4c7e1-pvc-a1b2c3d4-xxxx-xxxx-xxxx-105a73740493 FlashArray 2m -
Get the detailed information for the specific PureVolume:
kubectl get pvol xxxxxxxx-xxxx-xxxx-xxxx-d7e4a5255d7d -n portworx -o yamlapiVersion: storage.purestorage.com/v1alpha1
kind: PureVolume
metadata:
name: xxxxxxxx-xxxx-xxxx-xxxx-d7e4a5255d7d
namespace: portworx
spec:
storageBackends:
- id: 1b07343b-xxxx-xxxx-xxxx-8b5e8cdeb16c
...
volumeName: performance-pod::px_20e4c7e1-pvc-a1b2c3d4-xxxx-xxxx-xxxx-105a73740493Note the following information:
- volumeName: The full volume name on FlashArray, including the pod prefix (
performance-pod::px_20e4c7e1-...) - storageBackends.id: The FlashArray backend ID (e.g.,
1b07343b-xxxx-xxxx-xxxx-8b5e8cdeb16c). Use this ID to identify the FlashArray in the Pure Storage GUI.
- volumeName: The full volume name on FlashArray, including the pod prefix (
-
On the FlashArray, verify that the volume exists in the specified pod:
purevol list --pod performance-podThe volume name should appear with the pod prefix:
performance-pod::px_20e4c7e1-pvc-a1b2c3d4-xxxx-xxxx-xxxx-105a73740493
-
Get the PersistentVolume name:
kubectl get pvc database-claimNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
database-claim Bound pvc-a1b2c3d4-xxxx-xxxx-xxxx-105a73740493 100Gi RWO performance-array-sc 2m -
Find the PureVolume associated with your PVC:
kubectl get pvol -n portworx | grep pvc-a1b2c3d4xxxxxxxx-xxxx-xxxx-xxxx-d7e4a5255d7d px_20e4c7e1-pvc-a1b2c3d4-xxxx-xxxx-xxxx-105a73740493 FlashArray 2m -
Get the detailed information for the specific PureVolume:
kubectl get pvol xxxxxxxx-xxxx-xxxx-xxxx-d7e4a5255d7d -n portworx -o yamlapiVersion: storage.purestorage.com/v1alpha1
kind: PureVolume
metadata:
name: xxxxxxxx-xxxx-xxxx-xxxx-d7e4a5255d7d
namespace: portworx
spec:
storageBackends:
- id: 1b07343b-xxxx-xxxx-xxxx-8b5e8cdeb16c
...
volumeName: realm1::performance-pod::px_20e4c7e1-pvc-a1b2c3d4-xxxx-xxxx-xxxx-105a73740493Note the following information:
- volumeName: The full volume name on FlashArray, including the realm and pod prefix (
realm1::performance-pod::px_20e4c7e1-...) - storageBackends.id: The FlashArray backend ID (e.g.,
1b07343b-xxxx-xxxx-xxxx-8b5e8cdeb16c). Use this ID to identify the FlashArray in the Pure Storage GUI.
- volumeName: The full volume name on FlashArray, including the realm and pod prefix (
-
On the FlashArray, verify that the volume exists in the specified pod within the realm:
purevol list --pod realm1::performance-podThe volume name should appear with the realm and pod prefix:
realm1::performance-pod::px_20e4c7e1-pvc-a1b2c3d4-xxxx-xxxx-xxxx-105a73740493