一、为什么要有Volume?
容器中的磁盘文件是短暂的,对于在容器中运行的持久性应用程序来说,这会带来一些问题。首先,当容器崩溃时,Kubelet将重新启动它,但文件将丢失,而容器以干净状态开始。第二,在pod中一起运行容器时,通常需要在这些容器之间共享文件。Kubernetes的volume抽象解决了这两个问题。
二、介绍Volume
1. 有哪几种Volume类型?
根据数据是否持久保持可以分为持久卷(PersistentVolume) 和 普通卷(例如:emptyDir)
2. 什么是 PV(PersistentVolume)和 PVC(PersistentVolumeClaim)
管理存储与管理计算是一个截然不同的问题。K8S的PersistentVolume子系统为用户和管理员提供了一个API,该API从存储的使用方式中抽象出存储的详细信息。为此,我们引入了两种新的API资源:PersistentVolume和PersistentVolumeClaim。PV是集群中由管理员提供或使用存储类动态提供的一块存储。它是群集中的资源,就像节点是群集资源一样。PV和volumes一样是volume插件,但其生命周期独立于使用PV的任何一个pod。此API对象捕获存储实现的详细信息,包括NFS、iSCSI或特定于云提供程序的存储系统。PVC是用户存储的请求。它类似于一个豆荚。pods消耗节点资源,PVC消耗PV资源。pods可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以装载一次读/写或多次只读)。
3. 下面是各种PV的可设置访问模式(ReadWriteOnce:读写不能并发,ReadOnlyMany:都多并发,ReadWriteMany:读写多并发)
Volume Plugin | ReadWriteOnce | ReadOnlyMany | ReadWriteMany |
---|---|---|---|
AWSElasticBlockStore | ✓ | - | - |
AzureFile | ✓ | ✓ | ✓ |
AzureDisk | ✓ | - | - |
CephFS | ✓ | ✓ | ✓ |
Cinder | ✓ | - | - |
CSI | depends on the driver | depends on the driver | depends on the driver |
FC | ✓ | ✓ | - |
Flexvolume | ✓ | ✓ | depends on the driver |
Flocker | ✓ | - | - |
GCEPersistentDisk | ✓ | ✓ | - |
Glusterfs | ✓ | ✓ | ✓ |
HostPath | ✓ | - | - |
iSCSI | ✓ | ✓ | - |
Quobyte | ✓ | ✓ | ✓ |
NFS | ✓ | ✓ | ✓ |
RBD | ✓ | ✓ | - |
VsphereVolume | ✓ | - | - (works when pods are collocated) |
PortworxVolume | ✓ | - | ✓ |
ScaleIO | ✓ | ✓ | - |
StorageOS | ✓ |
4. PV的生命周期
创建PV有两种方式,静态和动态。所谓静态,是管理员手动创建一堆PV,组成一个PV池,供PVC来绑定。动态方式是通过一个叫Storage Class的对象由存储系统根据PVC的要求自动创建。一个PV创建完后状态会变成Available,等待被PVC绑定。一旦被PVC邦定,PV的状态会变成Bound,就可以被定义了相应PVC的Pod使用。Pod使用完后会释放PV,PV的状态变成Released。变成Released的PV会根据定义的回收策略做相应的回收工作。有三种回收策略,Retain、Delete和Recycle。Retain就是保留现场,K8S什么也不做,等待用户手动去处理PV里的数据,处理完后,再手动删除PV。Delete策略,K8S会自动删除该PV及里面的数据。Recycle方式,K8S会将PV里的数据删除,然后把PV的状态变成Available,又可以被新的PVC绑定使用。
在实际使用场景里,PV的创建和使用通常不是同一个人。这里有一个典型的应用场景:管理员创建一个PV池,开发人员创建Pod和PVC,PVC里定义了Pod所需存储的大小和访问模式,然后PVC会到PV池里自动匹配最合适的PV给Pod使用。
5. 为什么有StorageClass?
PV可以由存储系统动态创建,节省了管理员的时间,还有一个好处是可以封装不同类型的存储供PVC选用。在StorageClass出现以前,PVC绑定一个PV只能根据两个条件,一个是存储的大小,另一个是访问模式。在StorageClass出现后,等于增加了一个绑定维度。
6. 总结
K8S有两种存储卷:普通Volume和Persistent Volume。普通Volume在定义Pod的时候直接定义,PersistentVolume通过PersistentVolume Claim来动态绑定。PV可以手动创建,也可以通过StorageClass来动态创建。
三、参考:
https://kubernetes.io/docs/concepts/storage/volumes/#cephfs
https://blog.youkuaiyun.com/liukuan73/article/details/60089305