K8S专栏Kubernetes数据持久化管理
Kubernetes为了能更好的支持有状态应用的数据存储问题,除了基本的HostPath和EmptyDir提供的数据持久化方案之外,还提供了PV,PVC和StorageClass资源对象来对存储进行管理。
PV的全称是PersistentVolume(持久化卷),是对底层数据存储的抽象,PV由管理员创建、维护以及配置,它和底层的数据存储实现方法有关,比如Ceph,NFS,ClusterFS等,都是通过插件机制完成和共享存储对接。
PVC的全称是PersistentVolumeClaim(持久化卷声明),我们可以将PV比喻为接口,里面封装了我们底层的数据存储,PVC就是调用接口实现数据存储操作,PVC消耗的是PV的资源。
StorageClass是为了满足用于对存储设备的不同需求,比如快速存储,慢速存储等,通过对StorageClass的定义,管理员就可以将存储设备定义为某种资源类型,用户根据StorageClass的描述可以非常直观的知道各种存储资源的具体特性,这样就可以根据应用特性去申请合适的资源了。
安装存储系统
存储系统的选择有很多,常见的有NFS、Ceph、GlusterFS、FastDFS等,具体使用什么根据企业情况而定。在这里使用的是NFS,下面简单介绍一下如何安装。
(1)安装服务yuminstallnfsutilsrpcbindy
(2)创建共享目录mkdirdatak8sp
(3)配置NFS配置文件vimetcexports
datak8s(rw,sync,norootsquash)
(4)启动服务systemctlstartrpcbind
systemctlstartnfs
systemctlenablerpcbind
systemctlenablenfs
(5)测试showmounte192。168。205。128
Exportlistfor192。168。205。128:
datak8s
PS:所有节点都需要安装NFS客户端
PV
PV(PersistentVolume)作为Kubernetes存储设备,可以由管理员提前配置,也可以通过StorageClass来动态供应。
PV是集群资源,可以通过kubectlexplainpv来查看如何配置,主要包括存储能力,访问模式,存储类型,回收信息等关键信息。例如:apiVersion:v1
kind:PersistentVolume
metadata:
name:mypv01
labels:
storage:pv
spec:
accessModes:
ReadWriteOnce
capacity:
storage:1Gi
persistentVolumeReclaimPolicy:Recycle
nfs:
path:datak8s
server:192。168。205。128
参数说明:(1)、accessMode:访问模式,有ReadWriteOnce,ReadOnlyMany,ReadWriteMany。其中:
ReadWriteOnce:表示具有读写权限,但是只能被一个node挂载一次
ReadOnlyMany:表示具有只读权限,可以被多个node多次挂载
ReadWriteMany:表示具有读写权限,可以被多个node多次挂载
(2)、capacity:持久卷资源和容量的描述,存储大小是唯一可设置或请求的资源。(3)、persistentVolumeReclaimPolicy:回收策略,也就是释放持久化卷时的策略,其有以下几种:
Retain:保留数据,如果要清理需要手动清理数据,默认的策略;
Delete:删除,将从Kubernetes中删除PV对象,以及外部基础设施中相关的存储资产,比如AWSEBS,GCEPD,AzureDisk,或Cindervolume;
Recycle:回收,清楚PV中的所有数据,相当于执行rmrfpvvolume;
创建过后,PV的状态如下:kubectlgetpv
NAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGE
mypv011GiRWORecycleAvailable5s
kubectldescribepvmypv01
Name:mypv01
Labels:storagepv
Annotations:none
Finalizers:〔kubernetes。iopvprotection〕
StorageClass:
Status:Available
Claim:
ReclaimPolicy:Recycle
AccessModes:RWO
VolumeMode:Filesystem
Capacity:1Gi
NodeAffinity:none
Message:
Source:
Type:NFS(anNFSmountthatlaststhelifetimeofapod)
Server:192。168。205。128
Path:datak8s
ReadOnly:false
Events:none
当前PV的状态是Available,表示处于随时可用状态。PV总共有以下四种状态:
Available(可用):表示可用状态,还未被任何PVC绑定
Bound(已绑定):表示PVC已经被PVC绑定
Released(已释放):PVC被删除,但是资源还未被集群重新声明
Failed(失败):表示该PV的自动回收失败
单纯的创建PV,我们并不能直接使用,需要使用PVC(PersistentVolumeClaim)来进行声明。
PVC
PVC(PersistentVolumeClaim)用于表达用户对存储的需求,申请PVC会消耗掉PV的资源,可以通过kubectlexplainpvc来查看帮助文档。
在上一节我们创建了PV,现在要申明PVC,如下:apiVersion:v1
kind:PersistentVolumeClaim
metadata:
name:pvctest
spec:
accessModes:
ReadWriteOnce
resources:
requests:
storage:1Gi
spec参数说明:
(1)、accessModes:主要定义卷所应该拥有的访问模式
(2)、resources:主要定义卷应该拥有的最小资源
(3)、dataSource:定义如果提供者具有卷快照功能,就会创建卷,并将数据恢复到卷中,反之不创建
(4)、selector:定义绑定卷的标签查询
(5)、storageClassName:定义的storageClass的名字
(6)、volumeMode:定义卷的类型
(7)、volumeName:需要绑定的PV的名称链接
创建过后,查看PV和PVC的状态,如下:kubectlgetpvc
NAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGE
pvctestBoundmypv011GiRWO2s
kubectlgetpv
NAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGE
mypv011GiRWORecycleBounddefaultpvctest20m
我们从上面可以看到pvc处于Bound状态,Bound的VOLUME是mypv01,我们再看pv的状态有Available变为Bound,其CLAIM是defaultpvctest,其中default为namespace名称。
在上面我们创建了一个PVC,其绑定了我们创建的PV,如果此时我们再创建一个PVC,结果又会如何?我们copy以下上面的PVC文件,将其名称改一下,如下:apiVersion:v1
kind:PersistentVolumeClaim
metadata:
name:pvctest2
spec:
accessModes:
ReadWriteOnce
resources:
requests:
storage:1Gi
然后查看PVC的状态,如下kubectlgetpvc
NAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGE
pvctestBoundmypv011GiRWO3m57s
pvctest2Pending4s
我们可以看到我们刚创建的pvctest2的STATUS处于Pending状态,这是由于集群里声明的PV都使用完了,PVC在申请的时候没有找到合适的PV,所以处于这个状态,这时候如果我们创建一个新的并满足要求的PV,则可以看到这个PVC会处于Bound状态。如下:kubectlgetpv
NAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGE
mypv011GiRWORecycleBounddefaultpvctest27m
mypv021GiRWORecycleAvailable5s
kubectlgetpvc
NAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGE
pvctestBoundmypv011GiRWO6m50s
pvctest2Boundmypv021GiRWO2m57s
PVC也在申领PV的时候也不是随意申领的,它需要符合以下要求:(1)PVC申领的模式要和PV匹配上,假如PVC的模式是ReadWriteOnce,而PV的模式是ReadWriteMany,则申领部成功。(2)PVC申领的容量要小于等于PV的容量,否则申请不成功。(3)一个PV只能绑定一个PVC
另外,如果我们的PVC需求的容量小于PV的可用容量,绑定的容量是PV的可用容量。
StorageClass
上面介绍的PV和PVC模式是需要运维人员先创建好PV,然后开发人员定义好PVC进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高,Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。
具体来说,StorageClass会定义一下两部分:
PV的属性,比如存储的大小、类型等;
创建这种PV需要使用到的存储插件,比如Ceph等;
有了这两部分信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用StorageClass声明的存储插件,创建出需要的PV。
这里我们以NFS为例,要使用NFS,我们就需要一个nfsclient的自动装载程序,我们称之为Provisioner,这个程序会使用我们已经配置好的NFS服务器自动创建持久卷,也就是自动帮我们创建PV。说明:
自动创建的PV会以{pvcName}{pvName}的目录格式放到NFS服务器上;
如果这个PV被回收,则会以archieved{pvcName}{pvName}这样的格式存放到NFS服务器上;
安装NFSProvisioner
(1)创建ServiceAccount,为NFSProvisioner授权strongtoutiaooriginspanclasshighlighttextstrong
apiVersion:v1
kind:ServiceAccount
metadata:
name:nfsclientprovisioner
strongtoutiaooriginspanclasshighlighttextstrong
apiVersion:rbac。authorization。k8s。iov1
kind:ClusterRole
metadata:
name:nfsclientprovisionerclusterrole
rules:
apiGroups:〔〕
resources:〔persistentvolumes〕
verbs:〔get,list,watch,create,delete〕
apiGroups:〔〕
resources:〔persistentvolumeclaims〕
verbs:〔get,list,watch,update〕
apiGroups:〔storage。k8s。io〕
resources:〔storageclasses〕
verbs:〔get,list,watch〕
apiGroups:〔〕
resources:〔events〕
verbs:〔list,watch,create,update,patch〕
apiGroups:〔〕
resources:〔endpoints〕
verbs:〔create,delete,get,list,watch,patch,update〕
strongtoutiaooriginspanclasshighlighttextstrong
apiVersion:rbac。authorization。k8s。iov1
kind:ClusterRoleBinding
metadata:
name:nfsclientprovisionerclusterrolebinding
subjects:
kind:ServiceAccount
name:nfsclientprovisioner
namespace:default
roleRef:
kind:ClusterRole
name:nfsclientprovisionerclusterrole
apiGroup:rbac。authorization。k8s。io
(2)创建NFSProvisionerstrongtoutiaooriginspanclasshighlighttextstrong
apiVersion:appsv1
kind:Deployment
metadata:
name:nfsclientprosioner
spec:
replicas:1
strategy:
type:Recreate
selector:
matchLabels:
app:nfsclientprosioner
template:
metadata:
labels:
app:nfsclientprosioner
spec:
serviceAccountName:nfsclientprovisioner
containers:
name:nfsclientprosioner
image:registry。cnhangzhou。aliyuncs。comrookieopsnfsclientprovisioner:4。0
imagePullPolicy:IfNotPresent
volumeMounts:
name:nfsclientroot
mountPath:datapv
env:
name:PROVISIONERNAME
value:rookieopsnfs
name:NFSSERVER
value:192。168。205。128
name:NFSPATH
value:datak8s
volumes:
name:nfsclientroot
nfs:
server:192。168。205。128
path:datak8s
执行完成后,查看NFSProvisioner的状态,如下:kubectlgetpo
NAMEREADYSTATUSRESTARTSAGE
nfsclientprosioner54d64dfc85b4ht411Running010s
使用StorageClass
上面已经创建好NFSProvisioner,现在我们可以直接创建StroageClass,如下:apiVersion:storage。k8s。iov1
kind:StorageClass
metadata:
name:nfs
provisioner:rookieopsnfs
每个StorageClass都包含provisioner、parameters和reclaimPolicy字段,这些字段会在StorageClass需要动态分配PersistentVolume时会使用到。
在配置StorageClass的时候,如果没有指定reclaimPolicy,则默认是Delete,除此之外,还有Retain。
StorageClass对象的命名很重要,用户使用这个命名来请求生成一个特定的类。当创建StorageClass对象时,管理员设置StorageClass对象的命名和其他参数,一旦创建了对象就不能再对其更新。
使用kubectlapplyfsc。yaml创建StorageClass,创建完成过后如下:kubectlgetsc
NAMEPROVISIONERRECLAIMPOLICYVOLUMEBINDINGMODEALLOWVOLUMEEXPANSIONAGE
nfsrookieopsnfsDeleteImmediatefalse9m41s
现在,我们就可以使用动态存储申领PVC,如下:apiVersion:v1
kind:PersistentVolumeClaim
metadata:
name:pvcfromsc
spec:
accessModes:
ReadWriteOnce
storageClassName:nfs
resources:
requests:
storage:1Gi
使用kubectlapplyfpvcfromsc。yaml,查看PVC创建情况,如下:kubectlgetpvc
NAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGE
pvcfromscBoundpvca4a71b8c56644d1ab2869e4adcf6f96a1GiRWOnfs8s
kubectlgetpv
NAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGE
pvca4a71b8c56644d1ab2869e4adcf6f96a1GiRWODeleteBounddefaultpvcfromscnfs86s
可以看到自动创建了一个PV,然后和PVC进行绑定。
为了方便使用,有时候会给集群默认设置一个StorageClass,以便在需要使用动态存储,但是未声明的情况下使用默认的动态存储。设置方式如下:kubectlpatchstorageclassnfsp{metadata:{annotations:{storageclass。kubernetes。ioisdefaultclass:true}}}
通过向其添加storageclass。kubernetes。ioisdefaultclass注解来将特定的StorageClass标记为默认。当集群中存在默认的StorageClass并且用户创建了一个未指定storageClassName的PersistentVolumeClaim时,DefaultStorageClass准入控制器会自动向其中添加指向默认存储类的storageClassName字段。
请注意,集群上最多只能有一个默认存储类,否则无法创建没有明确指定storageClassName的PersistentVolumeClaim。
如果要取消默认StorageClass,只需要把注解设置为flase即可,如下:kubectlpatchstorageclassnfsp{metadata:{annotations:{storageclass。kubernetes。ioisdefaultclass:false}}}
如果我们要在Pod中使用PVC,则直接如下声明:apiVersion:v1
kind:Pod
metadata:
name:nginx
spec:
containers:
name:nginx
image:nginx
imagePullPolicy:IfNotPresent
volumeMounts:
name:nfspvc
mountPath:mnt
restartPolicy:Never
volumes:
name:nfspvc
persistentVolumeClaim:
claimName:pvcfromsc
可以进入容器,到挂载目录输出,例如:kubectlexecitnginxbinbash
rootnginx:mntechotestmnttext。txt
然后到NFS对应的目录查看是否一致。cddatak8sdefaultpvcfromscpvca4a71b8c56644d1ab2869e4adcf6f96a
cattext。txt
test
这表示Pod使用持久化成功。
总结
在Kubernetes中,虽然我们建议使用无状态应用,但是对于有些特殊应用,数据持久化还是必不可少的。数据持久化的难度不在于创建几个PV或者PVC,而是后端的存储系统,比如Ceph,如果使用它作为后端存储,你必须对其非常熟悉,方便在出问题的时候好排查,如果你对这些存储系统都不熟悉,在使用的时候可能会出现很多问题。
最后,求关注。如果你还想看更多优质原创文章,欢迎关注我们的公众号运维开发故事。
如果我的文章对你有所帮助,还请帮忙一下,你的支持会激励我输出更高质量的文章,非常感谢!
你还可以把我的公众号设为星标,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新。
福建福州市晋安区宦溪镇种好菜园子丰富菜篮子细雨凉风,山间浓雾骤起,不一会儿就将福建省福州市晋安区宦溪镇鹅鼻村种植户黄学快的农房笼罩。屋边,30亩绿油油的萝卜缨泛起霜白,屋角堆放的包装箱上,隐约可见鹅鼻萝卜几个大字。2022
多瑙河是如何进行流域治理的多瑙河位于欧洲东南部,是欧洲第二长河,全长2857公里。它发源于德国西南部,其干流自西向东流经欧洲十几个国家,是世界上流域面积覆盖国家最多的一条国际河流,流域面积达81。7万平方公
知乎者也丨万代辉历史吹来的风百年古街白石与红砖垒起不曾褪色的精神立面,镶嵌着先辈打拼的身影。二千米瘦长的商业古街,藤般捆扎在东南的山海腹部,担起五百年历史的厚重。被誉官马大道,流动着大明王朝的商业指南与气息。
毛主席视察东北后大怒,亲令彻查反腐,42人判死刑,上万贪官入狱1950年,毛主席来到了东北,目的是视察当地的工业基地,从而制定下一步发展计划。然而,让所有人没有想到的是,毛主席来到沈阳后,竟然勃然大怒,将42人都判处了死刑,光是关押的贪官污吏
姬和姫字形相似,读音和意义却大不相同,你能分得清吗?据统计,中国汉字约有10万个,汉字也是目前为止使用时间最长的文字。这么多汉字中,有很多看似很像,其实意义却大不相同的汉字。比如这两个姬和姫。我们先说姬。在说文解字当中,提到姬,原话
张隆前妻再发李梦不雅照!脐环纹身吃蛋糕,李梦主动提出和解最近体坛实在不太平,丑闻接二连三,而28岁的女篮核心成员李梦,也正遭受着出道以来最大的舆论危机。一位自称前女篮领队的张隆的前妻,不仅曝光了张隆婚内出轨李梦,还将李梦与张隆的裸聊照片
关于拉皮手术最全指南,送给45岁后需要的人(医生整理)对于面部松弛下垂法令纹重多余堆积皮肤多的人来说,最终还需要拿起抗衰的终极武器来对抗,但由于她们对拉皮的了解甚少,走弯路的并不少见。今天就拉皮手术的常见问题,我做了一份整理,算是一个
传世无双法战的魅力你知道吗?无论是大佬玩家还是打金玩家都爱大家好,我是小C。今天给大家讲讲传世无双,这是一款三职业带元神的传奇世界手游,上线就能激活元神,使用合击技能!领取免费会员,提升会员等级,解锁超多权益!那么,小编就跟大家讲讲这款传
这4种食材,吃前不焯水等于吃毒!中毒还伤胃!经常做饭的朋友都知道,有些食材烹调之前都要焯水的,这样不仅能够去除有害物质,而且能保证食材的口感。有时候因为时间或者其他原因,就把焯水省略了,直接下锅烹饪。但是有些食材不焯水等于吃
脑梗塞的预防和治疗脑梗塞是一种常见的脑血管疾病,它是由于脑部供血不足或中断,导致脑细胞受损或死亡的情况。脑梗塞患者可能会出现失语偏瘫认知障碍等严重后果,严重影响了患者的生活质量。因此,预防和治疗脑梗
二十四节气春分节气养生篇春分是春季九十天的中分点,同时也是昼与夜的平分点。春分一到,阳气渐升,和阴气正好相等。相对应的,此时养生最重要的一点也是保持人体的阴阳平衡,重点要讲求平和,以和为贵,以平为期。春分
存储巨头竞逐HBM由于处理器与存储器的工艺封装需求的不同,从1980年开始至今二者之间的性能差距越来越大。有数据显示,处理器和存储器的速度失配以每年50的速率增加。存储器数据访问速度跟不上处理器的数
开年第一块大屏!OLED电视选购指南来了稿源中关村在线2023年的第一个假期已经结束,不知各位是否还沉浸在元旦期间的欢乐呢?说到小长假的全家老小团聚,没有什么比看电影更合适的活动了。这时候你就需要一块显示效果满分的大屏,
雷柏MT510机械键盘体验自主线性快银轴手感轻快办公之选雷柏,作为国产外设领军品牌,近年来也是推出了不少优秀的外设产品,从商务办公到游戏电竞,可以说是满足了不同人群的使用需求。最近,雷柏又推出了一款全新的MT510有线背光机械键盘,采用
从阿布洛哈去北京2月26日,四川省凉山彝族自治州布拖县阿布洛哈村,村党支部书记兼村委会主任吉列子日在施工现场向远处眺望,村民们在空地上搭建星空帐篷营地。吉列子日亲自设计的村庄产业规划图,包括民宿旅
中国奉陪到底!44艘舰船围堵菲占中业岛,菲律宾想掀桌,中国奉陪最近一段时间,在美国的怂恿之下,南海的整体局势并不算太平。此前在南海问题上颇为老实的菲律宾,自以为得到了美国的支持,又开始在南海兴风作浪。不仅多次在仁爱礁仙宾礁问题上制造事端,菲律
泰山景区游客烧纸祈福险酿祸,野外用火被处罚近日,泰山景区综合行政执法局南天门执法大队办理了一起外地游客违规在泰山景区禁火区内野外烧纸祈福的案件,对涉案当事人陈某某拟处行政处罚。2月20日,陈某某因家庭变故,与谢某某姚某等共
独上威虎山来源绿色中国文康胜利那年已是深秋,天气渐凉。乘坐乡间小公交车,我从牡丹江出发,去探访向往已久的威虎山。威虎山距牡丹江市区有几十公里,司机师傅让我在一个叫横道的地方下车。从懂事的年纪
深圳市大与文体度假中心深圳市大与文体度假中心总占地面积为10万平米,坐落于横岗中心区,群山环绕,风景宜人,是都市人的世外桃源。中心总建筑面积约为6万平米,主要经营范围有羽毛球篮网足高尔夫,游泳,台球,乒
放错国歌?是否无心之失,其实有目共睹!2月28日,世界冰球锦标赛第三级别比赛中,中国香港男子冰球代表队出战伊朗队,以111大比分胜出,原本胜利的喜悦心情,却被赛会举办方恶意破坏,其在赛后播放国歌时,将义勇军进行曲错播为
舒波莫廷慕尼黑让我有家的感觉在拜仁一切的东西都是正确的直播吧3月4日讯此前,拜仁官方宣布,俱乐部与舒波莫廷续约至2024年。拜仁体育董事萨利在接受采访时表示我们很高兴能与舒波莫廷续约,他将在俱乐部再待一年。他是一位球场艺术家,近年来他
国脚不能练就离开,扬科维奇在国足开始立威国足在海口已经展开了集训,新帅扬科维奇第一天就整出了动静,值得外界好好品味。在所有国脚之中,艾克森无疑是最为引人注目的。当天中午的时候,他还在自己的社交账号上展示全新的黄色国足战袍