欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

043.集群存储-共享存储

程序员文章站 2022-03-16 21:25:35
一共享存储 1.1共享存储作用 Kubernetes对于有状态的容器应用或者对数据需要持久化的应用,不仅需要将容器内的目录挂载到宿主机的目录或者emptyDir临时存储卷,而且需要更加可靠的存储来保存应用产生的重要数据,以便容器应用在重建之后仍然可以使用之前的数据。 1.2共享存储资源 为了能 ......

一 共享存储

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的相互关系遵循如下所示关系:
043.集群存储-共享存储

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的原理释义说明:
043.集群存储-共享存储
动态资源供应模式下,pv、pvc、storageclass及pod使用pvc的原理释义说明:
043.集群存储-共享存储
提示:更多storageclass见《044.集群存储-storageclass》。
更多存储类型参考:https://www.cnblogs.com/irving/p/9847060.html