Kubernetes数据卷Volume和数据卷分类(emptyDir、nfs、hostPath、ConfigMap)详解

news2024/11/16 11:53:37

Kubernetes数据卷Volume和数据卷分类详解

数据卷概述

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 三种存储介质,接下来将介绍更多)

在这里插入图片描述

数据卷内子路径

数据卷内子路径(SubPath)是Kubernetes中一种用于挂载数据卷中指定部分内容的机制。在Kubernetes中,数据卷是一种将主机上的文件或目录挂载到容器中的机制,允许容器访问主机上的文件或目录。而数据卷内子路径则允许将数据卷中指定的子目录或子文件挂载到容器中的指定路径上。

具体来说,当创建Pod时,在定义容器的VolumeMounts时,可以通过指定SubPath来选择数据卷中的特定子目录或子文件,将其挂载到容器的指定路径上。 例如,可以将一个包含多个文件的数据卷挂载到容器的某个目录下,然后指定SubPath为其中的某个文件的名称,这样只有这个文件会被挂载到容器中。

使用数据卷内子路径可以在容器中灵活地选择需要挂载的数据卷的部分内容,避免将整个数据卷都挂载到容器中造成资源浪费,并且可以方便地控制容器中的文件路径和内容。

数据卷的类型

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

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

emptyDir

  • 描述

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

  • 解析

    “emptyDir” 存储卷的默认存储路径是 “/var/lib/kubelet/pods/[PodID]/volumes/kubernetes.io~empty-dir/[VolumeName]”,其中 [PodID] 是 Pod 的唯一标识符,[VolumeName] 是存储卷的名称。例如,如果你在 Pod YAML 中定义了一个名为 “my-volume” 的 “emptyDir” 存储卷,那么它的默认存储路径将是 “/var/lib/kubelet/pods/[PodID]/volumes/kubernetes.io~empty-dir/my-volume”。在容器中,你可以将 “emptyDir” 存储卷挂载到容器的文件系统中的任何目录中。例如,你可以使用以下 YAML 文件在容器中将 “emptyDir” 存储卷挂载到 “/data” 目录中:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: container1
        image: my-image
        volumeMounts:
        - name: shared-data
          mountPath: /data
      - name: container2
        image: my-other-image
        volumeMounts:
        - name: shared-data
          mountPath: /data
      volumes:
      - name: shared-data
        emptyDir: {}
    

​ 在上面的示例中,我们创建了一个名为my-pod的 Pod,其中包含两个容器:container1container2。这两个容器都将shared-data卷挂载到/data目录,并使用emptyDir类型的卷。这样,两个容器就可以共享/data目录下的任何数据。

容器崩溃时,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 映射成一个新的文件名

    在k8s中,ConfigMap也是一种资源对象,可以被持久化存储到文件系统中,因此**可以通过在Pod中定义一个Volume并将其绑定到ConfigMap上,然后将Volume挂载到容器的挂载点上,容器就可以像访问本地文件系统一样访问ConfigMap中定义的数据了。 **这种方式可以方便地将诸如配置信息注入到容器中,从而实现应用程序的动态配置。

    在挂载后,ConfigMap会以文件的形式出现在容器的指定路径下,并且文件名与ConfigMap的名称相同,文件内容就是ConfigMap中的数据。在容器中,可以像访问普通文件一样访问这个文件,从而读取ConfigMap中的数据。

  • 适用场景

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

secret

  • 描述

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

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

  • 适用场景

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1143978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

window系统修改rabbitmq 默认端口

安装完rabbitmq之后,默认的client端口是5672, 控制台访问端口是15672,rabbitmq管理工具启动之后在浏览器中输入地址: ​ ​http://localhost:15672/​​​ 就可以访问后台​ ​​​, 默认管理员账号:guest 密码&#x…

移动云获取推拉流地址

一:帮助文档: 移动云帮助中心https://ecloud.10086.cn/op-help-center/doc/category/753 二:准备工作: 1:进入移动云首页,点击【产品】>【视频服务】>【视频服务】>【视频直播】 点击【立即订购…

图纸管理制度 《五》

1、存档文件应由专人管理,其他人未征得管理人员同意,不得随意翻阅查看。 2、档案管理人员要认真贯彻执行公司相关制度,严禁泄露档案材料中的秘密。 彩虹图纸管理软件_图纸管理系统_图纸文档管理软件系统_彩虹EDM【官网】彩虹EDM图纸管理软件…

Linux进程控制/进程终止

一、系统调用fork函数 1、fork返回值及内核操作 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回 0 &#xff0c;父进程返回子进程 id &#xff0c;出错返回 -1 进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核做&am…

UE4 体积云制作 学习笔记

首先Noise本来就是一张噪点图 云的扰动不能太大&#xff0c;将Scale调小&#xff0c;并将InputMin调整为0 形成这样一张扰动图 扰动需要根据材质在世界的位置进行调整&#xff0c;所以Position需要加上WorldPosition 材质在不同世界位置&#xff0c;噪点不同 除以一个数&#…

会声会影2024(Corel VideoStudio)正式版安装下载步骤教程

众所周知会声会影(Corel VideoStudio)2024为加拿大Corel公司发布的一款功能丰富的视频编辑软件。实际上我们可以这样讲添加样子和款式&#xff1a;使用数百种创意拖放效果和滤镜增个性和艺术格调。值得肯定的是添加趣味性3D标题&#xff0c;内置NewBlueFX和proDAD转场和防抖插件…

基于头脑风暴算法的无人机航迹规划-附代码

基于头脑风暴算法的无人机航迹规划 文章目录 基于头脑风暴算法的无人机航迹规划1.头脑风暴搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用头脑风暴算法来优化无人机航迹规划。 …

矩阵特征值与特征向量的理解

各位朋友大家好&#xff0c;我是小C哈哈哈&#xff0c;很高兴认识大家&#xff0c;在这里&#xff0c;我会将一些枯燥难懂的数学和算法知识以图片或动画的形式通俗易懂的展现给大家&#xff0c;希望大家喜欢。 线性代数中的矩阵特征值与特征向量这两个基本概念总是让很多人摸不…

接口自动化框架篇:流程封装与基于加密接口的测试用例设计

​接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法&#xff0c;是远远不够的&#xff0c;还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以&#xff0c;接下来&#xff0c;我们主要介绍下接口测试用例分析以及通用的流程封装是如…

nginx配置域名(ssl和非ssl形式)

概要 本文以阿里云为例&#xff0c;浅要介绍如何将域名指向你的服务器&#xff0c;以及如何配置ssl和非ssl的方式。 购买域名 购买域名不做描述&#xff0c;本文域名以helloword.com为例 域名实名与备案 购买后&#xff0c;不实名和备案是无法使用的&#xff0c;这里不展开…

Games 103 作业二

Games 103 作业二 作业二其实就是要使用隐式积分和PBD两种方式来实现布料求解。难度相对于作业一来说要简单一些&#xff0c;在文档中基本把步骤都写清楚了。主要逻辑首先参考Lecture 05 PPT的第18页&#xff1a; 然后我们按照文档的步骤一步一步地来。注意0号顶点和20号顶点是…

JSX基础语法

文章目录 认识JSX语法JSX是什么为什么Rect选择了JSXJSX书写规范JSX注释编写 JSX的基本使用JSX的事件绑定this绑定问题参数传递问题 JSX的条件渲染常见的条件渲染方式 JSX的列表渲染JSX的原理和本质JSX的本质虚拟DOM的创建过程 案例练习 认识JSX语法 // 1. 定义根组件 const el…

【Truffle】一、Truffle的安装与部署

目录 一、准备安装 二、安装truffle 三、创建 Truffle 项目工程 1.为 Truffle 项目创建新目录&#xff1a; 2.下载 (“unbox”) MetaCoin box: 四、项目分析 五、测试合约 一、准备安装 安装truffle必须要提前配置Nodejs环境&#xff0c;关于Nodejs的配置&#xff0c;我在…

黑豹程序员-架构师学习路线图-百科:Lombok消除冗长的java代码

文章目录 1、为什么要使用Lombok&#xff1f;2、Lombok的工作原理3、反对声渐渐消亡4、总结4.1、什么是Lombok&#xff1f;4.2、Lombok的发展历史4.3、Lombok常见的注解 1、为什么要使用Lombok&#xff1f; 现代的java项目开发都使用分层开发&#xff0c;MVC分层已经深入人心&…

Vue组件自定义事件实现子组件给父组件传递数据

一、绑定自定义事件 &#xff08;一&#xff09;使用v-on或绑定事件 事件是绑定在组件身上的&#xff0c;当我们触发这个事件的时候&#xff0c;就会执行事件回调函数。 <组件标签 v-on:事件名"事件回调函数"/> // 或 <组件标签 事件名"事件回调函…

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题

三、用go语言&#xff0c;给定一个n结点的二叉树&#xff0c;写出一个 O(n)时间的非递归过程&#xff0c;将该树每个结点的关键字输出。可以使用一个栈作为辅助数据结构。 文心一言&#xff1a; 以下是一个使用 Go 语言编写的函数&#xff0c;该函数使用一个栈作为辅助数据结…

Web应用系统设计

Web应用设计的本质目的是为了解决软件系统的复杂性,所以我们在进行web设计时,首先要分析系统的复杂性,然后再进行设计。 1.案例 某公司在创业初期快速地开发了一个B2C的垂直电商网站,然后就迅速的投向市场进行运营。为了能够快速上线,系统设计得非常简单,选择了三层架构…

大厂面试题-Java并发编程基础篇(一)

目录 一、什么是守护线程&#xff0c;它有什么特点 二、谈谈你对AQS的理解 三、AbstractQueuedSynchronized为什么采用双向链表 四、lock和synchronized区别 五、线程池如何知道一个线程的任务已经执行完成 六、什么叫做阻塞队列的有界和无界 七、ConcurrentHashMap底层…

拓扑排序基础详解,附有练习题

介绍 拓扑排序是一种对有向无环图&#xff08;DAG&#xff09;进行排序的算法。在一个有向图中&#xff0c;如果存在一条从节点 A 到节点 B 的路径&#xff0c;那么节点 A 就依赖于节点 B。 有向无环图如下 什么是入度&#xff0c;出度&#xff1f; 入度&#xff1a;有多少个…

10款轻量型的嵌入式GUI库分享

LVGL LittlevGL是一个免费的开源图形库&#xff0c;提供了创建嵌入式GUI所需的一切&#xff0c;具有易于使用的图形元素、漂亮的视觉效果和低内存占用。 特点&#xff1a; 强大的构建模组 按钮、图表、列表、滑块、图像等 ​先进的图形 动画、反锯齿、半透明、平滑滚动 多样…