k8s 之 volume sc pv pvc 详解

2023-11-08

数据卷概述

Kubernetes Volume(数据卷)主要解决了如下两方面问题:

  • 数据持久性:通常情况下,容器运行起来之后,写入到其文件系统的文件暂时性的。当容器崩溃后,kubelet将会重启该容器,此时原容器运行后写入的文件将丢失,因为容器将重新从镜像创建。
  • 数据共享:同一个Pod(容器组)中运行的容器之间,经常会存在共享文件/文件夹的需求。

Docker 里同样也存在一个 volume(数据卷)的概念,但是 docker 对数据卷的管理相对 kubernetes 而言要更少一些。在 Docker 里,一个 Volume(数据卷)仅仅是宿主机(或另一个容器)文件系统上的一个文件夹。Docker 并不管理 Volume(数据卷)的生命周期。

在 Kubernetes 里,Volume(数据卷)存在明确的生命周期(与包含该数据卷的容器组相同)。因此,Volume(数据卷)的生命周期比同一容器组中任意容器的生命周期要更长,不管容器重启了多少次,数据都能被保留下来。当然,如果容器组退出了,数据卷也就自然退出了。此时,根据容器组所使用的 Volume(数据卷)类型不同,数据可能随数据卷的退出而删除,也可能被真正持久化,并在下次容器组重启时仍然可以使用。

从根本上来说,一个 Volume(数据卷)仅仅是一个可被容器组中的容器访问的文件目录(也许其中包含一些数据文件)。这个目录是怎么来的,取决于该数据卷的类型(不同类型的数据卷使用不同的存储介质)。

使用 Volume(数据卷)时,我们需要先在容器组中定义一个数据卷,并将其挂载到容器的挂载点上。容器中的一个进程所看到(可访问)的文件系统是由容器的 docker 镜像和容器所挂载的数据卷共同组成的。Docker 镜像将被首先加载到该容器的文件系统,任何数据卷都被在此之后挂载到指定的路径上。Volume(数据卷)不能被挂载到其他数据卷上,或者通过引用其他数据卷。同一个容器组中的不同容器各自独立地挂载数据卷,即同一个容器组中的两个容器可以将同一个数据卷挂载到各自不同的路径上。

我们现在通过下图来理解 容器组、容器、挂载点、数据卷、存储介质(nfs、PVC、ConfigMap)等几个概念之间的关系:

  • 一个容器组可以包含多个数据卷、多个容器
  • 一个容器通过挂载点决定某一个数据卷被挂载到容器中的什么路径
  • 不同类型的数据卷对应不同的存储介质(图中列出了 nfs、PVC、ConfigMap 三种存储介质,接下来将介绍更多)

在这里插入图片描述

数据卷的类型

Kubernetes 目前支持多达 28 种数据卷类型(其中大部分特定于具体的云环境如 GCE/AWS/Azure 等),如需查阅所有的数据卷类型,请查阅 Kubernetes 官方文档 Volumes

本文针对自建 Kubernetes 时,经常使用的数据卷的类型描述如下:

emptyDir

描述

emptyDir类型的数据卷在容器组被创建时分配给该容器组,并且直到容器组被移除,该数据卷才被释放。该数据卷初始分配时,始终是一个空目录。同一容器组中的不同容器都可以对该目录执行读写操作,并且共享其中的数据,(尽管不同的容器可能将该数据卷挂载到容器中的不同路径)。当容器组被移除时,emptyDir数据卷中的数据将被永久删除

TIP
容器崩溃时,kubelet 并不会删除容器组,而仅仅是将容器重启,因此 emptyDir 中的数据在容器崩溃并重启后,仍然是存在的。

适用场景
  • 空白的初始空间,例如合并/排序算法中,临时将数据存在磁盘上
  • 长时间计算中存储检查点(中间结果),以便容器崩溃时,可以从上一次存储的检查点(中间结果)继续进行,而不是从头开始
  • 作为两个容器的共享存储,使得第一个内容管理的容器可以将生成的页面存入其中,同时由一个 webserver 容器对外提供这些页面
  • 默认情况下,emptyDir 数据卷被存储在 node(节点)的存储介质(机械硬盘、SSD、或者网络存储)上。此外,您可以设置
    emptyDir.medium 字段为 “Memory”,此时 Kubernetes 将挂载一个 tmpfs(基于 RAM的文件系统)。tmpfs 的读写速度非常快,但是与磁盘不一样,tmpfs 在节点重启后将被清空,且您向该 emptyDir
    写入文件时,将消耗对应容器的内存限制。

nfs

描述

nfs 类型的数据卷可以加载 NFS(Network File System)到您的容器组/容器。容器组被移除时,将仅仅 umount(卸载)NFS 数据卷,NFS 中的数据仍将被保留。

  • 可以在加载 NFS 数据卷前就在其中准备好数据;
  • 可以在不同容器组之间共享数据;
  • 可以被多个容器组加载并同时读写;
适用场景
  • 存储日志文件
  • MySQL的data目录(建议只在测试环境中)
  • 用户上传的临时文件

cephfs

描述

cephfs 数据卷使得您可以挂载一个外部 CephFS 卷到您的容器组中。对于 kubernetes 而言,cephfs 与 nfs 的管理方式和行为完全相似,适用场景也相同。不同的仅仅是背后的存储介质。

适用场景
  • 同 nfs 数据卷

hostPath

描述

hostPath 类型的数据卷将 Pod(容器组)所在节点的文件系统上某一个文件或文件夹挂载进容器组(容器)。

除了为 hostPath 指定 path 字段以外,您还可以为其指定 type 字段,可选的 type 字段描述如下:

Type字段取值 描述
空字符串(default)用于向后兼容,此时,kubernetes 在挂载 hostPath 数据卷前不会执行任何检查
DirectoryOrCreate 如果指定的 hostPath 路径不存在,kubernetes 将在节点的该路径上创建一个空文件夹,权限设置为 0755,与 kubelet 进程具备相同的 group 和 ownership
Directory 指定 hostPath 路径必须存在,且是一个文件夹
FileOrCreate 如果指定的 hostPath 路径不存在,kubernetes 将在节点的该路径上创建一个空的文件,权限设置为 0644,与 kubelet 进程具备相同的 group 和 ownership
File 指定 hostPath 路径必须存在,且是一个文件
Socket 指定 hostPath 路径必须存在,且是一个 Unix Socket
CharDevice 指定 hostPath 路径必须存在,且是一个 character device
BlockDevice 指定 hostPath 路径必须存在,且是一个 block device
警告

使用 hostPath 数据卷时,必须十分小心,因为:

  • 不同节点上配置完全相同的容器组(例如同一个Deployment的容器组)能执行结果不一样,因为不同节点上 hostPath所对应的文件内容不同;
  • Kubernetes 计划增加基于资源的调度,但这个特性将不会考虑对 hostPath 的支持
  • hostPath 对应的文件/文件夹只有 root 可以写入。您要么在 privileged Container (opens new window)以 root 身份运行您的进程,要么修改与 hostPath 数据卷对应的节点上的文件/文件夹的权限
适用场景

绝大多数容器组并不需要使用 hostPath 数据卷,但是少数情况下,hostPath 数据卷非常有用:

  • 某容器需要访问 Docker,可使用 hostPath 挂载宿主节点的 /var/lib/docker
  • 在容器中运行 cAdvisor,使用 hostPath 挂载宿主节点的 /sys

configMap

描述

ConfigMap 提供了一种向容器组注入配置信息的途径。ConfigMap 中的数据可以被 Pod(容器组)中的容器作为一个数据卷挂载。

在数据卷中引用 ConfigMap 时:

  • 您可以直接引用整个 ConfigMap 到数据卷,此时 ConfigMap 中的每一个 key 对应一个文件名,value
    对应该文件的内容
  • 您也可以只引用 ConfigMap 中的某一个名值对,此时可以将 key 映射成一个新的文件名

TIP
将 ConfigMap 数据卷挂载到容器时,如果该挂载点指定了 数据卷内子路径 (subPath),则该 ConfigMap 被改变后,该容器挂载的内容仍然不变。

适用场景

使用 ConfigMap 中的某一 key 作为文件名,对应 value 作为文件内容,替换 nginx 容器中的 /etc/nginx/conf.d/default.conf 配置文件。请参考 使用 ConfigMap 配置您的应用程序

secret

描述

secret 数据卷可以用来注入敏感信息(例如密码)到容器组。您可以将敏感信息存入 kubernetes secret 对象,并通过 Volume(数据卷)以文件的形式挂载到容器组(或容器)。secret 数据卷使用 tmpfs(基于 RAM 的文件系统)挂载。

TIP
将 Secret 数据卷挂载到容器时,如果该挂载点指定了 数据卷内子路径 (subPath),则该 Secret 被改变后,该容器挂载的内容仍然不变。

适用场景
  • 将 HTTPS 证书存入 kubernets secret,并挂载到
    /etc/nginx/conf.d/myhost.crt、/etc/nginx/conf.d/myhost.pem 路径,用来配置
    nginx 的 HTTPS 证书

persistentVolumeClaim

描述

persistentVolumeClaim 数据卷用来挂载 PersistentVolume 存储卷。PersistentVolume 存储卷为用户提供了一种在无需关心具体所在云环境的情况下”声明“ 所需持久化存储的方式。

存储类概述

StorageClass 存储类用于描述集群中可以提供的存储的类型。不同的存储类可能对应着不同的:

  • 服务等级(quality-of-service level)
  • 备份策略
  • 集群管理员自定义的策略

Kubernetes 自身对存储类所代表的含义并无感知,由集群管理员自行约定。

存储类的种类

参考 Storage Classes (opens new window),Kubernetes 提供 19 种存储类 Provisioner,但是绝大多数与具体的云环境相关,如 AWSElasticBlockStore / AzureFile / AzureDisk / GCEPersistentDisk 等。

NFS权限问题
许多网友自己搭建 NFS 测试环境,再创建 NFS存储类,经常碰到 access denied 这类权限问题。为了帮助大家更快地完成 NFS 测试环境搭建,请参考 搭建NFS Server

回收策略 Reclaim Policy

由 StorageClass 动态创建的 PersistentVolume 将使用 StorageClass 中定义的回收策略。可选项有:

  • 回收后删除 Delete
  • 回收后保留 Retain

同一 StorageClass 中,手动创建的 PersistentVolume,将使用创建时手动指定的回收策略。

存储卷绑定模式 Volume Binding Mode

StorageClass 根据存储卷绑定模式的选项,确定何时执行 存储卷与存储卷声明的绑定、何时执行动态存储卷提供(动态创建存储卷)。可选项有:

  • 即刻绑定 Immediate
    存储卷声明创建后,立刻动态创建存储卷并将其绑定到存储卷声明。
  • 首次使用时绑定 WaitForFirstConsumer
    直到存储卷声明第一次被容器组使用时,才创建存储卷,并将其绑定到存储卷声明。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s 之 volume sc pv pvc 详解 的相关文章

随机推荐

  • 【图文教程】若依前后端分离版本-菜单怎么设置

    在使用若依前后端分离版本作为基础架构的时候 需要新建菜单怎么操作 本文凯哥将详细讲解怎么添加 1 登录若依系统后 系统管理 gt gt 菜单 先新建一个一级菜单 可以模仿 系统管理 菜单来创建 系统菜单 我们自己创建的 淘宝客 菜单如下 这
  • 存够20万才敢结婚!算算你的工资够了吗?

    前程无忧2015年白领婚恋成本调查 报告 乔治 克鲁尼结婚了 本尼迪克特 康伯巴奇结婚了 福山雅治结婚了 堀北真希结婚了 恐婚的最后还是踏入了婚姻殿堂 永远的偶像派也闪婚了 真是应验了 凡是有钱的单身汉总想娶位太太 这已经成了一条举世公认的
  • 微信公众号授权(java后端)

    一 授权开发的流程 详情的东西请以官网为准 在此就不多说了 具体而言 网页授权流程分为四步 1 引导用户进入授权页面同意授权 获取code 2 通过code换取网页授权access token 与基础支持中的access token不同 3
  • Django组件介绍

    文章目录 Django组件介绍 1 分页器的使用 1 1 数据库内插入大量数据 1 2 导入模块 1 3 实例化一个分页器 1 4 分页器对象相关的方法 1 5 一个简单的分页示例 2 forms组件 2 1 检验字段功能 2 11 导入f
  • python中[:,2]是什么意思

    这是numpy的切片操作 一般结构如num a b c d 分析时以逗号为分隔符 逗号之前为要取的num行的下标范围 a到b 1 逗号之后为要取的num列的下标范围 c到d 1 如果是这种num b c d a的值未指定 那么a为最小值0
  • 农业土壤墒情监测系统解决方案

    一 方案概述 土壤墒情监测系统能够实现对土壤墒情 土壤湿度 的长时间连续监测 用户可以根据监测需要 灵活布置土壤水分传感器 也可将传感器布置在不同的深度 测量剖面土壤水分情况 系统还提供了额外的扩展能力 可根据监测需求增加对应传感器 监测土
  • Java如何将date日期格式转换为时间戳

    可以使用Java中的java util Date类的getTime 方法将日期转换为时间戳 例如 import java util Date public class Main public static void main String
  • Advanced Installer汉化版教程(打包程序,安装包制作)

    Advanced Installer汉化版教程 转载 打包程序 安装包制作 下载地址 http www crsky com soft 6776 html 1 新建一个安装工程 2 详细的设置工程文件 A 设置产品信息以及在控制面板里的一些信
  • C++扫雷制作(新手上路)

    文章目录 前言 制作软件 代码结构 结构体 刷新屏幕 创建雷区 游戏过程 按钮的制作 总结 前言 在熟读C primer plus 之后 为了进一步熟悉C 编程 制作了一个简易版扫雷 有何不足 有何见地 请大家评论留言 以下是游戏图片 制作
  • vue+elementUI的el-form的回车键登录,监听键盘来触发事件

    vue elementUI的el form的回车键登录 监听键盘来触发事件 1 当只有一个el input的时候 可以用elementUI的自带的回车键触发提交事件 但是有时候会同时触发刷新页面 这样可以在el form上添加 submit
  • [转]Linux存储入门:简易数据恢复方案--分区和LVM实战

    数据恢复有没有简易方案 IT工程师一般都知道如何操作和使用文件和目录 但是 对于系统如何构建出 抽象出文件和目录 一般就不熟悉了 至于更下层的概念 可能大家知道最多的就是驱动了 所以 为了规避这点 可行的简易方案之一 就是以黑箱方式使用te
  • 51. N-Queens

    The n queens puzzle is the problem of placing n queens on an n n chessboard such that no two queens attack each other Gi
  • 数据分析与可视化-R语言分析 (选择练习)

    1 多选题 可以运行R语言的操作系统包括 选项 A Linux B Windows C Mac OS D Android 答案 Linux Windows Mac OS 2 单选题 可以命令将R语言升级到最新版本 选项 A fleshR B
  • vue 的事件修饰符(v-on, v-model)

    先谈谈我对vue 的一些指令的理解吧 v bind 顾名思义是绑定的意思 但是只能绑定属性 语法糖 而 v on 是绑定一个事件 语法糖 v model 是双向数据的绑定 只能用于表单中 而值得一说的v model 相当于是 v bind
  • linux系统数据盘挂载

    前言 挂载前 最好是新的服务器 不要安装宝塔 我之前先安装宝塔 再挂载就有点费劲 需要考虑原来文件是否受损 当前教程属于新服务器下 先挂载数据盘 挂载步骤 查看磁盘信息 gt gt 将数据盘分区 gt gt 格式化数据盘 gt gt 创建一
  • Python怎么输出换行

    python怎样输出换行 Python怎么输出换行 0 摘要 由于特殊的输出要求 我们在使用print 函数时 不希望输出结束后自动换行 1 print 指定结束符 Print hello end Print world result he
  • Linux------网络基础1

    文章目录 计算机网络的发展历程 网络协议 计算机网络分层体系结构 局域网通信的原理 IP地址和 MAC地址的区别 TCP IP体系结构 计算机网络的发展历程 简单的了解一下就行 图就不提供了 1 最开始 计算机之间是相互独立的 不能沟通交流
  • python3.6 安装pyltp

    当时安装pyltp一直报错 缺少balabala 安装了都没有什么暖用 so成功后安利一下 1 安装wheel 下面两个文件针对不同的python版本下载一个即可 pyltp 0 2 1 cp35 cp35m win amd64 whl p
  • 2021年7月,关于技术和未来

    近期研究了一段时间梅花易数 作为一个从小接受唯物主义教育的社会主义接班人 自然曾经一度对这些所谓的封建迷信是不屑一顾的 后来随着年龄增长 才开始慢慢觉得应对这些传承下来的古老文化保持敬畏 然而 直到最近真正仔细研究了后才发现 梅花易数居然有
  • k8s 之 volume sc pv pvc 详解

    数据卷概述 Kubernetes Volume 数据卷 主要解决了如下两方面问题 数据持久性 通常情况下 容器运行起来之后 写入到其文件系统的文件暂时性的 当容器崩溃后 kubelet将会重启该容器 此时原容器运行后写入的文件将丢失 因为容