一、概念介绍
PV 和 PVC 的实现原理
-
PV:描述一个具体的 Volume 属性,比如 Volume 的类型、挂载目录、远程存储服务器地址等
-
PVC:描述 Pod 想要使用的持久化属性,比如存储大小、读写权限等
-
StorageClass:充当 PV 的模板,自动为 PVC 创建 PV
通常在企业中,Volume是由存储系统的管理员来维护,他们来提供pv,pv具有持久性,生命周期独立于Pod;
Pod则是由应用的开发人员来维护,如果要进行一卷挂载,那么就写一个pvc来消费pv就可以了,K8s会查找并提供满足条件的pv。
有了pvc,我们在K8s进行卷挂载就只需要考虑要多少容量了,而不用关心真正的空间是用什么存储系统做的等一些底层细节信息,pv这些只有存储管理员才应用去关心它。
二、持久化卷
持久化卷声明的保护
PVC 保护的目的是确保由 pod 正在使用的 PVC 不会从系统中移除,因为如果被移除的话可能会导致数据丢失
# 注意 :当 pod 状态为 “pending” 并且 Pod 已经分配给节点 或者 Pod 为 “running” 状态时,pvc 处于活动状态。
当启用PVC 保护 alpha 功能时,如果用户删除了一个 pod 正在使用的 PVC,则该 PVC 不会被立即删除。PVC 的删除将被推迟,直到 PVC 不再被任何 pod 使用。
持久化卷类型
PersistentVolume 类型以插件形式实现。Kubernetes 目前支持以下插件类型:
GCEPersistentDisk、AWSElasticBlockStore、AzureFile、AzureDisk、FC(Fibre Channel)、FlexVolume、Flocker、NFS、iSCSI、RBD、(Ceph Block Device)、CephFS、Cinder、(OpenStack block storage)、Glusterfs、VsphereVolume、Quobyte、Volumes、HostPath等等**
持久卷演示代码:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0001
spec:
capacity:
storage: 5Gi # 其存储容量为 5Gi
volumeMode: Filesystem # 采用文件系统模式
accessModes:
- ReadWriteOnce # 访问模式为 `ReadWriteOnce`,意味着它可以被单个节点挂载为读写模式。
persistentVolumeReclaimPolicy: Recycle # 持久卷释放后的回收策略为 `Recycle`,即删除持久卷并回收其资源。
storageClassName: slow # 它关联了一个名为 `slow` 的存储类(storage class)。
mountOptions: # 挂载选项
- hard
- nfsvers=4.1
nfs: # NFS 部分指定了 NFS 卷的详细信息
path: /tmp
server: 192.168.8.201
三、访问模式
PV 访问模式
PersistentVolume 可以以资源提供者支持的任何方式挂载到主机上。如下表所示,供应商具有不同的功能,每个 PV 的访问模式都将被设置为该卷支持的特定模式。例如,NFS 可以支持多个读/写客户端,但特定的 NFS PV 可能以只读方式导出到服务器上。每个 PV 都有一套自己的用来描述特定功能的访问模式。
- ReadWriteOnce——该卷可以被单个节点以读/写模式挂载
- ReadOnlyMany——该卷可以被多个节点以只读模式挂载
- ReadWriteMany——该卷可以被多个节点以读/写模式挂载
在命令行中,访问模式缩写为:
- RWO - ReadWriteOnce
- ROX - ReadOnlyMany
- RWX - ReadWriteMany
# !注意 :一个卷一次只能使用一种访问模式进行挂载,即使它支持很多访问模式,GCEPersistentDisk 可以由单个节点做为 ReadWriteOnce 模式挂载,或者由多个节点以 ReadOnlyMany 模式挂载,但是不能同时挂载。
Volume 插件 | ReadWriteOnce | ReadOnlyMany | ReadWriteMany |
---|---|---|---|
AWSElasticBlockStoreAWSElasticBlockStore | ✓ | - | - |
AzureFile | ✓ | ✓ | ✓ |
AzureDisk | ✓ | - | - |
CephFS | ✓ | ✓ | ✓ |
Cinder | ✓ | - | - |
FC | ✓ | ✓ | - |
FlexVolume | ✓ | ✓ | - |
Flocker | ✓ | - | - |
GCEPersistentDisk | ✓ | ✓ | - |
Glusterfs | ✓ | ✓ | ✓ |
HostPath | ✓ | - | - |
iSCSI | ✓ | ✓ | - |
PhotonPersistentDisk | ✓ | - | - |
Quobyte | ✓ | ✓ | ✓ |
NFS | ✓ | ✓ | ✓ |
RBD | ✓ | ✓ | - |
VsphereVolume | ✓ | - | - (当 pod 并列时有效) |
PortworxVolume | ✓ | - | ✓ |
ScaleIO | ✓ | ✓ | - |
ScaleIO | ✓ | - | - |
四、回收策略
Retain(保留)——手动回收
Recycle(回收)——基本擦除( rm -rf /thevolume/* )【已被废弃】
Delete(删除)——关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)将被删除
五、状态
卷可以处于以下的某种状态:
Available(可用)——一块空闲资源还没有被任何声明绑定
Bound(已绑定)——卷已经被声明绑定
Released(已释放)——声明被删除,但是资源还未被集群重新声明
Failed(失败)——该卷的自动回收失败
命令行会显示绑定到 PV 的 PVC 的名称