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

背景与核心痛点:在 Kubernetes(K8s)中,容器与 Pod 的生命周期本质上是暂态与无状态的,一旦 Pod 重建或漂移,容器内部生成的文件即会永久丢失。为了满足数据库、日志归档与业务文件的可靠存储,K8s 提供了多层次的存储卷抽象。本文系统拆解 emptyDir 临时卷、hostPath 主机卷、NFS 网络共享卷的核心机制,以及从 PV/PVC 静态人工绑定到基于 StorageClass 的动态自动供给全流程实战。
目录
- 数据持久化核心价值与场景
- 基础存储卷:emptyDir 与 hostPath
- 网络共享存储:NFS 存储卷实操
- PV 与 PVC 静态绑定机制
- 动态供给进阶:StorageClass 与 NFS Provisioner
数据持久化核心价值与场景
- 数据保留:确保数据库、用户附件与日志在容器崩溃重启或调度时不丢失。
- 跨容器共享:同一 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:
- 部署 NFS Provisioner 并配置集群 ServiceAccount 与角色绑定。
- 定义 StorageClass:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-storage provisioner: example.com/nfs reclaimPolicy: Delete - 在 PVC 中指定
storageClassName: nfs-storage,即可实现存储即申请即供给的完全自动化管理。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 zszweb
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果