数据文件存储是非常常见的需求,在kubernetes中,由于容器中的文件是短暂的,当容器崩溃时,虽然会重新启动容器,但是容器运行时产生的数据文件将会丢失,于是抽象出了Volume的概念用于解决数据存储的问题。
1. Volume的类型
Volume支持的卷的类型有很多种,常用的卷有:
NFS
RDB
CephFS
GlusterFS
HostPath:将节点上的文件或目录挂载到Pod上,用于实现Pod和宿主机之间的数据共享
还有一些kubernetes独有的类型:
ConfigMap:用于存储配置文件
Secret:用于存储敏感数据
EmptyDir:用于一个Pod内多个容器的数据共享
PersistentVolumeClaim:对PersistentVolume的申请
存储的分类:
文件存储:一些数据可能需要被多个节点使用,比如用户的头像、用户上传的文件等,实现方式: NFS、 NAS、 FTP、 CephFS等。
块存储:一些数据只能被一个节点使用,或者是需要将一块裸盘整个挂载使用,比如数据库、 Redis等,实现方式: Ceph、 GlusterFS、公有云。
对象存储:由程序代码直接实现的一种存储方式,云原生应用无状态化常用的实现方式,实现方式:一般是符合S3协议的云存储,比如AWS的S3存储、 Minio、七牛云等。
2. PersistentVolume
1. PV的回收策略
Retain:保留,该策略允许手动回收资源,当删除PVC时, PV仍然存在, PV被视为已释放,管理员可以手动回收卷。
Recycle:回收,如果Volume插件支持, Recycle策略会对卷执行rm -rf清理该PV,并使其可用于下一个新的PVC,但是本策略将来会被弃用,目前只有NFS和HostPath支持该策略。
Delete:删除,如果Volume插件支持,删除PVC时会同时删除PV,动态卷默认为Delete,目前支持Delete的存储后端包括AWS EBS,、GCEPD,、Azure Disk、OpenStack Cinder等。
2. PV的访问策略
ReadWriteOnce:可以被单节点以读写模式挂载,命令行中可以被缩写为RWO。
ReadOnlyMany:可以被多个节点以只读模式挂载,命令行中可以被缩写为ROX。
ReadWriteMany:可以被多个节点以读写模式挂载,命令行中可以被缩写为RWX。
ReadWriteOncePod :只允许被单个Pod访问,需要K8s 1.22+以上版本,并且是CSI创建的PV才可使用,命令中可以被缩写为RWOP。
虽然创建PV时可以指定不同的访问策略,但是也要后端的存储支持才行。
注意:PV目前没有Namespace隔离,不需要指定命名空间,在任意命名空间下创建的PV均可在其他Namespace使用。
3. PV的状态
Available:可用, 没有被PVC绑定的空闲资源。
Bound:已绑定, 已经被PVC绑定。
Released:已释放, PVC被删除, 但是资源还未被重新使用。
Failed:失败, 自动回收失败。
3. PersistenVolumeClaim
由kubernetes管理员提前创建PV,PVC是其他技术人员在kubernetes上对存储的申请,它可以表明一个程序需要用到什么样的后端存储、多大的空间以及以什么模式访问进行挂载。
说明:PVC和PV进行绑定的前提条件是一些参数必须匹配,比如accessModes、storageClassName、volumeMode都需必须相同,并且PVC的storage需要小于等于PV的storage配置。