k8s 持久化存储-常见的存储卷介绍

k8s 持久化存储-常见的存储卷介绍

背景与核心痛点:在 Kubernetes(K8s)中,容器与 Pod 的生命周期本质上是暂态与无状态的,一旦 Pod 重建或漂移,容器内部生成的文件即会永久丢失。为了满足数据库、日志归档与业务文件的可靠存储,K8s 提供了多层次的存储卷抽象。本文系统拆解 emptyDir 临时卷、hostPath 主机卷、NFS 网络共享卷的核心机制,以及从 PV/PVC 静态人工绑定到基于 StorageClass 的动态自动供给全流程实战。

目录

数据持久化核心价值与场景

  • 数据保留:确保数据库、用户附件与日志在容器崩溃重启或调度时不丢失。
  • 跨容器共享:同一 Pod 内多容器(如主容器与 Sidecar 日志收集器)共享相同存储目录。
  • 解耦存储与计算:通过 PV/PVC 声明抽象底层真实存储驱动,使业务配置具备环境可移植性。

基础存储卷:emptyDir 与 hostPath

1. emptyDir 临时共享卷

  • 生命周期:与 Pod 生命周期完全绑定。当 Pod 从节点被删除时,emptyDir 中的数据将永久清空。
  • 典型场景:内存/磁盘高速缓存、同一 Pod 内不同容器间的临时数据流水线交换。

2. hostPath 主机目录卷

  • 机制:将工作节点(Node)宿主机的文件系统目录直接映射到 Pod 容器中。
  • 典型场景:收集宿主机 /var/log 日志、访问节点 /dev 硬件或 Docker Socket。
  • 限制与风险:Pod 重新调度到其他节点将无法读取先前宿主机的数据;若缺乏权限限制可能引入容器逃逸安全隐患。

网络共享存储:NFS 存储卷实操

NFS 卷允许将网络共享目录挂载到 Pod 中,支持跨节点同时挂载(ReadWriteMany),是中小型集群最常用的网络共享存储之一。

apiVersion: v1
kind: Pod
metadata:
  name: nfs-pod
spec:
  containers:
  - name: web
    image: nginx
    volumeMounts:
    - name: nfs-storage
      mountPath: /usr/share/nginx/html
  volumes:
  - name: nfs-storage
    nfs:
      server: 192.168.1.100
      path: /data/share

PV 与 PVC 静态绑定机制

1. 定义并创建 PersistentVolume

PV(持久卷)由集群管理员配置,代表底层实际存储资源:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/nfs/pv1
    server: 192.168.1.100

2. 创建 PersistentVolumeClaim 与 Pod 挂载

PVC(持久卷声明)由业务开发人员发起,向集群请求指定规格的存储:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: data-vol
      mountPath: /var/www/html
  volumes:
  - name: data-vol
    persistentVolumeClaim:
      claimName: my-pvc

Kubernetes 会自动匹配符合容量与访问模式的 PV,状态变为 Bound。

动态供给进阶:StorageClass 与 NFS Provisioner

静态创建 PV 存在效率低下问题。通过引入存储类(StorageClass)与存储供应商(如 nfs-subdir-external-provisioner),用户只需提交 PVC,系统即可自动在后台分配存储并动态创建对应的 PV:

  1. 部署 NFS Provisioner 并配置集群 ServiceAccount 与角色绑定。
  2. 定义 StorageClass:
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: nfs-storage
    provisioner: example.com/nfs
    reclaimPolicy: Delete
    
  3. 在 PVC 中指定 storageClassName: nfs-storage,即可实现存储即申请即供给的完全自动化管理。