Kubernetes 集群的存储管理实践:从 PVC 到 CSI

张开发
2026/4/21 5:36:25 15 分钟阅读

分享文章

Kubernetes 集群的存储管理实践:从 PVC 到 CSI
Kubernetes 集群的存储管理实践从 PVC 到 CSI前言作为一个在数据深渊里捞了十几年 Bug 的女码农我深知在 Kubernetes 集群中存储管理的重要性。容器化时代数据持久化是一个绕不开的话题如何在动态的容器环境中实现可靠的数据存储是每个 Kubernetes 管理员都需要面对的挑战。今天我就来聊聊 Kubernetes 集群的存储管理实践从 PVC 到 CSI从存储类到卷快照带你构建一个可靠的容器存储方案。一、Kubernetes 存储基础1.1 存储抽象层次Kubernetes 提供了多层存储抽象从底层到应用层依次为Volume最基础的存储抽象直接映射到容器内的目录PersistentVolume (PV)集群级别的存储资源由管理员创建PersistentVolumeClaim (PVC)用户对存储的请求类似于 Pod 对 CPU 和内存的请求StorageClass动态创建 PV 的模板定义存储的类型和参数1.2 存储类型Kubernetes 支持多种存储类型本地存储使用节点本地磁盘性能高但可靠性低网络存储如 NFS、iSCSI、Ceph 等可靠性高但性能相对较低云存储如 AWS EBS、GCP PD、Azure Disk 等与云服务集成二、PersistentVolume 和 PersistentVolumeClaim2.1 创建 PersistentVolumeapiVersion: v1 kind: PersistentVolume metadata: name: pv-example spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: /data2.2 创建 PersistentVolumeClaimapiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-example spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: standard2.3 在 Pod 中使用 PVCapiVersion: v1 kind: Pod metadata: name: pod-with-pvc spec: containers: - name: app image: nginx volumeMounts: - name: data mountPath: /usr/share/nginx/html volumes: - name: data persistentVolumeClaim: claimName: pvc-example三、StorageClass 和动态存储供应3.1 创建 StorageClassapiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast provisioner: kubernetes.io/aws-ebs parameters: type: gp2 zones: us-west-2a, us-west-2b reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate3.2 动态创建 PVCapiVersion: v1 kind: PersistentVolumeClaim metadata: name: dynamic-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: fast四、容器存储接口 (CSI)4.1 CSI 简介CSI 是 Kubernetes 为了支持第三方存储供应商而设计的接口它允许存储供应商开发插件而无需修改 Kubernetes 核心代码。4.2 CSI 架构CSI 驱动实现 CSI 接口的存储插件CSI 控制器处理存储卷的创建、删除等操作CSI 节点处理存储卷的挂载、卸载等操作4.3 部署 CSI 驱动以 Ceph CSI 为例# 部署 Ceph CSI 驱动 kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbd-plugin.yaml # 创建 StorageClass kubectl apply -f ceph-storageclass.yaml五、存储优化策略5.1 性能优化选择合适的存储类型根据应用需求选择合适的存储类型调整存储参数如块大小、IOPS 限制等使用本地存储对于性能要求高的应用使用本地存储配置缓存使用缓存提高读写性能5.2 可靠性优化多副本使用支持多副本的存储系统快照和备份定期创建卷快照和备份故障转移配置存储系统的故障转移机制监控监控存储系统的健康状态5.3 成本优化存储分层将热数据和冷数据存储在不同类型的存储中自动缩放根据实际使用情况自动调整存储容量资源限制设置存储资源的使用限制回收策略合理设置 PV 的回收策略六、实战案例6.1 数据库存储方案场景在 Kubernetes 中部署 MySQL 数据库需要可靠的持久化存储方案创建 StorageClass使用 SSD 存储支持动态 provisioning创建 PVC为 MySQL 数据目录和配置目录创建 PVC部署 MySQL使用 StatefulSet 部署 MySQL挂载 PVC配置备份使用 CronJob 定期创建卷快照配置示例apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: mysql replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD value: password volumeMounts: - name: data mountPath: /var/lib/mysql - name: config mountPath: /etc/mysql/conf.d volumeClaimTemplates: - metadata: name: data spec: accessModes: [ReadWriteOnce] storageClassName: fast resources: requests: storage: 20Gi - metadata: name: config spec: accessModes: [ReadWriteOnce] storageClassName: standard resources: requests: storage: 1Gi6.2 大规模存储方案场景在 Kubernetes 中部署大数据应用需要 TB 级存储方案使用 Ceph 存储部署 Ceph 集群作为后端存储部署 Ceph CSI使用 Ceph CSI 驱动集成到 Kubernetes创建 StorageClass配置不同性能等级的 StorageClass动态 provisioning使用动态 provisioning 管理存储性能指标存储容量10TB读写性能1GB/s延迟 1ms可用性99.99%七、常见问题与解决方案问题原因解决方案PVC 绑定失败没有可用的 PV或 StorageClass 配置错误检查 PV 状态确保 StorageClass 配置正确存储性能差存储类型选择不当或参数配置不合理选择合适的存储类型调整存储参数数据丢失存储系统故障或备份策略不当配置多副本定期创建快照和备份存储成本高存储资源使用不合理实施存储分层设置资源限制存储扩容失败StorageClass 不支持扩容或存储系统限制确保 StorageClass 支持扩容检查存储系统限制八、总结Kubernetes 集群的存储管理是一个系统工程需要从存储抽象、存储类型、CSI 驱动、优化策略等多个方面入手。记住源码之下没有秘密。理解 Kubernetes 存储的底层原理是做好管理的基础Show me the benchmark, then we talk. 所有存储方案都需要通过实际测试验证高并发不是吹出来的是压测出来的。存储性能不是说出来的是测出来的作为一名技术人我们的尊严不在于职级而在于最后一次把生产事故从边缘拉回来的冷静。希望这篇文章能帮助你构建一个可靠的 Kubernetes 存储方案为容器化应用提供稳定的数据持久化支持。写在最后如果你对 Kubernetes 集群的存储管理还有其他疑问欢迎在评论区留言。我会不定期分享更多关于分布式存储、数据稠密计算、MySQL 解析器等方面的技术干货。—— 国医中兴一个在数据深渊里捞了十几年 Bug 的女码农

更多文章