KubernetesDocker容器玩转大数据

K8s 数据存储之PersistentVolume

2020-02-10  本文已影响0人  AlienPaul

PersistentVolume(PV)和PersistentVolumeClaim(PVC)

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

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

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

PVC是使用PV资源的声明。

PV和PVC的生命周期

供应阶段

PV有两种供应方式

绑定阶段

这个阶段指的是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

具有如下可选值:

Class

配置storageClassName。

Reclaim Policy

可以使用如下回收策略:

Mount Options

可以指定存储的类型。

Node Affinity

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

PV的阶段(Phase)

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
上一篇下一篇

猜你喜欢

热点阅读