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

  • 这里一共定义了两个pod,一个PVC,一个deployment

  • 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

  • 可以发现,数据以及实现了共享

.

原文地址:https://www.cnblogs.com/msi-chen/p/14354724.html