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的相互关系遵循如下所示关系:
4.3 资源供应
kubernetes支持两种资源的供应模式:静态模式(static)和动态模式(dynamic),资源供应的目的就是创建好pv。
- 静态模式:集群管理员手工创建许多pv,在定义pv时需要将后端存储的特性进行设置。
- 动态模式:集群管理员无须手工创建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的原理释义说明:
动态资源供应模式下,pv、pvc、storageclass及pod使用pvc的原理释义说明:
提示:更多storageclass见《044.集群存储-storageclass》。
更多存储类型参考:https://www.cnblogs.com/irving/p/9847060.html
推荐阅读
-
没有共享存储和仲裁盘的SQL Server 2012HADR故障手动切换TSQL
-
redis/分布式文件存储系统/数据库 存储session,解决负载均衡集群中session不一致问题
-
通用分页存储过程,源码共享,大家共同完善
-
ThinkinginBigDate(九)大数据hadoop集群下离线数据存储和挖掘
-
Oracle 10g RAC (Linux) ASM 共享存储的管理详解
-
Oracle Enterprise Linux 5.9 配置OCFS2共享存储
-
redis/分布式文件存储系统/数据库 存储session,解决负载均衡集群中session不一致问题,redissession_PHP教程
-
mysql集群采用磁盘文件存储表
-
Oracle11gR2构建RAC之(2)--配置共享存储
-
部署ceph存储集群及块设备测试