Local PV具体实现
本地存储(Local PV) 完全可以结合 StorageClass(SC) 和 动态供给(Dynamic Provisioning) 来管理,即使它依赖 nodeAffinity。以下是具体实现方式和生产级实践。
1. 本地存储 + StorageClass 的典型架构
核心组件
| 组件 | 作用 |
|---|---|
| Local PV | 预配置的本地磁盘卷,绑定到特定节点 |
| StorageClass | 定义卷的绑定策略(如 WaitForFirstConsumer) |
| PV Provisioner | 自动创建/清理本地 PV(需额外部署,如 local-volume-provisioner) |
工作原理
- 管理员预分配本地磁盘(如
/mnt/ssd1,/mnt/ssd2)。 - Provisioner 自动检测磁盘并创建 PV,并自动添加
nodeAffinity。 - 用户创建 PVC 时,调度器根据 Pod 的调度节点选择匹配的 PV。
2. 具体配置方法
步骤 1:部署 Local Volume Provisioner
使用 Kubernetes 官方提供的 local-volume-provisioner:
helm repo add sig-storage-local-static-provisioner https://kubernetes-sigs.github.io/sig-storage-local-static-provisioner
helm install local-provisioner sig-storage-local-static-provisioner/local-static-provisioner \
--set storageClass.mountDir=/mnt/disks \
--set storageClass.name=local-ssd \
--set storageClass.volumeBindingMode=WaitForFirstConsumer
步骤 2:检查自动创建的 StorageClass
kubectl get sc local-ssd -o yaml
输出示例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-ssd
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
步骤 3:Provisioner 自动发现的 PV
Provisioner 会扫描节点上的磁盘(如 /mnt/disks/ 下的目录),并为每个目录创建一个 PV:
kubectl get pv
输出示例:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS NODE
local-pv-35c0f123 100Gi RWO Delete Available local-ssd node-1
local-pv-7d8e4567 100Gi RWO Delete Available local-ssd node-2
每个 PV 会自动包含正确的 nodeAffinity,例如:
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node-1 # 绑定到特定节点
3. 用户如何使用?
创建 PVC(无需手动指定 PV)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-ssd # 关键!使用自动供给的 SC
resources:
requests:
storage: 100Gi
创建 Pod 时自动绑定
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: "/data"
name: local-vol
volumes:
- name: local-vol
persistentVolumeClaim:
claimName: local-pvc
调度器行为:
- 先决定 Pod 调度到哪个节点(如
node-1)。 - 再选择该节点上可用的 Local PV(如
local-pv-35c0f123)。 - 完成 PVC 和 PV 的绑定。
4. 生产环境最佳实践
优势
| 特性 | 说明 |
|---|---|
| 自动化管理 | Provisioner 自动创建/清理 PV |
| 延迟绑定 | WaitForFirstConsumer 确保调度合理性 |
| 资源隔离 | 每个 Pod 使用独立的本地磁盘 |
注意事项
-
磁盘准备:
- 需在每个节点预创建挂载点(如
/mnt/disks/ssd1)。 - 建议使用 LVM 或 RAID 提高本地磁盘可靠性。
- 需在每个节点预创建挂载点(如
-
容量管理:
- 监控本地磁盘使用率,避免单个节点磁盘耗尽。
-
故障处理:
- 如果节点宕机,Local PV 上的数据可能丢失,需配合应用层备份。
-
扩展性:
- 适合有状态服务(如 MySQL、Redis),不适合需要频繁迁移的无状态服务。
5. 对比:静态 PV vs 动态 Provisioner
| 方式 | 操作复杂度 | 适用场景 |
|---|---|---|
| 手动创建静态 PV | 高(需逐个定义 PV) | 小规模集群,固定磁盘分配 |
| Dynamic Provisioner | 低(全自动) | 大规模集群,动态磁盘管理 |
总结
- 可以 对本地存储使用 StorageClass,配合
local-volume-provisioner实现自动化。 - 核心价值:
- 通过
WaitForFirstConsumer保证 Pod 和 PV 的节点亲和性。 - 减少手动管理 PV 的工作量。
- 通过
- 适用场景:数据库、消息队列等需要高性能本地磁盘的服务。
浙公网安备 33010602011771号