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 或节点存在。
③ 自动化运维:从手动创建到动态供给,降低运维成本。

1.5 存储体系架构总览

下图展示了 Kubernetes 存储体系的核心组件及其交互关系,从 Pod 内部的卷挂载到集群后端的动态供给链路。

Kubernetes 存储体系架构总览 Pod Container A Container B volumeMounts: mountPath 卷抽象层 EmptyDir(临时) HostPath(节点绑定) PVC(持久化声明) 持久化存储 PV(静态) StorageClass(动态) 后端存储(NFS/Ceph/云盘) 关键关系: Pod 通过 volumeMounts 引用卷抽象层(EmptyDir/HostPath/PVC);PVC 绑定 PV 或触发 StorageClass 动态供给;后端存储提供最终数据持久化能力。 成本优化视角 • EmptyDir:零持久化成本,适合临时数据,但数据不可恢复。 • HostPath:零额外存储成本,但导致 Pod 与节点绑定,阻碍弹性伸缩,间接增加资源碎片。 • PV/PVC + StorageClass:支持按需分配、在线扩容、自动回收,是成本优化的核心抓手。 • 后端选择:本地 SSD(低延迟低成本) vs 分布式存储(高可用高成本),需根据业务 SLA 权衡。

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 删除后存储自动释放,同时支持按需扩容避免预分配浪费。这是所有存储成本优化方案的基础配置。