容器默认的文件系统是临时的,Pod 删除后数据丢失。Kubernetes 通过 Volume 抽象提供持久化存储。本文介绍几种常用卷类型:emptyDir(临时存储)、hostPath(节点存储)、PersistentVolumeClaim(持久卷声明)以及 CSI(容器存储接口)。掌握这些,你可以为应用提供从临时缓存到企业级持久化存储的完整方案。

一、Volume 基础
Volume 在 Pod 级别定义,挂载到容器内的指定路径。不同类型的卷支持不同的后端(本地磁盘、NFS、云存储等)。

二、emptyDir:临时存储
emptyDir 在 Pod 调度到节点时创建,初始为空,Pod 删除时数据永久丢失。适用于同一 Pod 内多个容器共享临时数据、缓存或检查点。

YAML 示例:

apiVersion: v1
kind: Pod
metadata:
  name: emptydir-demo
spec:
  containers:
  - name: writer
    image: busybox
    command: ["/bin/sh", "-c", "echo hello > /data/hello.txt && sleep 3600"]
    volumeMounts:
    - name: shared-data
      mountPath: /data
  - name: reader
    image: busybox
    command: ["/bin/sh", "-c", "cat /data/hello.txt && sleep 3600"]
    volumeMounts:
    - name: shared-data
      mountPath: /data
  volumes:
  - name: shared-data
    emptyDir: {}

emptyDir 可以指定存储介质(默认磁盘,可改为内存):

emptyDir:
  medium: Memory
  sizeLimit: 128Mi   # 可选,限制内存使用量

三、hostPath:节点存储
hostPath 将节点文件系统的路径挂载到 Pod。常用于:

访问节点上的 Docker socket(/var/run/docker.sock)

日志或监控 agent 读取 /var/log

节点级配置文件(如 kubelet 配置)

注意事项:

不同节点上的文件内容可能不同,导致 Pod 行为不一致。

多 Pod 同时写 hostPath 可能冲突。

生产环境慎用,推荐使用 PersistentVolume。

YAML 示例:

apiVersion: v1
kind: Pod
metadata:
  name: hostpath-demo
spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - name: host-logs
      mountPath: /host/var/log
  volumes:
  - name: host-logs
    hostPath:
      path: /var/log
      type: Directory   # 可选:DirectoryOrCreate, File, FileOrCreate 等

四、PersistentVolume(PV)与 PersistentVolumeClaim(PVC)
这是 Kubernetes 推荐的持久化存储方式。PV 是集群管理员提供的存储资源,PVC 是用户对存储的请求。PVC 绑定到 PV 后,Pod 通过 PVC 使用存储。

4.1 创建 PV(NFS 示例)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.1.100
    path: /exports/data

accessModes:ReadWriteOnce(单节点读写)、ReadOnlyMany(多节点只读)、ReadWriteMany(多节点读写)。

persistentVolumeReclaimPolicy:Retain(手动清理)、Delete(自动删除)、Recycle(已废弃)。

4.2 创建 PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Kubernetes 会寻找满足请求的 PV(容量 >= 5Gi,匹配 accessMode),并绑定。如果无匹配,PVC 将保持 Pending。

4.3 在 Pod 中使用 PVC

apiVersion: v1
kind: Pod
metadata:
  name: pvc-demo
spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - name: data
      mountPath: /usr/share/nginx/html
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: my-pvc

4.4 StorageClass 动态供给
StorageClass 允许按需自动创建 PV。管理员定义 StorageClass(如云厂商的 SSD 类型),用户 PVC 指定 storageClassName,系统会自动创建 PV。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: dynamic-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: fast
  resources:
    requests:
      storage: 10Gi

五、CSI(容器存储接口)
CSI 是 Kubernetes 1.13+ 引入的标准存储接口,允许第三方存储提供商(如 AWS EBS、GCE PD、Ceph、Portworx)通过标准驱动集成到 K8s。用户无需修改 K8s 核心代码即可使用各种存储。

使用步骤:

在集群中部署 CSI 驱动(通常提供 DaemonSet + Controller 的 YAML)。

创建 StorageClass 引用 CSI 驱动。

创建 PVC 使用该 StorageClass,Pod 即可使用。

CSI 的优势:支持快照、克隆、卷扩展等高级功能。

六、存储卷的适用场景总结
卷类型	持久性	共享性	性能	典型场景
emptyDir	无	同 Pod 内	高	缓存、临时数据
hostPath	节点级别	无	高	节点日志、设备访问
PV/PVC + NFS	持久	多节点只读/读写多节点	中	共享文件、配置
PV/PVC + 云盘	持久	单节点读写	高	数据库、状态应用
CSI	持久	取决于插件	取决于后端	企业级存储集成

七、常见问题与解决
问题	原因	解决
PVC 一直 Pending	没有匹配的 PV 或 StorageClass	kubectl describe pvc 查看事件,检查容量和访问模式
Pod 挂载 PVC 失败	PVC 未绑定或访问模式冲突	确保 PVC 已 Bound,且 Pod 节点支持该访问模式(如 ReadWriteOnce 只能被一个 Pod 使用)
hostPath 文件权限错误	容器用户对节点路径无权	修改 Pod securityContext.fsGroup 或直接赋予节点路径权限
CSI 驱动安装失败	缺少 RBAC 权限或镜像拉取问题	查看驱动 Pod 日志,检查网络访问

八、最佳实践
临时数据用 emptyDir,并设置 sizeLimit 防止磁盘爆满。

生产持久化存储使用 PVC + StorageClass,避免直接使用 hostPath。

为有状态应用(如数据库)选择 ReadWriteOnce 的块存储,而非 NFS(性能问题)。

定期备份 PV 数据,PV 本身不提供备份能力。

使用 PVC 时,注意 Pod 调度与卷可用区的亲和性(云存储通常绑定节点可用区)。

九、小结
Kubernetes 提供了丰富的存储卷类型,从临时 emptyDir 到企业级 CSI。理解 PV/PVC 模型能帮助你更好地管理应用数据生命周期。合理选择存储方案,是保证状态应用稳定运行的关键。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐