云计算
第六,共享存储原则
对于有状态或持久数据的应用,Kubernetes不仅需要将容器中的目录挂载到主机的目录或empDir的临时存储卷中,还需要更可靠的存储来保存应用生成的重要数据,这样在容器应用重新构建后,以前的数据仍然可以使用。为了屏蔽底层存储的实现细节,方便用户使用,同时方便管理员管理,kubernetes从v1.0引入了两个资源对象,分别是persistentVolume和persistentVolumeCliam,来管理存储。
PersistentVolume(PV)是底层网络中共享存储的抽象,将共享存储定义为一种“资源”。例如,节点也是容器应用程序可以消耗的一种资源。PV由管理员创建和配置,与共享存储的具体实现直接相关,如GlusterFS、iSCSI、RBD或GEC/AWS公有云提供的共享存储。它通过插件机制与共享存储器连接,以供访问和使用。PersistentVolumeCliam(PVC)是用户对存储资源的“应用”。就像Pod“消耗”节点的资源一样,PVC也“消耗”光伏资源。PVC可以申请特定的存储空间和访问模式。
使用PVC来“申请”一定的存储空间,仍然不足以满足应用对存储设备的各种需求。通常,应用程序对存储设备的特征和性能有不同的要求。包括读写速度、并发性能、数据冗余等更高的要求。kubernetes从1.4版引入了一个新的资源对象storageClass来标记存储资源的特征和性能。到v1.6,完善了storageClass和动态资源的应用机制,实现了存储卷的按需创建。
那么下面小编就详细讲解一下PV、PVC、storageClass、动态资源供应等共享存储管理机制。
1.PV详细介绍
PV作为存储资源,主要包括存储容量、访问方式、存储类型、回收策略、后端存储类型等关键信息的设置。以下面的配置为例:
apiVersion: v1
种类:持久卷
元数据:
名称:pv1
规格:
容量:
存储:5Gi
访问模式:
-读写一次
persistentVolumeReclaimPolicy策略:回收
存储类名:慢
nfs:
路径:/tmp
服务器:172.17.0.2
上面的例子创建了一个5G空间,访问模式为ReadWriteOnce,存储类型为“slow”(要求系统已经创建了一个名为slow的storageClass资源对象),回收策略为“recycle”,后端存储类型为nfs(并设置了NFS服务器的IP和路径)。
Kubernetes支持的光伏类型如下:
?gcepersistindisk # GEC持久磁盘由GEC公共云提供
?AWSElasticBlockStore # AWS ElasticBlockStore由AWS公有云提供
?Azure公共云提供的AzureFile #Azure
?AzuReDisk #AzureDisk由AzuReDisk提供
?光纤通道
?灵活卷
?弗洛克
?NFS #网络文件系统
?iSCSI
?RBD (Ceph块设备)#Ceph存储块
?CephFS
?Cinder (openstack块存储)# openstack Cinder块存储
?Glusterfs
?VsphereVolume
?Quobyte卷
?HostPath #主机目录,仅用于单机测试。
?波特沃克斯卷
?ScaleIO卷
?存储
(1)光伏的关键配置参数
存储容量
描述存储设备的功能。目前只支持存储空间设置(存储:xxx)。
访问模式(访问模式)
设置PV的访问模式,以描述用户应用程序对存储资源的访问权限。访问模式如下:
?ReadWriteOnce:读写权限,只能由单个节点挂载。
?ReadOnlyMany:只读权限,可以由多个节点挂载。
?ReadWriteMany:读和写权限,可以由多个节点挂载。
注意:PV可能支持多种接入方式,但是PV在挂载时只能使用一种接入方式,多种接入方式不能同时生效。
不同类型的PV有不同的访问模式,在定义PV时需要进行匹配:
存储类别(类)
PV可以设置其存储类别,并通过storageClassName参数指定storageClass资源对象的名称。具有特定“类别”的PVC只能绑定到请求该“类别”的PVC。没有“类别”的PVC只能与不要求任何“类别”的PVC绑定。StorageClass资源对象将在未来的动态资源供应中显示出巨大的威力。
回收政策。
目前,支持以下三种回收策略:
?保留:保留数据,需要手工处理。
?Recycle:清除文件的简单操作(比如rm -rf /xx/*)。
?删除:连接PV的后端存储完成卷的删除(如AWS EBS、GCE PD、Azure Disk、OpenStack Cinder等设备的内部卷清理)。
注:目前只有NFS和hostPath支持“回收”,AWS EBS、GCE PD、Azure Disk和OpenStack Cinder支持“删除”。
(2)光伏的生命周期
PV在其生命周期中可能处于以下四个节点之一:
?可用:可用状态,也绑定到PVC。
?绑定:已经绑定到PVC。
?Released:绑定的PVC已被删除,资源已被释放,但未被集群回收。
?失败:自动资源恢复失败。
(3)光伏安装参数
在节点上装载PV时,可能需要根据后端存储的特征设置额外的装载参数。目前可以通过在PV的定义中设置一个名为“volumekubernetes . io/mount/options”的注释来实现。下面小编以一个gcePersistentDisk为例设置挂载参数:
apiVersion: v1
种类:持久卷
元数据:
名称:gce-disk-1
注释:
volume.beta.kubernetes.io/mount/options:丢弃
sepc:
容量:
存储:10Gi
访问模式:
-读写一次
gcePersistentDisk:
fsType: ext4
pdName: gce-disk-1
2.PVC的详细介绍
我们知道上面PV的定义,所以这里用,然后需要PVC。PVC作为用户对存储资源的需求应用,主要包括存储空间应用和访问方式。PV选择条件和存储类别的设置。
接下来,边肖还通过一个例子介绍了如何定义PVC使用PV:
kind: PersistentVolumeClaim
apiVersion: v1
元数据:
名称:我的索赔
sepc:
访问模式:
-读写一次
资源:
请求:
存储:8Gi
存储类名:慢
选择器:
匹配标签:
发布:稳定
匹配表达式:
- {key:环境,operator: In,值:[dev]}
申请8G空间,访问方式为“ReadWriteOnce”,PV选择条件包括标签“release=stable”和条件为“environment in dev”的标签,存储类别为慢速(系统中已有)。
其中,详细介绍了PVC的关键配置:
?资源请求:仅支持存储空间大小请求。
?资源请求:仅支持存储空间大小请求。
?PV的选择条件:通过标签选择器筛选出可用的PV,系统会根据标签找到合适的PV,并将PV与PVC绑定。
?存储类别:PVC在定义时可以设置后端存储的类别,减少对后端存储特性的依赖。系统只能筛选出此类PV,并将其绑定到PVC。
在这里,是否要为PVC设定阶级要求,边肖给出了详细的解释:
这里有两种情况:
?系统启用了defaultStorageClass。
?如果启用了defaultStorageClass,但系统中没有DefaultStorageClass,则相当于没有启用defaultstorageClass。
?如果启用了defaultStorageClass,并且系统中有一个DefaultStorageClass,则系统会自动为PVC创建一个PV(使用默认的defaultstorageClass)并绑定它们。
?系统未启用defaultStorageClass。
?如果将storageClass设置为“”或未设置storageClass字段,则只能选择没有storageclass的PV进行匹配和绑定。
设置默认storageClass的方法是在storageclass上定义一个批注“storageClass . kubernetes . io/is-default-class=true ”,但是不能为多个storage class设置批注。如果这不是唯一的,系统就不能为PVC创建相应的PV。
使用PV粘合PVC的注意事项:
?PV和PVC都受命名空间的限制,只有同一个命名空间的PV和PVC才能绑定,只有同一个命名空间的pod才能挂载PVC。
?当在PVC定义中同时设置了selector和storageClassName时,只有当两者都满足条件时,才能绑定PV和PVC。
3.PV和PVC的生命周期
PV可以看作是可用的存储资源,而PVC是对存储资源的请求。PV和PVC之间的关系如下图所示:
接下来,我们将逐一介绍:
(1)资源的供应(provisioning)
Kubernetes支持两种资源供应模式:静态模式和动态模式。资源供给的结果是创造一个好的PV。
?静态模式:集群管理员手动创建很多PV,定义PV时需要设置后端存储的特性。
?动态模式:集群管理员不需要手动创建PV,而是通过storageClass的设置来描述后端存储,并标记为“类型”。此时需要PVC声明存储类型,系统会自动完成PV创建到PVC的绑定。
(2)资源绑定
用户定义PVC后,系统会根据PVC对存储资源的要求,在现有的PV中选择一个符合PVC要求的PV。一旦找到,就会绑定到用户自定义的PVC上,然后用户的应用就可以使用这个PVC了。如果系统中没有符合PVC要求的PV,PVC将无限期地处于挂起状态,直到系统管理员创建符合其要求的PV。PV一旦绑定了一个PVC,就被这个PVC独占了,无法绑定其他PVC。这很容易造成资源的浪费。如果使用动态模式,系统会在为PVC找到合适的存储类后,自动创建一个PV并完成与PVC的绑定。
(3)利用资源
Pod利用卷的定义将PVC挂载到容器中的某个路径上使用。卷的类型是“persistentVolumeClaim”,将在下面的示例中详细解释。在容器应用程序安装了PVC之后,它可以继续独占使用。但是,多个机架可以安装同一个PVC。
(4)释放资源
当用户使用完存储资源后,用户可以删除该PVC,绑定到该PVC的PV将被标记为“已释放”,但不能立即绑定到其他PVC。通过以前的PVC写入的数据可能仍然保留在存储设备上,PV只有在被清除后才能再次使用。
(5)资源回收
对于PV,管理员可以设置一个回收策略,用于设置绑定到它的PVC释放资源后如何处理遗留数据。只有回收PV的存储空间,才能被新的PVC绑定使用。
最后,边肖通过两张图片介绍了静态资源供给模式和动态资源供给模式的原理,为下文做了铺垫:
静态模式下的PV和PVC原理
动态模式下存储类、PV和PVC的原理
4.存储课程详细介绍
(1)存储类的介绍和简单定义
StorageClass作为存储资源的抽象定义,为用户设置的PVC应用屏蔽了后端存储的细节,一方面让用户不必关注存储资源的细节,另一方面也让管理员从手动管理PV中解脱出来,系统自动完成PV的创建和绑定,从而实现动态资源供应。
对于存储类的定义主要包括:名称、后端存储的提供者和后端存储的相关参数配置存储类一旦被创建出来,将无法修改。如需要修改,只能删除原先创建的存储类重新构建。下面是一个定义存储类的例子:
种类:存储类
应用程序接口版本:storage.k8s.io/v1
元数据:
名称:标准
供应方:kubernetes.io/aws-ebs
参数:
类型:gp2
上面的例子就定义了一个名为"标准",提供者为“aws-ebs”,其参数为gp2的存储类。
其中定义存储类中有两个重点参数:
?供应方(提供者):描述存储资源的提供者,也可以看做是后端存储驱动。目前粮食供应者都是以“Kubernetes.io/"为开头
?参数(参数):后端资源提供者的参数设置,不同的粮食供应者包括不同的参数设置
(2)几种常见的粮食供应者对存储类的定义:
AWS EBS存储卷
种类:存储类
应用程序接口版本:storage.k8s.io/v1
元数据:
名称:慢
置备者:
kubernetes.io/aws-ebs
参数:
类型:io1
区域:美国东部-1d
iopsPerGB: 10
参数说明:
?类型:可选有:io1、gp2、sc1、st1、默认是gp2
?区域:AWS区域名称
?iopPerGB:仅用于io1类型的音量,意为每秒每G的输入-输出操作数量
?加密:是否加密
?kmsKeyId:加密时的亚马逊资源名称
GCE PD存储卷
种类:存储类
应用程序接口版本:storage.k8s.io/v1
元数据:
名称:慢
供应方:kubernetes.io/gce-pd
参数:
类型:PD-标准
区域:美国中央a区
参数说明:
?类型:可选项有:pd标准、pd固态硬盘,默认是PD-标准
?区域:GCE区域名称
GlusterFS存储卷
应用程序接口版本:storage.k8s.io/v1
种类:存储类
元数据:
名称:慢
供应方:kubernetes.io/glusterfs
参数:
resturl: http://127.0.0.1:8081
群集id:44 ad 5 as 1 FD 5 AE 1 FDE 1 fwe 1 D5 we1d 5
restauthenabled: true
restuser: admin
secreNamespace:默认
秘密姓名:何克缇爵士
吉德明:4万
gidMax: 5万
卷类型:复制:3
参数说明:
?resturl:Gluster REST服务(赫克提)网址地址,用于自动完成GlusterFSvolume的设置
?restauthenabled:访问格鲁斯特休息服务启用安全机制
?restuser:访问格鲁斯特休息服务的用户名
?秘密命名空间和secretName:保存访问格鲁斯特休息服务密码的秘密的资源对象名
?群集:GlusterFS的集群身份证明
?吉德明和gidMax:存储类的情报总部(情报总局)的范围,用于动态创建资源供应时产品鉴定(生产验证)设置的情报总部(情报总局)
?卷类型:GlusterFS的卷类型设置,例如:复制:3表示复制的类型3个副本
露天煤渣存储卷
种类:存储类
应用程序接口版本:storage.k8s.io/v1
元数据:
名称:金色
供应方:kubernetes.io/cinder
参数:
类型:快速
可用性:nova
参数说明:
?类型:煤渣的卷类型,默认为空
?可用性:可用性区域,默认为空
(3) 设置默认的存储类
要在系统中设置一个默认的存储类,首先需要启动名为"默认存储类"的准入控制器,即在kube-apiserver的命令参数中的准入控制中增加:默认存储类
例:admission-control=" xxx,xxx,XXX,DefaultStorageClass "
种类:存储类
应用程序接口版本:storage.k8s.io/v1
元数据:
名称:金色
注释:storage classkubernetes . io/is-default-class=true
供应方:kubernetes.io/gce-pd
参数:
类型:PD-固态硬盘
然后创建这个存储类,此时我们在通过命令可查看:
[:root]kubelet get sc -n=xxx
注意:默认的存储类只能设置一个,否则系统会因为多个系统默认值引起冲突,而不知道筛选哪一个为默认的,最终导致默认的存储类不生效。
5.动态存储管理实战,GlusterFS
本案例从定义storageClass、创建storageFS和Heketi服务、用户申请PVC到创建Pod使用存储资源,详细讲解了storageClass和动态资源分配,并进一步分析了kubernetes的存储机制。
这里的情况是指:
https://www.cnblogs.com/xiaoqshuo/p/10096682.html和《kubernetes权威指南》
(1)概念介绍
1)分布式文件系统概述-GlusterFS
GlusterFS是横向扩展存储解决方案Gluster的核心。它是一个开源的分布式文件系统,具有很强的水平扩展能力,可以支持数Pb的存储容量,处理数千个客户端。GlusterFS使用TCP/IP或InfiniBand RDMA网络将物理上分布的存储资源聚集在一起,并使用单个全局命名空间来管理数据。GlusterFS基于可堆叠的用户空间设计,可以为各种数据负载提供出色的性能。
GlusterFS支持在任何标准IP网络上运行的标准应用程序的标准客户端,用户可以在全球统一的名称空间中使用标准协议(如NFS/CIFS)访问应用程序数据。GlusterFS使用户摆脱原来独立、高成本的封闭存储系统,用普通廉价的存储设备部署集中管理、横向扩展、虚拟化的存储池,存储容量可扩展到TB/PB级别。
GlusterFS以原始数据格式(如EXT3、EXT4、XFS、ZFS)存储数据,并实现各种数据自动修复机制。
架构图:
这里只是带你了解GlusterFS,从而了解后面PVC装裱的内容,不用走太远。
2)赫克提服务
Heketi service是一个提供REST ful API管理GlusterFS卷的框架,可以在kubernetes、openstack等云平台上实现动态存储资源供应,支持GlusterFS的多集群管理,方便管理员操作GlusterFS。下图简要介绍了合客体服务的功能:
(2)实际施工
在计划用于GlusterFS的每个节点上安装GlusterFS客户端。
# yum install glusterfs glusterfs-fuse-y
在要启动的GlusterFS的每个节点上,在master的kube-apiserver服务和kubelet服务的启动参数中输入allow-privileged=true。
加载指定的单个模块。
modprobe dm _快照
modprobe dm_mirror
modprobe dm _精简池
(4)标记要部署GlusterFS的节点,以便将GlusterFS容器定向部署到安装GlusterFS的节点。
[root @ k8s-master 01 ~]# ku bectl label node k8s-node-1 storage node=glusterfs
标记了节点/k8s-节点-1
[root @ k8s-master 01 ~]# ku bectl label node k8s-node-2 storage node=glusterfs
标记了节点/k8s-节点-2
[root @ k8s-master 01 ~]# ku bectl label node k8s-node-3 storage node=glusterfs
标记了节点/k8s-节点-3
创建一个GlusterFS管理服务容器集群。
#glusterfs-daemonset.yaml:
种类:达蒙塞特
apiVersion:扩展/v1beta1
元数据:
名称:glusterfs
标签:
glusterfs: daemonset
注释:
描述:GlusterFS DaemonSet
标签:glusterfs
规格:
模板:
元数据:
名称:glusterfs
标签:
glusterfs-节点:pod
规格:
节点选择器:
存储节点:glusterfs
主机网络:正确
容器:
-图片:gluster/gluster-centos:最新
名称:glusterfs
卷安装:
-名称:glusterfs-heketi
挂载路径:/var/lib/heketi
-名称:glusterfs-run
挂载路径:/run
-名称:glusterfs-lvm
挂载路径:/run/lvm
-名称:glusterfs-等
挂载路径:/etc/glusterfs
-名称:glusterfs-log
挂载路径:/var/log/glusterfs
-名称:glusterfs-config
挂载路径:/var/lib/glusterd
-名称:glusterfs-dev
挂载路径:/dev
-名称:glusterfs-misc
挂载路径:/var/lib/misc/glusterfsd
-名称:glusterfs-cgroup
挂载路径:/sys/fs/cgroup
只读:真
-名称:glusterfs-ssl
挂载路径:/etc/ssl
只读:真
安全上下文:
功能:{}
特权:真
就绪探针:
超时秒数:3
初始延迟秒数:60
执行:
命令:
- /bin/bash
-丙
-系统ctl状态glusterd .服务
活性探针探测器:
超时秒数:3
初始延迟秒数:60
执行:
命令:
- /bin/bash
-丙
-系统ctl状态glusterd .服务
体积:
-名称:glusterfs-heketi
主机路径:
路径:/var/lib/heketi
-名称:glusterfs-run
-名称:glusterfs-lvm
主机路径:
路径:/run/lvm
-名称:glusterfs-等
主机路径:
路径:/etc/glusterfs
-名称:glusterfs-log
主机路径:
路径:/var/log/glusterfs
-名称:glusterfs-config
主机路径:
路径:/var/lib/glusterd
-名称:glusterfs-dev
主机路径:
路径:/dev
-名称:glusterfs-misc
主机路径:
路径:/var/lib/misc/glusterfsd
-名称:glusterfs-cgroup
主机路径:
路径:/sys/fs/cgroup
-名称:glusterfs-ssl
主机路径:
路径:/etc/ssl
# kube let create-f glusterfs-daemonset。YAML #创建
#kubectl获取豆荚#查看
名称就绪状态重新开始老化
glusterfs-fvxh7 1/1运行0 47米
glusterfs-jjw7b 1/1跑0 47米
glusterfs-td875 1/1运行0 47米
创建赫克提服务
在部署赫克提之前,需要为他创建一个服务帐户对象:
#heketi-service-account.yaml
apiVersion: v1
种类:服务帐户
元数据:
名称:赫克提服务账户
# kube让我们创建一个keti服务帐户。YAML
#heketi-deployment-svc.yaml
种类:部署
apiVersion:扩展/v1beta1
元数据:
名称:部署-赫克提
标签:
格鲁斯特夫斯:他克提-部署
部署-黑克提:黑克提-部署
注释:
描述:定义如何部署赫克提
规格:
宗教:1
模板:
元数据:
名称:部署-赫克提
标签:
glusterfs: heketi-pod
规格:
服务帐户名称:he keti-服务-帐户
容器:
-图片:赫克提/赫克提:开发
名称:部署-赫克提
环境:
-姓名:赫克提_遗嘱执行人
价值:kubernetes
-名称:HEKETI_FSTAB
值:/var/lib/heketi/fstab
-名称:赫克提_快照_限制
数值:14
-名称:赫凯蒂KUBE格鲁斯特达昂森
值:y
端口:
-集装箱港口:8080
卷安装:
-名称:db
挂载路径:/var/lib/heketi
就绪探针:
超时秒数:3
初始延迟秒数:3
httpGet:
路径:/你好
端口:8080
活性探针探测器:
超时秒数:3
初始延迟秒数:30
httpGet:
路径:/你好
端口:8080
体积:
-名称:db
主机路径:
路径:/heketi-data
-
种类:服务
apiVersion: v1
元数据:
名称:部署-赫克提
标签:
glusterfs: heketi-service
部署-赫克蒂:支持
注释:
描述:公开赫克提服务
规格:
选择器:
名称:部署-赫克提
端口:
-名称:部署-赫克提
端口:8080
目标港口:8080
# ku删除create-f he keti-deployment-SVC。YAML
为赫克提设置GlusterFS集群
在赫克提能管理GlusterFS集群之前,需要为其设置GlusterFS集群信息。可以使用json配置文件传入,并且赫克提要求一个GlusterFS集群至少有3各节点。
#topology.json
{
群集:[
{
节点:[
{
节点:{
主机名:{
管理:[
k8s-节点-1
],
存储:[
192.168.2.100
]
},
区域:1
},
设备:[
{
名称:/dev/sdb
}
]
},
{
节点:{
主机名:{
管理:[
k8s-节点-2
],
存储:[
192.168.2.101
]
},
区域:1
},
设备:[
{
名称:/dev/sdc
}
]
},
{
节点:{
主机名:{
管理:[
k8s-节点-3
],
存储:[
192.168.2.102
]
},
区域:1
},
设备:[
{
名称:/dev/sdb
}
]
}
]
}
]
}
然后进入赫克提的容器中,执行:
# export he keti _ CLI _ SERVER=http://localhost:8080
#heketi-cli拓扑加载JSON=拓扑。JSON
完成以上操作,合克缇就完成了GlusterFS集群的创建,同时在GlusterFS集群的各个节点上的/dev/sdb盘上成功创建了产品鉴定(生产验证)和VG。
注意:/dev/sdb一定要是未创建文件系统的裸设备。
#查看(同GoogleFileSystem)谷歌文件系统信息
[root @ k8s-node-1 kubernetes]# he keti-CLI拓扑信息
(3) 测试
集群创建成功之后,当然我们要试试,存储类的功能能不能用啊:
定义存储类
#存储类-g光泽-贺克缇。YAML
应用程序接口版本:storage.k8s.io/v1
种类:存储类
元数据:
姓名:格鲁斯特-赫克蒂
供应方:kubernetes-io/glusterfs
参数:
resturl: http://172.17.2.2:8080
restauthenabled: false
定义聚氯乙烯
#pvc-gluster-heketi.yaml(使用动态资源供应模式)
kind: PersistentVolumeClaim
apiVersion: v1
元数据:
名称:pvc-gluster-heketi
规格:
存储类名称:格鲁斯特-赫克蒂
访问模式:
-读写一次
资源:
请求:
存储:1Gi
#可以通过命令查看pv,和自动创建的聚氯乙烯
#库伯莱获取聚氯乙烯
#库伯莱获取页面浏览量(page view)
使用豆荚挂载聚氯乙烯
#pod-use-pvc.yaml
apiVersion: v1
种类:豆荚
元数据:
名称:pod-用途聚氯乙烯
规格:
容器:
-名称:pod-用途聚氯乙烯
图片:busybox
命令:
-睡觉
- 3600
卷安装:
-名称:Glu ster-音量
挂载路径:/PV-数据
只读:假
体积:
-名称:Glu ster-音量
持续量声明:
产品名称:pvc-gluster-heketi
# kube let create-f pod-use-PVC。YAML #创建这个豆荚
然后进入容器:
# kube let exec-it pod-use-PVC/bin/sh
在其中的/pv-data目录创建文件,然后验证文件在GlusterFS集群中是否生效!
文章内容参考至《kubernetes权威指南》
更多关于云服务器,域名注册,虚拟主机的问题,请访问西部数码代理商官网:www.chenqinet.cn