【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 典型使用场景
视频给出三类典型用例:
- 临时存储/崩溃恢复检查点:用于基于磁盘的合并排序、长时间运行任务的中间结果存储,容器崩溃重启后可读取中间数据继续计算,避免重复执行;
- 启动状态标记:以 MySQL 容器为例,emptyDir 可作为启动状态标记的存储路径:容器首次启动时 emptyDir 内无标记文件,直接执行初始化逻辑;非首次启动时从持久化存储(如 iSCSI)恢复数据,通过标记文件判断是否为首次启动,避免重复初始化;
- 多容器协作: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 的基础应用能力。