Local PV具体实现

本地存储(Local PV) 完全可以结合 StorageClass(SC)动态供给(Dynamic Provisioning) 来管理,即使它依赖 nodeAffinity。以下是具体实现方式和生产级实践。


1. 本地存储 + StorageClass 的典型架构

核心组件

组件 作用
Local PV 预配置的本地磁盘卷,绑定到特定节点
StorageClass 定义卷的绑定策略(如 WaitForFirstConsumer
PV Provisioner 自动创建/清理本地 PV(需额外部署,如 local-volume-provisioner

工作原理

  1. 管理员预分配本地磁盘(如 /mnt/ssd1, /mnt/ssd2)。
  2. Provisioner 自动检测磁盘并创建 PV,并自动添加 nodeAffinity
  3. 用户创建 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

调度器行为

  1. 先决定 Pod 调度到哪个节点(如 node-1)。
  2. 再选择该节点上可用的 Local PV(如 local-pv-35c0f123)。
  3. 完成 PVC 和 PV 的绑定。

4. 生产环境最佳实践

优势

特性 说明
自动化管理 Provisioner 自动创建/清理 PV
延迟绑定 WaitForFirstConsumer 确保调度合理性
资源隔离 每个 Pod 使用独立的本地磁盘

注意事项

  1. 磁盘准备

    • 需在每个节点预创建挂载点(如 /mnt/disks/ssd1)。
    • 建议使用 LVM 或 RAID 提高本地磁盘可靠性。
  2. 容量管理

    • 监控本地磁盘使用率,避免单个节点磁盘耗尽。
  3. 故障处理

    • 如果节点宕机,Local PV 上的数据可能丢失,需配合应用层备份。
  4. 扩展性

    • 适合有状态服务(如 MySQL、Redis),不适合需要频繁迁移的无状态服务。

5. 对比:静态 PV vs 动态 Provisioner

方式 操作复杂度 适用场景
手动创建静态 PV 高(需逐个定义 PV) 小规模集群,固定磁盘分配
Dynamic Provisioner 低(全自动) 大规模集群,动态磁盘管理

总结

  • 可以 对本地存储使用 StorageClass,配合 local-volume-provisioner 实现自动化。
  • 核心价值
    • 通过 WaitForFirstConsumer 保证 Pod 和 PV 的节点亲和性。
    • 减少手动管理 PV 的工作量。
  • 适用场景:数据库、消息队列等需要高性能本地磁盘的服务。
posted on 2025-05-30 17:48  Leo-Yide  阅读(90)  评论(0)    收藏  举报