emptyDir存储卷
当pod被分配给节点
容器和容器之间进行共享存储
hostPath
nfs共享存储卷
NAS 专业的存储设备;一般是与NFS 搭配,然后共享出去
GFS 自己搭;CEPH(至少要9台) 第三方;NAS 第三方;
云端 oss s3 SLB LB CDN(加速缓存);AWS 外网,CDN可以加快访问
查看共享存储
showmount -e
挂载时记得要加ip
主机名要改为域名
设置域名解析
删除所有pod
kubectl delete pod --all
查看帮助
kubectl explain pod.spec.volumes
k8s 官网
验证数据是否保持持久化
PVC和PV
什么是PVC和PV
pv是磁盘;pvc是磁盘的请求;storage
节省资源和
当没有满足需求的pv时,就会报错
PVC的使用逻辑
storagesClass
动态pv:事先没有相关的存储资源,当有需求时会进行自动创建
PV和PVC之间的相互作用
k8s 支持存储插件的访问方式
NFS使用PV和PVC
pvc 写入数据到 pv 过程中,无法删除pvc、pv 回收资源;pod释放Volume后就能删除pvc了
例如:创建一个目录然后cd进去,打开新的窗口,删除这个目录,会发现因为占用无法删除
PV的状态(4种)
PV的生命周期
一个PV 从创建到销毁的过程:
回收策略
Retain 保留
Delete 删除
Recycle 回收;保留磁盘的功能,删除数据;
查看pv 定义的规格
定义存储类型
定义挂载卷路径
定义服务器名称,访问模型
满足pvc的大小和规则,去匹配pv;会优先匹配大小接近(>=)的pv;小的不会匹配,大的可以匹配但多余的会被浪费
2、定义PV
3、定义PVC
前端后端打包工具 ?
4、访问测试
实现 NFS 的动态 PV 创建
pod 设置pvc,pvc通过api接口k8s 现在通过api 调用pv 还需要经过第三方插件才行,高并发时就不行了,
pod:放应用、微服务;对接pvc名称
pvc:需求的请求(磁盘的请求),通过restful == API
restful:存储原生不支持k8s,所以需要安装第三发插件;例:nfs存储插件;
restful通过 连接插件 调用pv
pv:相当于磁盘的分区
外部的插件都需要创建用户并授权才能使用
用户授权
xxxxx
存储挂载目录
创建PVC和Pod 测试
总结
k8s 存储卷 volume
PV-PVC
emptyDir 可以实现pod 中容器之间共享数据,但是存储卷之间不能做持久化数据,并且随着pod生命周期的结束emptyDir一起删除
hostOath
可以实现持久化存储,使用node节点的目录或文件挂载到容器,但是存储空间会受到node节点单机限制;当node节点故障时,数据会丢失;pod跨节点不能共享数据
nfs
nfs:可以实现持久化存储,使用nfs 将存储设备空间挂载到容器中,pod可以跨node节点来共享数据
怎么从本机拉取其他主机的文件
PV k8s 指定的存储设备空间中,创建持久化的存储
PVC 是对pv 存储资源请求和绑定
StorageClass sc类型(存储类型),联动存储插件,动态创建PV 资源
静态PV的使用:
准备好存储设备和共享目录;创建pv资源,进行配置设置存储类型、访问模式、存储能力的大小
创建pvc资源,并配置请求pv资源的访问模式和存储的大小;
pvc 与 pv 进行一对一绑定
在pv 访问模式中必须支持pvc 请求的访问模式
请求的存储空间优先选择相等存储大小的pv资源;当没有匹配的时,会选择大于请求的pv存储资源来绑定(大于pvc的部分会被浪费)
创建 pod 资源 存储类设置 PeristenVolumeClaim 在容器配置存储挂载
动态 storage
StorageClass 动态创建 pv 的过程
StorageClass + nfs-client-provistioner
准备 NFS 共享服务器和共享目录
创建sa 服务账号,并进行RBAC 资源操作权限的授权
创建 nfs-client-provistioner 存储插件(以Pod 形式运行的)配置中关联sa服务账号,使存储插件
获得相关资源的操作权限
创建StorageClass 资源,配置中关联存储插件的名称配置
#以上过程完成后,以后只需要创建PV资源就可以动态生成相关的PV资源
创建PVC资源,配置中关联 StorageClass 资源的名称,此时会在 NFS 服务器上生成相关的pv共享目录,目录名 ${namespace} ${PVCname} ${PVname} 格式命名
创建pod资源、存储类型,设置成 PersistentVolumeClaim,在容器中配置存储挂载即可