kubernetes 共享存储原理-PV

676 阅读3分钟

概述

PV 作为存储资源,主要包括存储能力、访问模式、存储类型、回收策略、后端存储类型等信息的设置。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  nfs:
    path: /tmp
    server: 172.17.0.2

运行结果

[root@master1 pv]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv1    5Gi        RWO            Recycle          Available           slow                    12s

PV 关键配置参数

  • 存储能力:描述存储设备具备的能力,目前只有存储空间设置(存储容量)

  • 存储卷模式:包括可选的FilesystemBlock,默认为Filesystem

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: block-pv
    spec:
      capacity:
        storage: 10Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      volumeMode: Block
      fc:
        targetWWNs: ["50060e801049cfd1"]
        lun: 0
        readOnly: false
    
  • 访问模式

    • ReadWriteOnce(RWO):读写权限,并且只能被单个Node挂载
    • ReadOnlyMany(ROX):只读权限,允许被多个Node挂载
    • ReadWriteMany(RWX):读写权限,允许被多个Node挂载
  • 存储类别:storageClassName参数指定一个StorageClass资源对象的名称,具有特定类别的PV只能与请求了该类别的PVC进行绑定。未设置类别的PV只能与不请求任何类别的PVC进行绑定

  • 回收策略:通过persistentVolumeReclaimPolicy设置

    • 保留:保留数据,需要手动删除
    • 回收空间:简单清除文件操作
    • 删除:与PV相连的后端存储完成Volume的删除操作
  • 挂载参数:在将PV挂载到Node上时,根据后端的存储特点,设置额外的挂载参数,通过mountOptions进行设置

    apiVersion: "v1"
    kind: "PersistentVolume"
    metadata:
      name: gce-disk-1
    spec:
      capacity:
        storage: "10Gi"
      accessModes:
        - "ReadWriteOnce"
      mountOptions:
        - hard
        - nolock
        - nfsvers=3
      gcePersistentDisk:
        fsType: "ext4"
        pdName: "gce-disk-1"
    

    运行结果

    [root@master1 pv]# kubectl get pv
    NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    gce-disk-1   10Gi       RWO            Retain           Available                                   6s
    
  • 节点亲和性: PV可以设置节点亲和性来限制只能通过某些Node访问Volume,可以在PV定义中的nodeAffinity字段进行设置,使用这些VolumePod将被调度到满足条件的node

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: example-local-pv
    spec:
      capacity:
        storage: 5Gi
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      storageClassName: local-storage
      local:
        path: /mnt/disks/ssd1
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - my-node
    

    运行结果

    [root@master1 pv]# kubectl describe pv example-local-pv
    Name:              example-local-pv
    Labels:            <none>
    Annotations:       <none>
    Finalizers:        [kubernetes.io/pv-protection]
    StorageClass:      local-storage
    Status:            Available
    Claim:
    Reclaim Policy:    Delete
    Access Modes:      RWO
    VolumeMode:        Filesystem
    Capacity:          5Gi
    Node Affinity:
      Required Terms:
        Term 0:        kubernetes.io/hostname in [my-node]
    Message:
    Source:
        Type:  LocalVolume (a persistent volume backed by local storage on a node)
        Path:  /mnt/disks/ssd1
    Events:    <none>
    You have new mail in /var/spool/mail/root
    
    

PV 生命周期的各个阶段

某个PV在生命周期中可能处于以下4个阶段之一

  • Available:可用状态,还未与某个PVC绑定
  • Bound:已与某个PVC绑定
  • Released:绑定的PVC已经删除,资源已经释放,但没有被集群收回
  • Failed:自动资源回收失败

结语

KubernetesPV机制通过解耦存储的配置与消费,不仅提高了存储资源的灵活性和利用率,还极大地简化了有状态应用在容器环境中的部署与管理,是构建稳定、可扩展的云原生应用不可或缺的一部分。