Administrator
发布于 2026-08-16 / 2 阅读
0
0

第七章.k8s存储-volume-1

来源链接:https://www.bilibili.com/video/BV1PbeueyE8V?spm_id_from=333.788.videopod.episodes&vd_source=d8c71ff24a3359a807967fc4b5daa0e4&p=49

【K8s教程】第七章 Volume 存储(第一部分)

一、Volume 引入背景

承接上一小节内容,ConfigMap、Secret、downward API 本质是元数据存储方案,仅适合存储配置、元数据类轻量信息,无法存储PDF、镜像文件等真实业务数据。同时容器存在两大核心存储痛点:

  • 容器磁盘文件生命周期短暂,容器崩溃重建后会以镜像初始状态启动,原有数据丢失,重要应用会出现数据丢失问题;
  • Pod 内多个容器之间无法直接共享文件。
    因此需要引入 Volume 方案解决真实数据存储与共享问题。

二、Volume 核心定义与价值

Volume 是 K8s 中用于持久化存储真实业务数据的方案,核心解决两类问题:

  • 避免 Pod 内容器重建、Pod 删除导致的数据丢失问题;
  • 实现 Pod 内多个容器之间的文件共享。

三、常见 Volume 类型概览

K8s 原生及可对接的 Volume 类型丰富,本小节重点讲解其中高频使用的类型,其余类型后续展开:

  • 云厂商持久化存储:如 AWS EBS、微软 Azure 块/文件存储等,国内云平台大多兼容 AWS 存储接口;
  • CSI(Container Storage Interface,容器存储接口):是分布式存储、文件系统对接 K8s 的标准接口,与传统存储由 K8s 主动对接的思路不同,CSI 模式下是存储端主动对接 K8s 暴露的 CSI 接口,为 Pod 提供存储能力;
  • hostPath(主机路径):将容器与物理机指定目录做绑定映射,可作为中间层将任意分布式存储、文件系统引入容器,解决无原生 Volume 类型对接后端存储的问题(例如 MFS 分布式存储挂载到物理机目录后,可通过 hostPath 绑定给 Pod 使用);
  • 其他常用类型:NFS、SCSI 等。

四、重点类型:emptyDir 详解

4.1 emptyDir 核心特性

emptyDir 是最基础的 Volume 类型,核心特性如下:

  • 生命周期与 Pod 绑定:Pod 被调度到节点时创建 emptyDir,Pod 从节点删除时 emptyDir 数据永久删除,生命周期不跟随容器;
  • 初始为空:Pod 创建时 emptyDir 为空白状态,资源清单中需显式声明 emptyDir: {} 表示以空环境初始化;
  • 多容器共享:Pod 内多个容器可将同一个 emptyDir 卷挂载到相同或不同的路径,读写数据完全一致,天然支持多容器文件共享;
  • 容器崩溃不影响数据:容器崩溃重启时 Pod 不会被删除,因此 emptyDir 数据不会丢失。

4.2 emptyDir 典型使用场景

视频给出三类典型用例:

  1. 临时存储/崩溃恢复检查点:用于基于磁盘的合并排序、长时间运行任务的中间结果存储,容器崩溃重启后可读取中间数据继续计算,避免重复执行;
  2. 启动状态标记:以 MySQL 容器为例,emptyDir 可作为启动状态标记的存储路径:容器首次启动时 emptyDir 内无标记文件,直接执行初始化逻辑;非首次启动时从持久化存储(如 iSCSI)恢复数据,通过标记文件判断是否为首次启动,避免重复初始化;
  3. 多容器协作:Pod 内 Init Container 负责从 Git 仓库拉取代码,写入 emptyDir 卷,业务容器挂载同一个 emptyDir 卷,直接使用拉取好的代码运行,解决 Init Container 执行完毕后销毁、业务容器无法获取其产出数据的问题。

五、emptyDir 基础实验演示

实验通过两个容器验证 emptyDir 的共享能力:

  • 资源清单核心配置:Pod 包含两个容器,myapp 容器负责生成 Linux 访问日志写入 /var/log/nginx/access.log 文件,busybox 容器负责实时读取该文件并输出日志;声明名为 logs_volume 的 emptyDir 卷,挂载到两个容器的 /var/log/nginx 目录下。
  • 实验效果:创建 Pod 后持续访问 Pod 的 80 端口,可观察到 busybox 容器实时输出访问日志,证明两个容器通过 emptyDir 实现了文件共享,数据读写一致。
  • emptyDir 节点落盘路径验证:emptyDir 的真实文件默认存放在节点的 /var/lib/kubelet/pods/<Pod PID>/volumes/kubernetes.io~empty-dir/ 目录下,注:该默认路径由 kubelet 的根目录参数控制,默认为 /var/lib/kubelet,可通过 kubelet 配置修改。可通过获取 Pod 的 PID 找到对应目录,验证两个容器的挂载路径实际指向同一个 emptyDir 目录,修改文件后双方均可感知。

六、内存型 emptyDir 讲解与实验

基础 emptyDir 默认落盘在物理磁盘上,若对 IO 性能要求极高,可将 emptyDir 的存储介质设置为内存:

  • 配置方式:在 emptyDir 的配置中指定 medium: Memory,同时可通过 sizeLimit 参数限制内存占用的最大值;
  • 注意事项:sizeLimit 的值不能超过 Pod 的内存总限制,因为内存型 emptyDir 占用的内存会计入 Pod 的内存配额,若 Pod 仅有一个容器,emptyDir 占用 500Mi 内存时,容器实际可用的内存仅为总限制减去 500Mi。
  • 实验配置:Pod 配置资源限制为 CPU 1核、内存 1G,声明名为 memo_volume 的 emptyDir 卷,medium 设为 Memory,sizeLimit 设为 500Mi,挂载到容器的 /data 目录下即可使用。

AI 总结

本小节围绕 K8s Volume 存储展开讲解,首先明确 Volume 是用于存储真实业务数据的方案,解决容器数据易丢失、Pod 内多容器无法共享文件的核心痛点;随后介绍了 Volume 的常见类型,重点详解 emptyDir 类型:其生命周期与 Pod 绑定,支持多容器共享,既可作为临时存储、状态标记的载体,也可实现 Init 容器与业务容器的数据传递;最后通过实验演示了基础 emptyDir 和内存型 emptyDir 的配置与使用方式,帮助掌握 Volume 的基础应用能力。


评论