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: Immediate
2.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-1
3.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: standard
4.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-pvc
4.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 - Ephemeral
5.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: Retain
6.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: premium
6.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: standard
7.2 扩容流程
# 查看当前 PVC kubectl get pvc my-pvc # 编辑 PVC 扩容 kubectl edit pvc my-pvc # 验证扩容结果 kubectl get pvc my-pvc
7.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: 30s
8.2 存储使用情况检查
# 查看 PV 状态 kubectl get pv # 查看 PVC 状态 kubectl get pvc # 查看存储类 kubectl get storageclass # 查看 PV 详细信息 kubectl describe pv my-pv
8.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
- 扩容支持:在线扩展存储容量
通过合理配置存储,可以满足不同应用的存储需求,保障数据的可靠性和可用性。
下一步行动:
- 评估当前存储需求
- 创建分层存储类
- 配置有状态应用的存储
- 设置存储监控
- 制定存储备份策略