PersistentVolumes, PersistentVolumeClaims, and StorageClasses
hostPath volumes are used for persistent storage. However, such volumes are node-specific. Data written into hostPath volumes may be different after a node restart.
If you want to read the previously written data after a pod is rebuilt and scheduled again, you can count on network storage. Typically, a cloud vendor provides at least three classes of network storage: block, file, and object storage. Kubernetes decouples how storage is provided from how it is consumed by introducing two API objects: PersistentVolume (PV) and PersistentVolumeClaim (PVC). You only need to request the storage resources you want, without being exposed to the details of how they are implemented.
- A PV describes a persistent data storage volume. It defines a directory for persistent storage on a host machine, for example, a mount directory of a network file system (NFS).
- A PVC describes the attributes of the PV that a pod wants to use, such as the volume capacity and read/write permissions.
To allow a pod to use a PV, the Kubernetes cluster administrator needs to configure a network StorageClass and provides PV descriptors to Kubernetes. You only need to create a PVC and bind it with the volumes in the pod so that you can store data. The following figure shows the interaction between a PV and PVC.
CSI
Kubernetes Container Storage Interface (CSI) can be used to develop plug-ins to support specific storage volumes. For example, there are everest-csi-controller and everest-csi-driver developed by CCE in the kube-system namespace in Namespace for Grouping Resources. With these drivers, you can use cloud storage services such as EVS, SFS, and OBS.
$ kubectl get po --namespace=kube-system NAME READY STATUS RESTARTS AGE everest-csi-controller-6d796fb9c5-v22df 2/2 Running 0 9m11s everest-csi-driver-snzrr 1/1 Running 0 12m everest-csi-driver-ttj28 1/1 Running 0 12m everest-csi-driver-wtrk6 1/1 Running 0 12m
PV
Each PV contains the specification and status of the volume. For example, a file system is created in SFS, with the file system ID 68e4a4fd-d759-444b-8265-20dc66c8c502 and the mount point sfs-nas01.cn-north-4b.myhuaweicloud.com:/share-96314776. To use this file system in CCE, create a PV to describe the volume, as shown in the following example:
apiVersion: v1 kind: PersistentVolume metadata: name: pv-example spec: accessModes: - ReadWriteMany # Read/write mode capacity: storage: 10Gi # PV capacity csi: driver: nas.csi.everest.io # Driver to be used fsType: nfs # StorageClass volumeAttributes: everest.io/share-export-location: sfs-nas01.cn-north-4b.myhuaweicloud.com:/share-96314776 # Mount point volumeHandle: 68e4a4fd-d759-444b-8265-20dc66c8c502 # Storage ID
Fields under csi in this example are dedicated used in CCE.
Next, create the PV and view its details.
$ kubectl create -f pv.yaml persistentvolume/pv-example created $ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-example 10Gi RWX Retain Available 4s
For RECLAIM POLICY, the value Retain indicates that the PV is retained after the PVC is released.
PVC
Each PVC can only be bound to one PV. The following is an example:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-example spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi # Storage capacity volumeName: pv-example # PV name
Create the PVC and view its details.
$ kubectl create -f pvc.yaml persistentvolumeclaim/pvc-example created $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-example Bound pv-example 10Gi RWX 9s
The command output shows that the PVC is in the Bound state and the value of VOLUME is pv-example, indicating that the PVC has been bound to a PV.
Then, check the PV status.
$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-example 10Gi RWX Retain Bound default/pvc-example 50s
The status of the PV is also Bound. The value of CLAIM is default/pvc-example, indicating that the PV is bound to the PVC named pvc-example in the default namespace.
Note that PVs are cluster-level resources and do not belong to any namespace, while PVCs are namespace-level resources. PVs can be bound to PVCs of any namespace. Therefore, the namespace name default followed by the PVC name is displayed under CLAIM in this example.
StorageClass
PVs and PVCs allow you to consume storage resources, but creating them is a complex process, especially the csi field in PVs. In addition, PVs and PVCs are generally managed by the cluster administrator. It is inconvenient for you to configure varying attributes for them.
To solve this problem, Kubernetes supports dynamic PV provisioning to create PVs automatically. The cluster administrator can deploy a PV provisioner and define StorageClasses. In this way, you can select a desired StorageClass when creating a PVC. The PVC then transfers the StorageClass to the PV provisioner, and the provisioner automatically creates a PV. In CCE, StorageClasses such as csi-disk, csi-nas, and csi-obs are supported. The storageClassName field is added to a PVC so that PVs can be automatically provisioned and underlying storage resources can be automatically created.
Run the following command to obtain the StorageClasses that CCE supports. You can use the CSI add-ons provided by CCE to customize StorageClasses, which function similarly as the default StorageClasses in CCE.
# kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d # StorageClass for EVS disks csi-disk-topology everest-csi-provisioner 17d # StorageClass for EVS disks with delayed association csi-nas everest-csi-provisioner 17d # StorageClass for SFS file systems csi-obs everest-csi-provisioner 17d # StorageClass for OBS buckets csi-sfsturbo everest-csi-provisioner 17d # StorageClass for SFS Turbo file systems
Run the following command to specify a StorageClass for creating a PVC:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-sfs-auto-example spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: csi-nas # StorageClass
PVCs cannot be directly created by using the StorageClass csi-sfsturbo. To use SFS Turbo storage, create an SFS Turbo file system and then a PV and PVC through a static PV. For details, see Using an Existing SFS Turbo File System Through a Static PV.
Run the following command to create the PVC and view the PVC and PV details:
$ kubectl create -f pvc2.yaml persistentvolumeclaim/pvc-sfs-auto-example created $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-sfs-auto-example Bound pvc-1f1c1812-f85f-41a6-a3b4-785d21063ff3 10Gi RWX csi-nas 29s $ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-1f1c1812-f85f-41a6-a3b4-785d21063ff3 10Gi RWO Delete Bound default/pvc-sfs-auto-example csi-nas 20s
The command output shows that after a StorageClass is specified, a PVC and a PV are created and bound.
After a StorageClass is specified, PVs can be automatically created and maintained. You only need to specify StorageClassName when creating a PVC, which greatly reduces the workload.
Using a PVC in a Pod
You can directly bind an available PVC to a volume in the pod template and then mount the volume to the pod, as shown in the following example. You can also directly create a PVC in a StatefulSet. For details, see StatefulSets.
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - image: nginx:alpine name: container-0 volumeMounts: - mountPath: /tmp # Mount path name: pvc-sfs-example restartPolicy: Always volumes: - name: pvc-sfs-example persistentVolumeClaim: claimName: pvc-example # PVC name
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.See the reply and handling status in My Cloud VOC.
For any further questions, feel free to contact us through the chatbot.
Chatbot