美文网首页KubernetesDocker容器玩转大数据
K8s 数据存储之PersistentVolume

K8s 数据存储之PersistentVolume

作者: AlienPaul | 来源:发表于2020-02-10 16:56 被阅读0次

    PersistentVolume(PV)和PersistentVolumeClaim(PVC)

    这两个概念用于pod和volume之间解耦。Pod根据自己的需要提出数据卷的申请,k8s系统将符合条件的数据卷返回给pod。这样一来pod就无需直接和数据卷本身强绑定了。Pod无需知道数据卷的细节信息,比如具体用的是什么存储。

    Pod中对数据卷的申请为PVC,用来和PVC绑定的数据卷称为PV。

    PV可以有多种存储方式,比如NFS,iSCSI等。

    PVC是使用PV资源的声明。

    PV和PVC的生命周期

    供应阶段

    PV有两种供应方式

    • static 静态方式由系统管理员创建PV
    • dynamic 如果没有静态的PV。系统会动态创建出PV来满足PVC。PV的提供者为StorageClass。要使用动态供应,PVC必须要指定一个StorageClass。如果StorageClass设置为空,那么针对这个PVC的动态供应特性会被禁用。

    绑定阶段

    这个阶段指的是PV和PVC绑定的过程。系统有一个机制,循环检查新创建的PVC,然后找到一个符合条件的PV,把他们绑定到一起。如果有多个满足要求的PV可以绑定,会使用消耗资源最小的那个。PV和PVC之间是一对一的关系。如果找不到符合条件的PV,PVC会一致保持未绑定状态。

    使用阶段

    PVC绑定合适的PV之后,Pod使用这个PV。和PVC绑定并处于使用状态的PV不会被系统删除,防止数据丢失。

    如果用户删除了Pod正在使用的PVC,这个PVC不会被立即移除。直到这个PVC不被任何Pod时候的时候,才会被真正的删除。

    重新声明阶段

    当PV不再使用的时候,k8s根据不同的策略来回收这些PV。

    Retain

    Retain策略在volume不再使用的时候,不删除旧的数据,等待管理员处理。

    Delete

    Delete策略会删除不再使用的PV,同时删除这些PV对应真实存储的资源。

    Recycle(已废弃)

    删除volume内的内容,使得volume可供下次使用。

    PV描述文件

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv0003
    spec:
      capacity:
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      storageClassName: slow
      mountOptions:
        - hard
        - nfsvers=4.1
      nfs:
        path: /tmp
        server: 172.17.0.2
    

    PV的属性

    Capacity

    PV的容量

    VolumeMode

    可以使用Filesystem或者Block。Filesystem为默认值。

    AccessModes

    具有如下可选值:

    • ReadWriteOnce:可以被一个node读写。缩写为RWO。
    • ReadOnlyMany:可以被多个node读取。缩写为ROX。
    • ReadWriteMany:可以摆多个node读写。缩写为RWX。

    Class

    配置storageClassName。

    Reclaim Policy

    可以使用如下回收策略:

    • Retain 手工回收
    • Recycle (rm -rf /thevolume/*)
    • Delete 删除相关Volume

    Mount Options

    可以指定存储的类型。

    Node Affinity

    Local volume必须要设定这个属性。该属性规定了volume可以通过哪些node访问。

    PV的阶段(Phase)

    • Available:可用状态,没有被任何PVC绑定。
    • Bound:已绑定到了PVC。
    • Released:PVC已删除,但是资源没有被集群回收。
    • Failed:PV自动回收失败。

    PVC的描述文件

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: myclaim
    spec:
      accessModes:
        - ReadWriteOnce
      volumeMode: Filesystem
      resources:
        requests:
          storage: 8Gi
      storageClassName: slow
      selector:
        matchLabels:
          release: "stable"
        matchExpressions:
          - {key: environment, operator: In, values: [dev]}
    

    PVC的配置参数

    AccessModes

    访问模式。和PV相同。

    VolumeMode

    volume的挂载模式,可以为Filesystem或block。

    Resources

    约定声明PV的大小等参数。

    Selector

    用于限制volume,只有label匹配的volume才能绑定到PVC上。可以使用matchLabels或者matchExpressions来约束。

    Class

    用于实现动态供给。只有StorageClassName相同的PV和PVC才能够绑定到一起。如果PVC的StorageClassName设置为"",那么它只会和StorageClassName也为""的PV绑定到一起。

    创建StorageClass的时候如果将它的storageclass.kubernetes.io/is-default-class annotation设置为true,那么此StorageClass会成为默认的StorageClass。如果PVC没有指定StorageClassName,那么它会和StorageClassName为默认StorageClass的PV绑定到一起。当然,使用这个特性必须要开启DefaultStorageClass的admission plugin。

    如果没有启动这个admission plugin。没有指定StorageClass的PVC只能和没有指定StorageClass的PV绑定在一起。没有指定StorageClass和设置StorageClass的值为"",含义是相同的。

    在Pod中使用PVC

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: myfrontend
          image: nginx
          volumeMounts:
          - mountPath: "/var/www/html"
            name: mypd
      volumes:
        - name: mypd
          persistentVolumeClaim:
            claimName: myclaim
    

    LocalPersistentVolume

    这种类型的PV把数据储存在集群中某个节点上。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: example-pv
    spec:
      capacity:
        storage: 100Gi
      # volumeMode field requires BlockVolume Alpha feature gate to be enabled.
      volumeMode: Filesystem
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: local-storage
      local:
        path: /mnt/disks/ssd1
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - example-node
    

    注意:nodeAffinity属性是必须要指定的,因为local模式一定要确定数据保存在哪个机器。

    对应StorageClass如下:

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: local-storage
    provisioner: kubernetes.io/no-provisioner
    volumeBindingMode: WaitForFirstConsumer
    

    相关文章

      网友评论

        本文标题:K8s 数据存储之PersistentVolume

        本文链接:https://www.haomeiwen.com/subject/eduaxhtx.html