zoukankan      html  css  js  c++  java
  • 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

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

    .

  • 相关阅读:
    pat03-树1. 二分法求多项式单根(20)
    pat05-图1. List Components (25)
    pat06-图4. Saving James Bond
    pat05-图3. 六度空间 (30)
    pat05-图2. Saving James Bond
    pat04-树9. Path in a Heap (25)
    pat04-树8. Complete Binary Search Tree (30)
    pat04-树7. Search in a Binary Search Tree (25)
    pat04-树5. File Transfer (25)
    Two Sum
  • 原文地址:https://www.cnblogs.com/msi-chen/p/14354724.html
Copyright © 2011-2022 走看看