当前位置: 移动技术网 > 科技>操作系统>Linux > 043.集群存储-共享存储

043.集群存储-共享存储

2020年03月26日  | 移动技术网科技  | 我要评论

一 共享存储

1.1 共享存储作用

kubernetes对于有状态的容器应用或者对数据需要持久化的应用,不仅需要将容器内的目录挂载到宿主机的目录或者emptydir临时存储卷,而且需要更加可靠的存储来保存应用产生的重要数据,以便容器应用在重建之后仍然可以使用之前的数据。

1.2 共享存储资源

为了能够屏蔽底层存储实现的细节,便于使用和管理,kubernetes从1.0版本就引入persistentvolume(pv)和persistentvolumeclaim(pvc)两个资源对象来实现对存储的管理子系统。
pv是对底层网络共享存储的抽象,将共享存储定义为一种“资源”,比如node也是一种容器应用可以“消费”的资源。pv由管理员创建和配置,它与共享存储的具体实现直接相关,例如glusterfs、iscsi、rbd或gce或aws公有云提供的共享存储,通过插件式的机制完成与共享存储的对接,以供应用访问和使用。
pvc则是用户对存储资源的一个“申请”。就像pod“消费”node的资源一样,pvc能够“消费”pv资源。pvc可以申请特定的存储空间和访问模式。
若使用pvc“申请”到一定的存储空间仍然不能满足应用对存储设备的需求。比如通常应用程序都会对存储设备的特性和性能有不同的要求,包括读写速度、并发性能、数据冗余等更高的要求,因此kubernetes从1.4版本开始引入了一个新的资源对象storageclass,用于标记存储资源的特性和性能。
kubernetes 1.6版本时,storageclass和动态资源供应的机制得到了完善,实现了存储卷的按需创建。通过storageclass的定义,管理员可以将存储资源定义为某种类别(class),正如存储设备对于自身的配置描述(profile),例如“快速存储”“慢速存储”“有数据冗余”“无数据冗余”等。用户根据storageclass的描述就能够直观地得知各种存储资源的特性,就可以根据应用对存储资源的需求去申请存储资源。
kubernetes从1.9版本开始引入容器存储接口container storage interface(csi)机制,目标是在kubernetes和外部存储系统之间建立一套标准的存储管理接口,通过该接口为容器提供存储服务,类似于cri(容器运行时接口)和cni(容器网络接口)。

二 pv

2.1 pv详解

pv作为存储资源,主要包括存储能力、访问模式、存储类型、回收策略、后端存储类型等关键信息的设置。
示例1:如下声明的pv具有如下属性:5gib存储空间,访问模式为readwriteonce,存储类型为slow(要求在系统中已存在名为slow的storageclass),回收策略为recycle,并且后端存储类型为nfs(设置了nfs server的ip地址和路径)。
[root@k8smaster01 study]# vi nfspv01.yaml
  1 apiversion: v1
  2 kind: persistentvolume
  3 metadata:
  4   name: pv1
  5 spec:
  6   capacity:
  7     storage: 5gi
  8   accessmodes:
  9   - readwriteonce
 10   persistentvolumereclaimpolicy: recycle
 11   storageclassname: slow
 12   nfs:
 13     path: /tmp
 14     server: 172.17.0.2
kubernetes主要支持的pv类型如下:
  • awselasticblockstore:aws公有云提供的elasticblockstore。
  • azurefile:azure公有云提供的file。
  • azuredisk:azure公有云提供的disk。
  • cephfs:一种开源共享存储系统。
  • fc(fibrechannel):光纤存储设备。
  • flexvolume:一种插件式的存储机制。
  • flocker:一种开源共享存储系统。
  • gcepersistentdisk:gce公有云提供的persistentdisk。
  • glusterfs:一种开源共享存储系统。
  • hostpath:宿主机目录,仅用于单机测试。
  • iscsi:iscsi存储设备。
  • local:本地存储设备,从kubernetes1.7版本引入,到1.14版本时更新为稳定版,目前可以通过指定块(block)设备提供localpv,或通过社区开发的sig-storage-local-static-provisioner插件(https://github.com/kubernetes-sigs/sigstorage-local-static-provisioner)来管理localpv的生命周期。
  • nfs:网络文件系统。
  • portworxvolumes:portworx提供的存储服务。
  • quobytevolumes:quobyte提供的存储服务。
  • rbd(cephblockdevice):ceph块存储。
  • scaleiovolumes:dellemc的存储设备。
  • storageos:storageos提供的存储服务。
  • vspherevolume:vmware提供的存储系统。

2.2 pv配置参数

  • 存储能力(capacity)
描述存储设备具备的能力,目前仅支持对存储空间的设置(storage=xx),未来可能加入iops、吞吐率等指标的设置。
  • 存储卷模式(volumemode)
kubernetes从1.13版本开始引入存储卷类型的设置(volumemode=xxx),可选项包括filesystem(文件系统)和block(块设备),默认值为filesystem。目前有以下pv类型支持块设备类型:
    • awselasticblockstore
    • azuredisk
    • fc
    • gcepersistentdisk
    • iscsi
    • localvolume
    • rbd(cephblockdevice)
    • vspherevolume(alpha)
示例1:使用块设备的pv定义。
[root@k8smaster01 study]# vi blockpv01.yaml
  1 apiversion: v1
  2 kind persistentvolume
  3 metadata:
  4   name: block-pv
  5 spec:
  6   capacity:
  7     storage: 10gi
  8   accessnodes:
  9   - readwriteonce
 10   persistentvolumereclaimpolicy: retain
 11   volumemode: block
 12   fc:
 13     targetwwns: ["50060e801049cfd1"]
 14     lun: 0
 15     readonly: false
 16 
  • 访问模式(access modes)
对pv进行访问模式的设置,用于描述用户的应用对存储资源的访问权限,访问模式如下:
    • readwriteonce(rwo):读写权限,并且只能被单个node挂载。
    • readonlymany(rox):只读权限,允许被多个node挂载。
    • readwritemany(rwx):读写权限,允许被多个node挂载。
某些pv可能支持多种访问模式,但pv在挂载时只能使用一种访问模式,多种访问模式不能同时生效。
  • 存储类别(class)pv
可以设定其存储的类别,通过storageclassname参数指定一个storageclass资源对象的名称。具有特定类别的pv只能与请求了该类别的pvc进行绑定。未设定类别的pv则只能与不请求任何类别的pvc进行绑定。
  • 回收策略(reclaimpolicy)
通过pv定义中的persistentvolumereclaimpolicy字段进行设置,可选项保留(retain),回收(recycle)和删除(delete)。
    • 保留:保留数据,需要手工处理。
    • 回收空间:简单清除文件的操作(例如执行rm-rf/thevolume/*命令)。
    • 删除:与pv相连的后端存储完成volume的删除操作(如awsebs、gcepd、azuredisk、openstackcinder等设备的内部volume清理)。
目前,只有nfs和hostpath两种类型的存储支持recycle策略;
awsebs、gcepd、azure disk和cinder volumes支持delete策略。
  • 挂载参数(mountoptions)
在将pv挂载到一个node上时,根据后端存储的特点,可能需要设置额外的挂载参数,可以根据pv定义中的mountoptions字段进行设置。
示例2:对一个类型为gcepersistentdisk的pv设置挂载参数。
[root@k8smaster01 study]# vi gccpv01.yaml
  1 apiversion: "v1"
  2 kind: "persistentvolume"
  3 metadata:
  4   name: gce-disk-1
  5 spec:
  6   capacity:
  7     storage: "10gi"
  8   accessmodes:
  9   - "readwriteonce"
 10   mountoptions:
 11   - hard
 12   - nolock
 13   - nfsvers=3
 14   gcepersistentdisk:
 15     fstype: "ext4"
 16     pdname: "gce-disk-1"
 17 
提示:以下pv类型支持设置挂载参数:
    • awselasticblockstore
    • azuredisk
    • azurefile
    • cephfs
    • cinder(openstackblockstorage)
    • gcepersistentdisk
    • glusterfs
    • nfs
    • quobytevolumes
    • rbd(cephblockdevice)
    • storageos
    • vspherevolume
    • iscsi
  • 节点亲和性(nodeaffinity)
pv可以设置节点亲和性来限制只能通过某些node访问volume,可以在pv定义中的nodeaffinity字段进行设置。使用这些volume的pod将被调度到满足条件的node上。
示例3:
[root@k8smaster01 study]# vi affpv01.yaml
  1 apiversion: v1
  2 kind: persistentvolume
  3 metadata:
  4   name: example-local-pv
  5 spec:
  6   capacity:
  7     storage: 5gi
  8   accessmodes:
  9   - readwriteonce
 10   persistentvolumereclaimpolicy: delete
 11   storageclassname: local-storage
 12   local:
 13     path: /mnt/disks/ssd1
 14   nodeaffinity:
 15     required:
 16       nodeselectorterms:
 17       - mathexpressions:
 18         - key: kubernetes.io/hostname
 19           operator: in
 20           values:
 21           - my-node
 22 
注意:这个参数仅用于local类型的存储卷。

三 pvc详解

3.1 pvc使用

pvc作为用户对存储资源的需求申请,主要包括存储空间请求、访问模式、pv选择条件和存储类别等信息的设置。
示例1:申明pvc,具有如下属性:申请8gib存储空间,访问模式为readwriteonce,pv选择条件为包含标签“release=stable”并且包含条件为“environment in [dev]”的标签,存储类别为“slow”(要求在系统中已存在名为slow的storageclass)。
[root@k8smaster01 study]# vi myclaim01.yaml
  1 kind: persistentvolumeclaim
  2 apiversion: v1
  3 metadata:
  4   name: myclaim
  5 spec:
  6   accessmodes:
  7   - readwriteonce
  8   resources:
  9     requests:
 10       storage: 8gi
 11   storageclassname: slow
 12   selector:
 13     matchlabels:
 14       release: "stable"
 15     matchexpressions:
 16     - {key: enviroment, operator: in, values: [dev] }
 17 

3.2 pvc配置详解

pvc的关键配置参数说明如下:
  • 资源请求(resources):描述对存储资源的请求,目前仅支持request.storage的设置,即存储空间大小。
  • 访问模式(accessmodes):pvc也可以设置访问模式,用于描述用户应用对存储资源的访问权限。其三种访问模式的设置与pv的设置相同。
  • 存储卷模式(volumemodes):pvc也可以设置存储卷模式,用于描述希望使用的pv存储卷模式,包括文件系统和块设备。
  • pv选择条件(selector):通过对labelselector的设置,可使pvc对于系统中已存在的各种pv进行筛选。系统将根据标签选出合适的pv与该pvc进行绑定。选择条件可以使用matchlabels和matchexpressions进行设置,如果两个字段都设置了,则selector的逻辑将是两组条件同时满足才能完成匹配。
  • 存储类别(class):pvc在定义时可以设定需要的后端存储的类别(通过storageclassname字段指定),以减少对后端存储特性的详细信息的依赖。只有设置了该class的pv才能被系统选出,并与该pvc进行绑定。pvc也可以不设置class需求。如果storageclassname字段的值被设置为空(storageclassname=""),则表示该pvc不要求特定的class,系统将只选择未设定class的pv与之匹配和绑定。pvc也可以完全不设置storageclassname字段,此时将根据系统是否启用了名为defaultstorageclass的admissioncontroller进行相应的操作。
  • 未启用defaultstorageclass:等效于pvc设置storageclassname的值为空(storageclassname=""),即只能选择未设定class的pv与之匹配和绑定。
  • 启用defaultstorageclass:要求集群管理员已定义默认的storageclass。如果在系统中不存在默认的storageclass,则等效于不启用defaultstorageclass的情况。如果存在默认的storageclass,则系统将自动为pvc创建一个pv(使用默认storageclass的后端存储),并将它们进行绑定。
提示:设置默认storageclass的方法为,在storageclass的定义中加上一个annotation“storageclass.kubernetes.io/isdefault-class=true”。如果将多个storageclass都定义为default,则由于不唯一,系统将无法为pvc创建相应的pv。
注意,pvc和pv都受限于namespace,pvc在选择pv时受到namespace的限制,只有相同namespace中的pv才可能与pvc绑定。pod在引用pvc时同样受namespace的限制,只有相同namespace中的pvc才能挂载到pod内。当selector和class都进行了设置时,系统将选择两个条件同时满足的pv与之匹配。另外,如果资源供应使用的是动态模式,即没有预先定义pv,仅通过storageclass交给系统自动完成pv的动态创建,那么pvc再设定selector时,系统将无法为其供应任何存储资源。
在启用动态供应模式的情况下,一旦用户删除了pvc,与之绑定的pv也将根据其默认的回收策略“delete”被删除。如果需要保留pv(用户数据),则在动态绑定成功后,用户需要将系统自动生成pv的回收策略从“delete”改成“retain”。

四 pv和pvc生命周期管理

4.1 pv生命周期

某个pv在生命周期中可能处于以下4个阶段(phaes)之一。
  • available:可用状态,还未与某个pvc绑定。
  • bound:已与某个pvc绑定。
  • released:绑定的pvc已经删除,资源已释放,但没有被集群回收。
  • failed:自动资源回收失败。

4.2 pvc生命周期

将pv看作可用的存储资源,pvc则是对存储资源的需求,pv和pvc的相互关系遵循如下所示关系:
clipboard

4.3 资源供应

kubernetes支持两种资源的供应模式:静态模式(static)和动态模式(dynamic),资源供应的目的就是创建好pv。
  1. 静态模式:集群管理员手工创建许多pv,在定义pv时需要将后端存储的特性进行设置。
  2. 动态模式:集群管理员无须手工创建pv,而是通过storageclass的设置对后端存储进行描述,标记为某种类型。此时要求pvc对存储的类型进行声明,系统将自动完成pv的创建及与pvc的绑定。
注意;pvc可以声明class为"",说明该pvc禁止使用动态模式。

4.4 资源绑定

在用户定义好pvc之后,系统将根据pvc对存储资源的请求(存储空间和访问模式)在已存在的pv中选择一个满足pvc要求的pv,一旦找到,就将该pv与用户定义的pvc进行绑定,用户的pod应用就可以使用这个pvc了。
如果在系统中没有满足pvc要求的pv,pvc则会无限期处于pending状态,直到等到系统管理员创建了一个符合其要求的pv。
pv一旦绑定到某个pvc上,就会被这个pvc独占,不能再与其他pvc进行绑定了。在这种情况下,当pvc申请的存储空间比pv的少时,整个pv的空间就都能够为pvc所用,可能会造成资源的浪费。
如果资源供应使用的是动态模式,则系统在为pvc找到合适的storageclass后,将自动创建一个pv并完成与pvc的绑定。

4.5 资源使用

pod使用volume的定义,将pvc挂载到容器内的某个路径进行使用。volume的类型为persistentvolumeclaim。在容器应用挂载了一个pvc后,就能被持续独占使用。
不过,多个pod可以挂载同一个pvc,由应用程序自身考虑多个实例共同访问一块存储空间的问题。

4.6 资源释放

当用户对存储资源使用完毕后,用户可以删除pvc,与该pvc绑定的pv将会被标记为“已释放”,但还不能立刻与其他pvc进行绑定。通过之前pvc写入的数据可能还被留在存储设备上,只有在清除之后该pv才能再次使用。

4.7 资源回收

对于pv,可以设定回收策略,用于设置与之绑定的pvc释放资源之后如何处理遗留数据的问题。只有pv的存储空间完成回收,才能供新的pvc绑定和使用。
静态资源供应模式下,pv、pvc、storageclass及pod使用pvc的原理释义说明:
clipboard
动态资源供应模式下,pv、pvc、storageclass及pod使用pvc的原理释义说明:
clipboard
提示:更多storageclass见《044.集群存储-storageclass》。
更多存储类型参考:https://www.cnblogs.com/irving/p/9847060.html

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网