Available in VPC
This section provides examples of allocating volumes using various methods based on the CSI usage described in Block Storage CSI.
Assign multiple volumes to a pod
The following example creates 2 new block storage volumes, mounts them to a pod, and requests a PersistentVolumeClaim for each volume to be created:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-pod-1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: nks-block-storage
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-pod-2
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: nks-block-storage
---
kind: Pod
apiVersion: v1
metadata:
name: my-csi-app
spec:
containers:
- name: my-csi-app
image: busybox
volumeMounts:
- mountPath: "/data/pod-1/"
name: my-volume-1
- mountPath: "/data/pod-2/"
name: my-volume-2
command: [ "sleep", "1000000" ]
volumes:
- name: my-volume-1
persistentVolumeClaim:
claimName: csi-pod-1
- name: my-volume-2
persistentVolumeClaim:
claimName: csi-pod-2
Use PersistentVolume in a Deployment
The following example creates a PersistentVolumeClaim to request a new volume and mounts the created volume by specifying claimName in the Deployment template:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-deployment-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: nks-block-storage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-csi-app
spec:
selector:
matchLabels:
app: my-csi-app
replicas: 1
template:
metadata:
labels:
app: my-csi-app
spec:
containers:
- name: my-frontend
image: busybox
volumeMounts:
- mountPath: "/data"
name: my-volume
command: [ "sleep", "1000000" ]
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: csi-deployment-pvc
Use PersistentVolume in a StatefulSet
The following example defines volumeClaimTemplates in a StatefulSet to automatically create a new PersistentVolumeClaim for each replica:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-csi-app
spec:
serviceName: my-csi-app
selector:
matchLabels:
app: my-csi-app
replicas: 1
template:
metadata:
labels:
app: my-csi-app
spec:
containers:
- name: my-frontend
image: busybox
volumeMounts:
- mountPath: "/data"
name: my-volume
command: [ "sleep", "1000000" ]
volumeClaimTemplates:
- metadata:
name: my-volume
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
Assign volumes to a specific Zone
allowedTopologies is available in Kubernetes version 1.33 or later.
In a Multi Zone cluster environment, you can restrict the Zone where volumes are created using the allowedTopologies setting in StorageClass. You can create a block storage volume by specifying the allowed Zone in the YAML example below:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: nks-block-storage-zone
provisioner: blk.csi.ncloud.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: true
parameters:
type: CB1
allowedTopologies:
- matchLabelExpressions:
- key: topology.kubernetes.io/zone
values:
- "2"
- "3"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: block-csi-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: nks-block-storage-zone
---
kind: Pod
apiVersion: v1
metadata:
name: my-csi-app
spec:
containers:
- name: my-frontend
image: busybox
volumeMounts:
- mountPath: "/data"
name: my-volume
command: [ "sleep", "1000000" ]
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: block-csi-pvc
| Field | Description |
|---|---|
| allowedTopologies.matchLabelExpressions.key | |
| allowedTopologies.matchLabelExpressions.values |
To view available Zone numbers in the cluster, run the following command:
kubectl get nodes -L topology.kubernetes.io/zone
If volumeBindingMode is WaitForFirstConsumer, the Zone of the node where the pod is scheduled must be included in allowedTopologies. If no node exists in the specified Zone, the pod may remain in the Pending state.