Kubernetes之[Volume 、PV 、PVC]认识
Volume概述
-
Volume 是 Pod 中能够被多个容器访问的共享目录
-
Kubernetes 的 Volume 定义在 Pod 上,它被一个 Pod 中的多个容器挂载到具体的文件目录下。
-
Volume 与 Pod 的生命周期相同,但与容器的生命周期不相关, 当容器终止或重启时, Volume 中的数据也不会丢失
-
Kubernetes 支持多种类型的 Volume
-
常用的如:EmptyDir
-
常用的如:HostPath
-
常用的如:nfs
-
EmptyDir 类型的Volume
emptyDir 是最基础的 Volume 类型。正如其名字所示,一个 emptyDir Volume 是 Host 上的一个空目录。
EmptyDir 类型的 volume创建于pod被调度到某个宿主机上的时候,
而同一个 pod 内的容器都能读写 EmptyDir 中的同一个文件。
如果 Pod 不存在了,emptyDir 也就没有了
所以目前 EmptyDir 类型的 volume 主要用作临时空间,
比如 Web 服务器写日志或者 tmp 文件需要的临时目录
-
如下所示
通过上面的资源编排文件我们就可以很好的理解EmptyDir的Volume是怎么使用的了
首先我们观察整个配置文件,我们定义了两个pod和一个emptyDir的Volume数据卷轴
第一个pod通过volumeMounts挂载了一个名为shared-volumn的数据卷轴
将其挂载在/prodecer_dir目录下
然后在其下创建hello文件,并写入数据 "hello world"
第二个pod通过volumeMounts挂载了一个名为shared-volumn的数据卷轴
将其挂载在/consumer_dir目录下
然后在其查看hello文件,得到"hello world"数据
两个容器通过emptyDir类型的Volume实现数据共享
hostPath类型的Volume
HostPath 属性的 volume 使得对应的容器能够访问当前宿主机上的指定目录
一旦这个 pod 离开了这个宿主机, HostDir 中的数据虽然不会被永久删除, 但数据也不会随 pod 迁移到其他宿主机上
实际上增加了 Pod 与节点的耦合
应用场景:
pod内容器想与宿主机做数据同步,做目录挂载时
需要访问宿主机上Docker引擎内部数据结构的容器应用时
-
如下所示
我们通过pod创建了Nginx的服务
但是我们都知道Nginx做静态资源的代理是,在不修改配置文件的情况下,所有资源文件都在html目录下
这个时候我们通过hostPath类型的数据卷轴挂载,
就可以实现在宿主机动态变更Nginx的html目录下的的所有静态资源
比如我在宿主机的mydata目录下放了一张test.jpg的图片
此时你就可以通过该Nginx服务直接访问该图片
NFS类型的Volume
NFS即网络文件系统,其允许一个系统在网络上与它人共享目录和文件
NFS相信大家都知道是什么玩意了,比如win10自带功能,局域网通过NFS实现文件共享
k8s集群当中挂在nfs文件系统道理也是相通
选一台k8s集群外的同局域网的服务器 ,可相互ping通即可,下载nfs-utils
yum install nfs-utils
集群内所有的node节点全部下载:nfs-utils
yum install nfs-utils
文件系统服务器设置NFS的挂载路径以及权限等
vim /etc/exports
/mydata *(rw,no_root_squash)
/mydata :对外开放的目录
*:代表所有局域网机器,可设置可访问的机器ip
rw: 可读可写
no_root-squash:root登陆即有用root权限
root_squash:root登陆,只能是匿名使用者,权限没有roota高,安全一点
文件系统启动NFS
systemctl start nfs
-
k8s集群部署应用使用nfs网络存储
首先我们通过文件系统服务器设置NFS的挂载路径以及权限等
暴露了/mydata目录,所有人允许访问
然后我们k8s所有节点安装了nfs服务
最后我们配置资源编排文件,使用NFS类型的数据卷进行网络共享
资源编排文件指定了主机
资源编排文件指定共享目录
和nginx的html目录进行挂载,实现数据共享
这样我们在192.168.217.150机器上的/mydata目录下丢入图片,nginx服务可以对外进行暴露
PV和PVC
PV的定义
PV即PersistentVolume ,是集群中由管理员配置的一段网络存储
PV生命周期独立于使用PV的任何单个pod,不和pod有生命周期牵扯,独立存活
大白话说PV就是存储,独立存在,和pod的生命周期无关
PVC的定义
PVC即PersistentVolumeClaim ,是由用户进行存储的请求
大白话说PVC就是调用PV,访问储存,当然这其中也有很多细节
-
我们还是首先选择上面的NFS作为一个基础环境
NFS服务器:192.168.217.150
共享文件夹 /mydata
坑: 注意这个分享目录的大小写问题,我踩了这个坑
资源定义
这里我们定义了一个PV,基于NFS
服务器IP为192.168.217.150
共享文件目录为 /mydata
PVC :通过配置信息相同直接会绑定PV
容量信息:5G (尝试与my-pv匹配:成功)
匹配模式:读写更多 (尝试与my-pv匹配:成功)
部署PV、PVC、Deployment
-
直接部署:先部署pv,再部署pvc
-
kubectl apply -f pv.yaml
-
kubectl apply -f pvc.yaml
-
-
查看一下线相关的信息
操作NFS服务器
-
我们直接在192.168.217.150NFS服务器的 /mydata目录下创建一个index.html
-
然后写入 Hello PV/PVC
-
查看pod内部数据变化
-
随便选一个pod,我们进入其内,查看挂载目录下的文件
-
我们在pvc配置文件中挂载的目录是:/usr/share/nginx/html
-