K8S 存储卷
•Kubernetes中的Volume提供了在容器中挂载外部存储的能力
•Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts)两个信息后才可以使用相应的Volume
常用的数据卷:
•本地(hostPath,emptyDir)
•网络(NFS,Ceph,GlusterFS)
•公有云(AWS EBS)
•K8S资源(configmap,secret)
1.emptyDir卷:是一个临时存储卷,与Pod生命周期绑定一起,如果Pod删除了卷也会被删除。
应用场景:Pod中容器之间数据共享
进入read 容器查看/data/hello 文件
pod部署node节点上容器的存放目录位置,当pod 删掉后,对应的容器的存放目录也删掉了
2.hostPath卷:挂载Node文件系统(Pod所在节点)上文件或者目录到Pod中的容器。
应用场景:Pod中容器需要访问宿主机文件
将宿主机的/data(对应node节点存在这个目录)目录挂载到容器里面的/data目录下面;将宿主机的/ 目录挂载到容器里面的/opt 目录下面
进入到容器my-pod 查看/data 目录和/opt 目录,
并在容器/opt目录下面创建3.html 宿主机根目录下面也存在
网络存储卷:NFS
NFS卷:提供对NFS挂载支持,可以自动将NFS共享路径挂载到Pod中
NFS:是一个主流的文件共享服务器。
# yum install nfs-utils
# vi /etc/exports
/ifs/kubernetes *(rw,no_root_squash)
# mkdir -p /ifs/kubernetes
# systemctl start nfs
# systemctl enable nfs
注:每个Node上都要安装nfs-utils包
nfs 服务端安装在192.168.1.11,应该是单独一台共享服务器
node1上挂载并nfs 服务共享目录到/mnt,并创建文件,然后服务端都能看到文件
创建一个Ddeployment 资源,存储使用nfs 服务
使用Service 暴露Deployment
在nfs 服务端写一个nginx index.html
然后使用浏览器访问node ip+service暴露的端口
登录到pod 里面可以看到容器的挂载的目录的内容跟nfs 目录里面的内容一样
持久卷概念:
•PersistentVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理
•PersistentVolumeClaim(PVC):让用户不需要关心具体的Volume实现细节
PV 生命周期
AccessModes(访问模式):
AccessModes 是用来对PV 进行访问模式的设置,用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:
•ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
•ReadOnlyMany(ROX):只读权限,可以被多个节点挂载
•ReadWriteMany(RWX):读写权限,可以被多个节点挂载
RECLAIM POLICY(回收策略):
目前PV 支持的策略有三种:
•Retain(保留):保留数据,需要管理员手工清理数据
•Recycle(回收):清除PV 中的数据,效果相当于执行rm -rf /ifs/kuberneres/*
•Delete(删除):与PV 相连的后端存储同时删除
STATUS(状态):
一个PV 的生命周期中,可能会处于4中不同的阶段:
•Available(可用):表示可用状态,还未被任何PVC 绑定
•Bound(已绑定):表示PV 已经被PVC 绑定
•Released(已释放):PVC 被删除,但是资源还未被集群重新声明
•Failed(失败):表示该PV 的自动回收失败
1.创建3个pv 存储卷,分别为pv0001 pv0002 pv0003 存储大小分别为1G 2G 3G
创建一个Deployment 使用刚才创建的pv存储卷
查看pv 和pvc 就能看到二者的关系
进入容器 在nginx 网站根目录/usr/share/nginx/html 下创建pv01.txt ,然后再nfs 服务器的/ifs/kubernetes/pv0001 下面也能看到创建的文件;
如果创建pvc时没有对应的pv 卷能满足时,则pvc STATUS 状态栏一直显示Pending
PV 动态供给(StorageClass)
PV静态供给明显的缺点是维护成本太高了!
因此,K8s开始支持PV动态供给,使用StorageClass对象实现。
基于NFS实现PV动态供给流程图
K8s默认不支持NFS动态供给,需要单独部署社区开发的插件。
项目地址:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
支持动态供给的存储插件:https://kubernetes.io/docs/concepts/storage/storage-classes/
kubectl apply -f rbac.yaml # 授权访问apiserver
kubectl apply -f deployment.yaml # 部署插件,需修改里面NFS服务器地址与共享目录
kubectl apply -f class.yaml # 创建存储类
kubectl get sc# 查看存储类
创建一个自动供给的Deployment
查看pod pv pvc,从而实现动态供给pv 和pvc
然后进入到容器里面nginx 首页下创建一个文件,则nfs 服务端的目录下面也会存在
如果存储类archiveOnDelete: "true" 使用true时,代表删掉这个Deployment 是后端的存储数据不会删除,会出现归档形式(archive)保留,默认使用的false,使用的上面delete 回收策略
https://kubernetes.io/docs/concepts/storage/persistent-volumes/