1. 存储基础回顾:Kubernetes存储体系概览
Kubernetes 的存储体系经历了从“临时挂载”到“持久化声明”再到“动态供给”的演进。理解这一演进路径,是掌握存储成本优化的前提。本章从最基础的 EmptyDir 与 HostPath 出发,逐步深入到 PV/PVC/StorageClass 的完整资源模型。
1.1 临时存储:EmptyDir
EmptyDir 是 Kubernetes 中最简单的卷类型。它在 Pod 创建时被分配一个空目录,Pod 内的多个容器可以共享读写该目录。Pod 被删除时,EmptyDir 中的数据会被永久清除。
- 生命周期:与 Pod 绑定,Pod 删除即销毁。
- 典型场景:临时缓存、日志聚合、容器间文件交换。
- 成本特征:零持久化成本,但数据不可恢复。
实践提示:EmptyDir 默认使用节点本地磁盘(通常是 Docker 的 overlay2 层),IO 性能受节点负载影响。对于高 IO 的临时计算任务,可设置
emptyDir.medium: Memory 将数据挂载到 tmpfs,获得内存级读写速度,但会消耗 Pod 的内存配额。
1.2 节点本地存储:HostPath
HostPath 将宿主机上的文件或目录挂载到 Pod 中。它打破了 Pod 的隔离性,使 Pod 可以直接访问节点文件系统。
| 特性 | EmptyDir | HostPath |
|---|---|---|
| 生命周期 | 随 Pod 销毁 | 随节点持久存在 |
| 数据持久性 | 无 | 节点不销毁则数据保留 |
| 调度限制 | 无 | Pod 必须调度到指定节点 |
| 安全风险 | 低 | 高(可访问宿主机敏感目录) |
| 典型用途 | 临时缓存 | DaemonSet 日志采集、CNI 插件 |
成本与安全警告:HostPath 在成本优化场景中应尽量避免。它导致 Pod 与节点强绑定,阻碍 Pod 迁移和弹性伸缩,间接增加资源碎片和闲置成本。生产环境仅推荐用于系统级 DaemonSet(如 node-exporter、fluentd)。
1.3 从卷到持久化声明:PV 与 PVC
为了解决 HostPath 的节点绑定问题,Kubernetes 引入了 PersistentVolume(PV) 和 PersistentVolumeClaim(PVC) 抽象层。PV 是集群管理员预置的存储资源,PVC 是用户对存储资源的请求。这种“供给-消费”分离模式,使存储与 Pod 生命周期解耦。
- PV:独立于 Pod 存在的存储单元,由管理员手动创建或通过 StorageClass 动态供给。
- PVC:用户声明对存储的需求(大小、访问模式),系统自动匹配或触发动态供给。
- 绑定关系:PVC 与 PV 一对一绑定,绑定后 PVC 可被多个 Pod 引用(取决于访问模式)。
# 示例:PV 定义(NFS 后端)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-001
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.1.100
path: "/exports/data"
---
# 示例:PVC 声明
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-100gi-rwx
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
1.4 动态供给:StorageClass
手动创建 PV 在大规模集群中不可持续。StorageClass 实现了存储的“动态供给”:用户创建 PVC 时,系统根据 StorageClass 中定义的 Provisioner 自动创建 PV 并绑定。
| 概念 | 角色 | 成本优化关键点 |
|---|---|---|
| StorageClass | 存储模板,定义后端类型、回收策略、参数 | 选择低成本 Provisioner(如本地 SSD vs 云盘) |
| Provisioner | 负责创建 PV 的插件(如 kubernetes.io/aws-ebs) |
不同 Provisioner 单价差异可达 10 倍 |
| ReclaimPolicy | PV 释放后的处理方式(Retain/Delete/Recycle) | Delete 可自动清理闲置存储,避免浪费 |
| AllowVolumeExpansion | 是否允许在线扩容 | 避免预分配过大容量,按需扩容 |
演进总结:从 EmptyDir → HostPath → PV/PVC → StorageClass,Kubernetes 存储体系实现了三个关键跃迁:
① 数据持久化:从 Pod 级临时存储到集群级持久存储。
② 生命周期解耦:存储不再依赖 Pod 或节点存在。
③ 自动化运维:从手动创建到动态供给,降低运维成本。
① 数据持久化:从 Pod 级临时存储到集群级持久存储。
② 生命周期解耦:存储不再依赖 Pod 或节点存在。
③ 自动化运维:从手动创建到动态供给,降低运维成本。
1.5 存储体系架构总览
下图展示了 Kubernetes 存储体系的核心组件及其交互关系,从 Pod 内部的卷挂载到集群后端的动态供给链路。
1.6 访问模式与回收策略
PV 和 PVC 的 访问模式(AccessModes) 决定了存储可以被多少个 Pod 以何种方式挂载,直接影响资源利用率和成本。
| 访问模式 | 缩写 | 说明 | 成本影响 |
|---|---|---|---|
| ReadWriteOnce | RWO | 单节点读写挂载 | 最常用,成本适中 |
| ReadOnlyMany | ROX | 多节点只读挂载 | 适合共享配置,节省重复存储 |
| ReadWriteMany | RWX | 多节点读写挂载 | 后端要求高(如 NFS/CephFS),成本较高 |
| ReadWriteOncePod | RWOP | 单 Pod 读写(K8s v1.22+) | 避免多 Pod 争用,适合有状态应用 |
回收策略(ReclaimPolicy) 决定了 PVC 释放后 PV 的处理方式,是成本回收的关键控制点:
- Retain:保留 PV 及其后端数据,需要管理员手动清理。适合需要数据归档的场景,但容易产生僵尸 PV 造成存储浪费。
- Delete:自动删除 PV 及其后端存储。成本优化推荐策略,避免闲置资源。
- Recycle:已弃用,由动态供给替代。
成本优化基线:在 StorageClass 中设置
reclaimPolicy: Delete 并启用 allowVolumeExpansion: true,可确保 PVC 删除后存储自动释放,同时支持按需扩容避免预分配浪费。这是所有存储成本优化方案的基础配置。