前言
根据应用本身是否需要持久存储数据,以及某一次请求跟此前的请求时间是否有关联性,可以将应用分为:有状态要存储、有状态不要存储、无状态要存储、无状态不要存储;
大多数有状态应用或者跟数据存储服务相关的应用,都需要持久存储数据;
把pod内部的某一目录和宿主机节点本地的某一目录(存储卷)建立关联映射关系;
注意:存储卷属于pod,不属于容器,pod内的其他所有容器都是共享基础架构容器pause的存储卷和网络名称空间等;
一、emptyDir
emptyDir:存储目录随着pod的删除或者消亡而删除或消亡,可以按需创建,起到临时目录或者缓存的效果;——pod级持久化存储;
emptyDir存储使用示例扩展:
gitRepo,本质还是emptyDir,只是从远端的Git中克隆一份代码到本地存储空间,之后远端的Git和本地存储空间再无关联关系;
使用存储卷的步骤:
1,在pod上定义一个Volume;在spec下面建立一个Volume,如pods.spec.volumes.emptyDir;
2,在container中挂载到pod对应的Volume中,即pods.spec.containers.volumeMounts;
二、HostPath
hostpath:主机路径,将pod所在节点之上的,但是在名称空间之外的文件系统某一目录与pod所定义的目录建立关联关系,在pod被删除时,该存储卷依然存在,但不支持跨节点重新调度;——节点级持久化存储;
示例如下:
三、NFS
NFS:(监听2049端口)
需要先在提供NFS的服务器或者存储介质下载并安装NFS,并完成相关步骤,具体如下:
- 下载NFS:yum install nfs-utils -y
- 创建共享目录:mkdir /data/nfs -pv
- 服务暴露:vim /etc/exports
- 启动服务:systemctl start nfs
其他常识:查看服务器节点域名解析情况:cat /etc/hosts
示例如下:
注意:NFS并不是分布式存储,如果作为NFS的存储介质宕机,数据也将丢失,因此建议大家使用分布式存储,如自建的GlusterFS(需要结合Heketi使用)、Ceph(包含RBD和FS两种,提供的restful接口,可以直接被kubernetes所使用),,或者带有副本的呢过冗余能力的云存储;
四、其他
网络共享存储:
SAN:FC-SAN、IP-SAN、iSCSI等;
NAS:NFS、cifs等
分布式存储:
GlusterFS、Ceph-RBD(块)、CephFS(文件)等;
云存储:(仅针对Kubernetes托管在某一公有云之上的场景)
阿里云OSS、亚马逊云的EBS、Azure Disk、gcePersistentDisk、OpenStack Cinder等等;
五、PV和PVC
PV和PVC是一一绑定关系,一旦某个PV被某个PVC占用,则显示bound状态;但是一个PVC可以被多个pod所访问,具体看PVC的accessModes;
注意:PV是集群级别的资源,不属于某个名称空间;但是PVC是属于名称空间级别的资源,存储在etcd(存储API-server状态)当中,跟节点没有关系;
Access Modes
- RWO - ReadWriteOnce
- ROX - ReadOnlyMany
- RWX - ReadWriteMany
- RWOP - ReadWriteOncePod
不同角色的职责划分如下图所示:
注意:
这里,PV和PVC是需要由不同角色提前准备好和创建好的,而且PV需要满足PVC的各种要求,比如访问模式,容量大小等等,否则就会一直pending下去直到有符合条件的PV被创建才能running起来,,为了解决这个问题,即引入了存储资源的动态供给。
六、StorageClass
StorageClass,用于提供抽象PV存储服务,满足PV存储的动态供给;
根据自定义的任意维度进行分类,比如可以按照Ceph、地理位置、价格等均可;
存储设备需要支持restful 风格的接口,NFS不支持,Ceph本身就具备,可以根据PVC的请求动态生成符合要求的PV供其绑定使用;
其他:GlusterFS,需要结合Heketi才能使用;