一、k8spv介绍
k8spv全称为Kubernetes Persistent Volume,是Kubernetes(下文简称K8s)中用于访问持久化存储的一种API。在K8s中,容器的存储是临时性的,当容器退出时,所属的存储也会消失。针对于这种“一次性”的存储,K8s提供了Persistent Volume的机制,可以将数据从容器中分离出来,并将其持久化到其他的存储设备中。
Persistent Volume 可以看做是抽象出来的存储插槽,它代表了一段实际物理存储资源(比如磁盘卷或其他云存储),它提供了一种独立的、统一的方式来管理多个k8s pod中使用到的数据卷,从而使得存储管理变得更加的方便和高效。
二、k8spv的类型
在K8s中定义了多种不同类型的Persistent Volume,每种类型都有其特别的用途和实现方式。
1. HostPath类型
HostPath类型的Persistent Volume 直接使用节点上的文件系统来存储数据。这种存储方式适用于测试或独立的应用程序,但不建议在生产环境中使用。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-hostpath
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /usr/share/elasticsearch/data
2. GCEPersistentDisk类型
GCEPersistentDisk类型表示通过Google Compute Engine(GCE)提供的持久化磁盘,它可以用来存储K8s的数据卷,但只能适用于部署在GCE上的应用程序。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-gcepersistentdisk
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
gcePersistentDisk:
pdName: my-data-disk
fsType: ext4
3. NFS类型
NFS类型的Persistent Volume使用NFS协议实现共享存储,它可以让多个Pod之间共享同一组数据。NFS类型的Persistent Volume的PD需要先被正确指定。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /var/nfs/data
server: nfs.example.com
4. GlusterFS类型
GlusterFS类型的Persistent Volume使用GlusterFS作为卷的存储后端,这是一个开源的网络文件共享系统,它可以在多个节点之间共享数据。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-glusterfs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: glusterfs-cluster
path: myvolume
readOnly: false
5. iSCSI类型
iSCSI类型的 Persistent Volume可以连接到iSCSI Target,它是一种用TCP/IP协议传输SCSI指令的网络存储标准。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-iscsi
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
iscsi:
targetPortal: 10.0.0.10:3260
iqn: iqn.2001-04.com.example:storage.k8s.io
lun: 0
fsType: ext4
三、k8spv的使用
k8spv的使用分为三个步骤:
1. 创建 Persistent Volume
Persistent Volume 可以通过yaml文件的方式创建,如下所示:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /mnt/nfs
server: 192.168.0.1
2. 创建 Persistent Volume Claim
根据应用的需求,可以定义一个 Persistent Volume Claim (PVC) 来请求一个匹配的 PV。PVC可以通过yaml文件的方式定义,如下所示:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
3. 在Pod中使用 Persistent Volume
在Pod的定义文件中,需要使用Volume和VolumeMount两个参数来使用 Persistent Volume,其中Volume参数定义了存储卷的名称和类型,VolumeMount参数定义了容器访问该存储卷的路径。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: mycontainer
image: nginx
volumeMounts:
- mountPath: /data
name: my-pv-storage
volumes:
- name: my-pv-storage
persistentVolumeClaim:
claimName: my-pvc
四、k8spv的扩展
k8spv并不仅仅是上述这些已经被定义好的类型,通过扩展 k8spv,我们可以更好地满足我们的业务需求。
1. 自定义 Volume Plugin
如果你希望自己的存储后端被 K8s 支持,则需要自定义一个 Volume Plugin。通过Volume Plugin,可以使K8s支持新的存储卷类型。
2. StorageClass
StorageClass通过定义存储类型的参数,提供一个标准化的方式来管理PV。一个 StorageClass定义了一组参数,这些参数主要包括存储的类型、存储的大小等。通过 StorageClass,可以根据具体需求动态的使用 PV,从而更加灵活的管理数据。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: my-storage-class
provisioner: my-provisioner.com
parameters:
type: ssd
3. Volume Snapshot
Volume Snapshot 可以帮助用户创建存储卷的快照,用户可以基于此进行数据保护和恢复。通过Volume Snapshot,可以快速创建一个新的Persistent Volume,从而节省了很多比较耗时的工作。
apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshot
metadata:
name: my-snapshot
spec:
snapshotClassName: my-snapshot-class
source:
kind: PersistentVolumeClaim
name: my-pvc
五、总结
K8spv为我们提供了很好的数据存储管理方式,通过它我们可以更好地管理应用程序的状态数据,并保证数据不丢失。此外,由于K8s PV和PVC的使用非常简单,因此它也非常适合用于各种类型的企业级应用程序。
原创文章,作者:FNBVH,如若转载,请注明出处:https://www.506064.com/n/331567.html