PersistentVolume
PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 提供 了方便的持久化卷:PV 提供网络存储资源,而 PVC 请求存储资源。这样,设置持久化的工作流包括配置底层文件系统或者云数据卷、创建持久性数据卷、最后创建 PVC 来将 Pod 跟数据卷关联起来。PV 和 PVC 可以将 pod 和数据卷解耦,pod 不需要知道确切的文件系统或者支持它的持久化引擎。
Volume 的生命周期包括 5 个阶段
- 1.Provisioning,即 PV 的创建,可以 直接创建 PV(静态方式),也可以使用 StorageClass 动态创建
- 2.Binding,将 PV 分配给 PVC
- 3.Using,Pod 通过 PVC 使用该 Volume,并可以通过准入控制 StorageObjectInUseProtection(1.9 及以前版本为 PVCProtection)阻止删除正在使用的 PVC
- 4.Releasing,Pod 释放 Volume 并删除 PVC
- 5.Reclaiming,回收 PV,可以保留 PV 以便下次使用,也可以直接从云存储中删除
- 6.Deleting,删除 PV 并从云存储中删除后段存储
根据这 5 个阶段,Volume 的状态有以下 4 种
- Available:可用
- Bound:已经分配给 PVC
- Released:PVC 解绑但还未执行回收策略
- Failed:发生错误
Kubernetes 版本 | PV/PVC 版本 | StorageClass 版本 |
---|---|---|
v1.5-v1.6 | core/v1 | storage.k8s.io/v1beta1 |
v1.7+ | core/v1 | storage.k8s.io/v1 |
PersistentVolume(PV)是集群之中的一块网络存储。跟 Node 一样,也是集群的资源。PV 跟 Volume (卷) 类似,不过会有独立于 Pod 的生命周期。比如一个 NFS 的 PV 可以定义为
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /tmp
server: 172.17.0.2
PV 的访问模式(accessModes)有三种:
- ReadWriteOnce(RWO):是最基本的方式,可读可写,但只支持被单个节点挂载。
- ReadOnlyMany(ROX):可以以只读的方式被多个节点挂载。
- ReadWriteMany(RWX):这种存储可以以读写的方式被多个节点共享。不是每一种存储都支持这三种方式,像共享方式,目前支持的还比较少,比较常用的是 NFS。在 PVC 绑定 PV 时通常根据两个条件来绑定,一个是存储的大小,另一个就是访问模式。
PV 的回收策略(persistentVolumeReclaimPolicy,即 PVC 释放卷的时候 PV 该如何操作)也有三种
- Retain,不清理, 保留 Volume(需要手动清理)
- Recycle,删除数据,即
rm -rf /thevolume/*
(只有 NFS 和 HostPath 支持) - Delete,删除存储资源,比如删除 AWS EBS 卷(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)
上面通过手动的方式创建了一个 NFS Volume,这在管理很多 Volume 的时候不太方便。Kubernetes 还提供了 StorageClass 来动态创建 PV,不仅节省了管理员的时间,还可以封装不同类型的存储供 PVC 选用。
StorageClass 包括四个部分
- provisioner:指定 Volume 插件的类型,包括内置插件(如
kubernetes.io/glusterfs
)和外部插件(如 external-storage 提供的ceph.com/cephfs
)。 - mountOptions:指定挂载选项,当 PV 不支持指定的选项时会直接失败。比如 NFS 支持
hard
和nfsvers=4.1
等选项。 - parameters:指定 provisioner 的选项,比如
kubernetes.io/aws-ebs
支持type
、zone
、iopsPerGB
等参数。 - reclaimPolicy:指定回收策略,同 PV 的回收策略。
在使用 PVC 时,可以通过
DefaultStorageClass
准入控制设置默认 StorageClass, 即给未设置 storageClassName 的 PVC 自动添加默认的 StorageClass。而默认的 StorageClass 带有 annotation storageclass.kubernetes.io/is-default-class=true
。Volume Plugin | Internal Provisioner | Config Example |
---|---|---|
AWSElasticBlockStore | ✓ | |
AzureFile | ✓ | |
AzureDisk | ✓ | |
CephFS | - | - |
Cinder | ✓ |