概述
PV 作为存储资源,主要包括存储能力、访问模式、存储类型、回收策略、后端存储类型等信息的设置。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
nfs:
path: /tmp
server: 172.17.0.2
运行结果
[root@master1 pv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 5Gi RWO Recycle Available slow 12s
PV 关键配置参数
-
存储能力:描述存储设备具备的能力,目前只有存储空间设置(存储容量)
-
存储卷模式:包括可选的
Filesystem和Block,默认为FilesystemapiVersion: v1 kind: PersistentVolume metadata: name: block-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain volumeMode: Block fc: targetWWNs: ["50060e801049cfd1"] lun: 0 readOnly: false -
访问模式
- ReadWriteOnce(RWO):读写权限,并且只能被单个Node挂载
- ReadOnlyMany(ROX):只读权限,允许被多个Node挂载
- ReadWriteMany(RWX):读写权限,允许被多个Node挂载
-
存储类别:
storageClassName参数指定一个StorageClass资源对象的名称,具有特定类别的PV只能与请求了该类别的PVC进行绑定。未设置类别的PV只能与不请求任何类别的PVC进行绑定 -
回收策略:通过
persistentVolumeReclaimPolicy设置- 保留:保留数据,需要手动删除
- 回收空间:简单清除文件操作
- 删除:与PV相连的后端存储完成Volume的删除操作
-
挂载参数:在将
PV挂载到Node上时,根据后端的存储特点,设置额外的挂载参数,通过mountOptions进行设置apiVersion: "v1" kind: "PersistentVolume" metadata: name: gce-disk-1 spec: capacity: storage: "10Gi" accessModes: - "ReadWriteOnce" mountOptions: - hard - nolock - nfsvers=3 gcePersistentDisk: fsType: "ext4" pdName: "gce-disk-1"运行结果
[root@master1 pv]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE gce-disk-1 10Gi RWO Retain Available 6s -
节点亲和性:
PV可以设置节点亲和性来限制只能通过某些Node访问Volume,可以在PV定义中的nodeAffinity字段进行设置,使用这些Volume的Pod将被调度到满足条件的node上apiVersion: v1 kind: PersistentVolume metadata: name: example-local-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /mnt/disks/ssd1 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - my-node运行结果
[root@master1 pv]# kubectl describe pv example-local-pv Name: example-local-pv Labels: <none> Annotations: <none> Finalizers: [kubernetes.io/pv-protection] StorageClass: local-storage Status: Available Claim: Reclaim Policy: Delete Access Modes: RWO VolumeMode: Filesystem Capacity: 5Gi Node Affinity: Required Terms: Term 0: kubernetes.io/hostname in [my-node] Message: Source: Type: LocalVolume (a persistent volume backed by local storage on a node) Path: /mnt/disks/ssd1 Events: <none> You have new mail in /var/spool/mail/root
PV 生命周期的各个阶段
某个PV在生命周期中可能处于以下4个阶段之一
Available:可用状态,还未与某个PVC绑定Bound:已与某个PVC绑定Released:绑定的PVC已经删除,资源已经释放,但没有被集群收回Failed:自动资源回收失败
结语
Kubernetes 的PV机制通过解耦存储的配置与消费,不仅提高了存储资源的灵活性和利用率,还极大地简化了有状态应用在容器环境中的部署与管理,是构建稳定、可扩展的云原生应用不可或缺的一部分。