Kubernetes存储类与持久化卷深度解析 引言 在 Kubernetes 中,存储是一个关键的基础设施组件。理解存储类(StorageClass)和持久化卷(PersistentVolume)的概念对于构建可靠的有状态应用至关重要。本文将深入探讨 Kubernetes 存储系统的设计原理和最佳实践。
一、存储架构概述 1.1 存储层次结构 ┌─────────────────────────────────────────────────────────────┐ │ Kubernetes 存储层次 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌───────────────────┐ │ │ │ Pod (应用层) │ │ │ └────────┬──────────┘ │ │ │ volumeMounts │ │ ▼ │ │ ┌───────────────────┐ │ │ │ PersistentVolume │ ← 动态/静态绑定 │ │ │ Claim (PVC) │ │ │ └────────┬──────────┘ │ │ │ 绑定 │ │ ▼ │ │ ┌───────────────────┐ │ │ │ PersistentVolume │ ← StorageClass 动态创建 │ │ │ (PV) │ │ │ └────────┬──────────┘ │ │ │ 映射 │ │ ▼ │ │ ┌───────────────────┐ │ │ │ StorageClass │ │ │ │ (存储类配置) │ │ │ └────────┬──────────┘ │ │ │ 提供 │ │ ▼ │ │ ┌───────────────────┐ │ │ │ CSI/Volume │ │ │ │ Plugin (驱动) │ │ │ └────────┬──────────┘ │ │ │ 连接 │ │ ▼ │ │ ┌───────────────────┐ │ │ │ 外部存储系统 │ (SAN/NAS/云存储) │ │ └───────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘1.2 存储组件关系 组件 角色 说明 StorageClass 存储类定义 定义存储类型和配置 PersistentVolume 存储资源 实际存储资源的抽象 PersistentVolumeClaim 存储请求 Pod 对存储的请求 CSI Driver 存储驱动 连接外部存储系统
二、存储类配置 2.1 基础 StorageClass apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: standard provisioner: kubernetes.io/aws-ebs parameters: type: gp2 fsType: ext4 reclaimPolicy: Retain allowVolumeExpansion: true mountOptions: - debug volumeBindingMode: Immediate2.2 StorageClass 参数说明 参数 说明 默认值 provisioner存储提供者 必需 parameters提供者特定参数 可选 reclaimPolicy回收策略 Delete allowVolumeExpansion是否允许扩容 false mountOptions挂载选项 可选 volumeBindingMode绑定模式 Immediate
2.3 回收策略 策略 描述 适用场景 Retain 保留 PV 和数据 需要手动清理 Delete 删除 PV 和数据 临时存储 Recycle 擦除数据后重用 已废弃
三、持久化卷配置 3.1 静态 PV 创建 apiVersion: v1 kind: PersistentVolume metadata: name: static-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard local: path: /mnt/disks/vol1 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node-13.2 访问模式 模式 描述 适用场景 ReadWriteOnce (RWO) 单节点读写 单 Pod 独占 ReadOnlyMany (ROX) 多节点只读 共享只读数据 ReadWriteMany (RWX) 多节点读写 多 Pod 共享写入
3.3 PV 状态 状态 描述 Available PV 可用,未绑定 Bound PV 已绑定到 PVC Released PVC 已删除,PV 待回收 Failed PV 回收失败
四、持久化卷声明配置 4.1 基础 PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard4.2 PVC 与 Pod 绑定 apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: app image: my-app:latest volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: my-pvc4.3 存储容量请求 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: large-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi storageClassName: premium五、CSI 驱动配置 5.1 CSI 简介 CSI(Container Storage Interface)是 Kubernetes 存储插件的标准接口。
5.2 CSI 驱动部署 apiVersion: storage.k8s.io/v1 kind: CSIDriver metadata: name: com.example.driver spec: attachRequired: true podInfoOnMount: true volumeLifecycleModes: - Persistent - Ephemeral5.3 CSI StorageClass apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-storage provisioner: com.example.driver parameters: disk-type: ssd region: us-west-2 reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer六、存储配置最佳实践 6.1 存储类分层 # 基础存储类 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: standard provisioner: kubernetes.io/aws-ebs parameters: type: gp2 reclaimPolicy: Delete # 高性能存储类 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: premium provisioner: kubernetes.io/aws-ebs parameters: type: io1 iopsPerGB: "30" reclaimPolicy: Delete # 归档存储类 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: archive provisioner: kubernetes.io/aws-ebs parameters: type: sc1 reclaimPolicy: Retain6.2 有状态应用存储配置 apiVersion: apps/v1 kind: StatefulSet metadata: name: database spec: replicas: 3 template: spec: containers: - name: postgres image: postgres:14 volumeMounts: - name: data mountPath: /var/lib/postgresql/data volumeClaimTemplates: - metadata: name: data spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 50Gi storageClassName: premium6.3 存储容量规划 应用类型 存储需求 推荐存储类 数据库 高 IOPS、低延迟 premium 缓存 高 IOPS premium 日志 大容量、低成本 archive 静态文件 多节点读写 nfs/csi
七、存储扩容 7.1 PVC 扩容配置 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: resources: requests: storage: 20Gi # 从 10Gi 扩容到 20Gi storageClassName: standard7.2 扩容流程 # 查看当前 PVC kubectl get pvc my-pvc # 编辑 PVC 扩容 kubectl edit pvc my-pvc # 验证扩容结果 kubectl get pvc my-pvc7.3 存储类扩容支持 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: expandable-storage provisioner: kubernetes.io/aws-ebs allowVolumeExpansion: true # 启用扩容支持 parameters: type: gp2八、存储监控与管理 8.1 存储监控指标 apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: storage-metrics spec: selector: matchLabels: app: csi-driver endpoints: - port: metrics interval: 30s8.2 存储使用情况检查 # 查看 PV 状态 kubectl get pv # 查看 PVC 状态 kubectl get pvc # 查看存储类 kubectl get storageclass # 查看 PV 详细信息 kubectl describe pv my-pv8.3 存储清理 # 删除 PVC(根据回收策略处理 PV) kubectl delete pvc my-pvc # 手动删除 PV(当回收策略为 Retain 时) kubectl delete pv my-pv # 删除存储类 kubectl delete storageclass my-storageclass九、总结 Kubernetes 存储系统提供了灵活的持久化方案:
StorageClass :定义存储类型和配置PersistentVolume :抽象存储资源PersistentVolumeClaim :Pod 的存储请求CSI :标准化存储插件接口动态配置 :自动创建 PV扩容支持 :在线扩展存储容量通过合理配置存储,可以满足不同应用的存储需求,保障数据的可靠性和可用性。
下一步行动 :
评估当前存储需求 创建分层存储类 配置有状态应用的存储 设置存储监控 制定存储备份策略