K8s 持久化存储:PV 与 PVC 配置指南
1. 持久化存储痛点与解决方案
你是否还在为 K8s 容器重启后数据丢失而烦恼?是否在集群迁移时因存储配置不兼容而焦头烂额?本文将系统讲解 Kubernetes(K8s)持久化存储核心组件 PV(Persistent Volume,持久卷)与 PVC(Persistent Volume Claim,持久卷声明)的设计原理与实战配置,读完你将掌握:
- PV/PVC 的生命周期管理与权限隔离机制
- 5 种存储类型的 PV 配置案例(本地存储/云存储/NFS/Ceph)
- 动态供应与 StorageClass 的自动化配置
- 生产环境中的存储性能优化与故障排查
1.1 容器存储困境
容器的临时性带来三大存储挑战:
| 痛点场景 | 传统解决方案 | PV/PVC 优势 |
|---|---|---|
| 数据持久化 | 宿主机绑定挂载 | 集群级资源管理,跨节点迁移 |
| 存储隔离 | 手动分配存储路径 | 声明式 API,基于角色的权限控制 |
| 环境一致性 | 脚本维护存储配置 | 存储类标准化,环境无关部署 |
2. PV 与 PVC 核心概念
2.1 核心组件关系
PV 是集群级别的存储资源,由管理员配置;PVC 是用户对存储资源的请求,两者通过标签选择器绑定:
2.2 生命周期管理
PV 完整生命周期包含 5 个阶段:
3. PV 静态配置实战
3.1 NFS 类型 PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv-10g
labels:
storage: nfs
env: production
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany # 多节点读写
persistentVolumeReclaimPolicy: Retain # 保留数据
storageClassName: slow
nfs:
path: /data/k8s/nfs
server: 192.168.1.100
readOnly: false
3.2 本地存储 PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv-50g
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce # 单节点读写
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /mnt/disks/sdb1
nodeAffinity: # 节点亲和性
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node-01
3.3 云存储 PV(AWS EBS)
apiVersion: v1
kind: PersistentVolume
metadata:
name: aws-ebs-pv-20g
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: gp2
awsElasticBlockStore:
volumeID: aws://us-west-2a/vol-0abcdef1234567890
fsType: ext4
4. PVC 声明与使用
4.1 基础 PVC 定义
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: slow
selector:
matchLabels:
storage: nfs
4.2 工作负载挂载 PVC
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
spec:
replicas: 1
template:
spec:
containers:
- name: mysql
image: mysql:8.0
volumeMounts:
- name: data-volume
mountPath: /var/lib/mysql
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: app-data-pvc
5. 动态存储供应
5.1 StorageClass 配置
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iopsPerGB: "100"
fsType: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
5.2 动态 PVC 创建
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dynamic-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: fast # 关联 StorageClass
6. 生产环境最佳实践
6.1 存储性能调优
| 优化方向 | 实施方法 |
|---|---|
| IO 隔离 | 使用 StorageClass 区分高性能/普通存储 |
| 缓存策略 | 配置 volumeDevices 的 readOnly 属性 |
| 卷扩展 | 启用 allowVolumeExpansion: true |
| 监控告警 | 配置 Prometheus 规则监控 PV 使用率 |
6.2 故障排查流程
6.3 安全加固
- 使用 RBAC 限制 PVC 创建权限
- 配置 PV 目录权限
fsGroup: 1000 - 敏感数据使用加密存储类(如 AWS KMS)
7. 总结与展望
PV/PVC 通过"两层抽象"实现了存储资源的解耦管理:管理员专注于 PV 基础设施配置,开发者通过 PVC 声明存储需求。随着 K8s 存储技术发展,CSI(容器存储接口)逐渐成为主流,未来将提供更丰富的存储服务集成。
建议收藏本文作为速查手册,关注项目 https://gitcode.com/doocs/advanced-java 获取更多云原生技术实践。欢迎在评论区分享你的存储配置经验!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



