K8SNFS共享存储
10月26日 星宿房投稿 NFS共享存储
前面我们学习了hostPath与LocalPV两种本地存储方式,但是平时我们的应用更多的是无状态服务,可能会同时发布在不同的节点上,这个时候本地存储就不适用了,往往就需要使用到共享存储了,比如最简单常用的网络共享存储NFS,本节课我们就来介绍下如何在Kubernetes下面使用NFS共享存储。安装
我们这里为了演示方便,先使用相对简单的NFS这种存储资源,接下来我们在节点192。168。31。31上来安装NFS服务,数据目录:varlibk8sdata
关闭防火墙systemctlstopfirewalld。servicesystemctldisablefirewalld。service
安装配置nfsyumyinstallnfsutilsrpcbind
共享目录设置权限:mkdirpvarlibk8sdatachmod755varlibk8sdata
配置nfs,nfs的默认配置文件在etcexports文件下,在该文件中添加下面的配置信息:vietcexportsvarlibk8sdata(rw,sync,norootsquash)
配置说明:varlibk8sdata:是共享的数据目录:表示任何人都有权限连接,当然也可以是一个网段,一个IP,也可以是域名rw:读写的权限sync:表示文件同时写入硬盘和内存norootsquash:当登录NFS主机使用共享目录的使用者是root时,其权限将被转换成为匿名使用者,通常它的UID与GID,都会变成nobody身份
当然nfs的配置还有很多,感兴趣的同学可以在网上去查找一下。
启动服务nfs需要向rpc注册,rpc一旦重启了,注册的文件都会丢失,向他注册的服务都需要重启注意启动顺序,先启动rpcbindsystemctlstartrpcbind。servicesystemctlenablerpcbindsystemctlstatusrpcbindrpcbind。serviceRPCbindserviceLoaded:loaded(usrlibsystemdsystemrpcbind。vendorpreset:enabled)Active:active(running)sinceTue2018071020:57:29CST;1min54sagoProcess:17696ExecStartsbinrpcbindwRPCBINDARGS(codeexited,status0SUCCESS)MainPID:17697(rpcbind)Tasks:1Memory:1。1MCGroup:system。slicerpcbind。service17697sbinrpcbindwJul1020:57:29mastersystemd〔1〕:StartingRPCbindservice。。。Jul1020:57:29mastersystemd〔1〕:StartedRPCbindservice。
看到上面的Started证明启动成功了。
然后启动nfs服务:systemctlstartnfs。servicesystemctlenablenfssystemctlstatusnfsnfsserver。serviceNFSserverandservicesLoaded:loaded(usrlibsystemdsystemnfsserver。vendorpreset:disabled)DropIn:runsystemdgeneratornfsserver。service。dorderwithmounts。confActive:active(exited)sinceTue2018071021:35:37CST;14sagoMainPID:32067(codeexited,status0SUCCESS)CGroup:system。slicenfsserver。serviceJul1021:35:37mastersystemd〔1〕:StartingNFSserverandservices。。。Jul1021:35:37mastersystemd〔1〕:StartedNFSserverandservices。
同样看到Started则证明NFSServer启动成功了。
另外我们还可以通过下面的命令确认下:rpcinfopgrepnfs1000033tcp2049nfs1000034tcp2049nfs1002273tcp2049nfsacl1000033udp2049nfs1000034udp2049nfs1002273udp2049nfsacl
查看具体目录挂载权限:catvarlibnfsetabvarlibk8sdata(rw,sync,wdelay,hide,nocrossmnt,secure,norootsquash,noallsquash,nosubtreecheck,securelocks,acl,nopnfs,anonuid65534,anongid65534,secsys,rw,secure,norootsquash,noallsquash)
到这里我们就把nfsserver给安装成功了,然后就是前往节点安装nfs的客户端来验证,安装nfs当前也需要先关闭防火墙:systemctlstopfirewalld。servicesystemctldisablefirewalld。service
然后安装nfsyumyinstallnfsutilsrpcbind
安装完成后,和上面的方法一样,先启动rpc、然后启动nfs:systemctlstartrpcbind。servicesystemctlenablerpcbind。servicesystemctlstartnfs。servicesystemctlenablenfs。service
挂载数据目录客户端启动完成后,我们在客户端来挂载下nfs测试下,首先检查下nfs是否有共享目录:showmounte192。168。31。31Exportlistfor192。168。31。31:varlibk8sdata
然后我们在客户端上新建目录:mkdirprootcoursekubeadmdata
将nfs共享目录挂载到上面的目录:mounttnfs192。168。31。31:varlibk8sdatarootcoursekubeadmdata
挂载成功后,在客户端上面的目录中新建一个文件,然后我们观察下nfs服务端的共享目录下面是否也会出现该文件:touchrootcoursekubeadmdatatest。txt
然后在nfs服务端查看:lslsvarlibk8sdatatotal44rwrr。1rootroot4Jul1021:50test。txt
如果上面出现了test。txt的文件,那么证明我们的nfs挂载成功了。使用
前面我们已经了解到了PV、PVC、StorgeClass的使用,那么我们的NFS又应该如何在Kubernetes中使用呢?
同样创建一个如下所示nfs类型的PV资源对象:nfsvolume。yamlapiVersion:v1kind:PersistentVolumemetadata:name:nfspvspec:storageClassName:manualcapacity:storage:1GiaccessModes:ReadWriteOncepersistentVolumeReclaimPolicy:Retainnfs:path:varlibk8sdata指定nfs的挂载点server:192。168。31。31指定nfs服务地址apiVersion:v1kind:PersistentVolumeClaimmetadata:name:nfspvcspec:storageClassName:manualaccessModes:ReadWriteOnceresources:requests:storage:1Gi
我们知道用户真正使用的是PVC,而要使用PVC的前提就是必须要先和某个符合条件的PV进行一一绑定,比如存储容器、访问模式,以及PV和PVC的storageClassName字段必须一样,这样才能够进行绑定,当PVC和PV绑定成功后就可以直接使用这个PVC对象了:nfspod。yamlapiVersion:v1kind:Podmetadata:name:testvolumesspec:volumes:name:nfspersistentVolumeClaim:claimName:nfspvccontainers:name:webimage:nginxports:name:webcontainerPort:80volumeMounts:name:nfssubPath:testvolumesmountPath:usrsharenginxhtml
直接创建上面的资源对象即可:kubectlapplyfvolume。yamlkubectlapplyfpod。yamlkubectlgetpvnfspvNAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGEnfspv1GiRWORetainBounddefaultnfspvcmanual119skubectlgetpvcnfspvcNAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGEnfspvcBoundnfspv1GiRWOmanual2m5skubectlgetpodstestvolumesowideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATEStestvolumes11Running02m30s10。244。2。174node2nonenone
由于我们这里PV中的数据为空,所以挂载后会将nginx容器中的usrsharenginxhtml目录覆盖,那么访问应用的时候就没有内容了:curlhttp:10。244。2。174htmlheadtitle403Forbiddentitleheadbodycenterh1403Forbiddenh1centerhrcenternginx1。21。5centerbodyhtml
我们可以在PV目录中添加一些内容:在nfs服务器上面执行echonfspvcontentvarlibk8sdatatestvolumesindex。htmlcurlhttp:10。244。2。174nfspvcontent
然后重新访问就有数据了,而且当我们的Pod应用挂掉或者被删掉重新启动后数据还是存在的,因为数据已经持久化了。
上面的示例中需要我们手动去创建PV来和PVC进行绑定,有的场景下面需要自动创建PV,这个时候就需要使用到StorageClass了,并且需要一个对应的provisioner来自动创建PV,比如这里我们使用的NFS存储,则可以使用nfssubdirexternalprovisioner这个Provisioner,它使用现有的和已配置的NFS服务器来支持通过PVC动态配置PV,持久卷配置为{namespace}{pvcName}{pvName},首先我们使用HelmChart来安装:helmrepoaddnfssubdirexternalprovisionerhttps:kubernetessigs。github。ionfssubdirexternalprovisionerhelmupgradeinstallnfssubdirexternalprovisionernfssubdirexternalprovisionernfssubdirexternalprovisionersetnfs。server192。168。31。31setnfs。pathvarlibk8sdatasetimage。repositorycnychnfssubdirexternalprovisionersetstorageClass。defaultClasstruenkubesystem
上面的命令会在kubesystem命名空间下安装nfssubdirexternalprovisioner,并且会创建一个名为nfsclient默认的StorageClass:kubectlgetscNAMEPROVISIONERRECLAIMPOLICYVOLUMEBINDINGMODEALLOWVOLUMEEXPANSIONAGElocalstoragekubernetes。ionoprovisionerDeleteWaitForFirstConsumerfalse2d20hnfsclient(default)cluster。localnfssubdirexternalprovisionerDeleteImmediatetrue38dkubectlgetscnfsclientoyamlapiVersion:storage。k8s。iov1kind:StorageClassmetadata:。。。。。。name:nfsclientparameters:archiveOnDelete:trueprovisioner:cluster。localnfssubdirexternalprovisionerreclaimPolicy:DeletevolumeBindingMode:ImmediateallowVolumeExpansion:true
这样当以后我们创建的PVC中如果没有指定具体的StorageClass的时候,则会使用上面的SC自动创建一个PV。比如我们创建一个如下所示的PVC:nfsscpvcapiVersion:v1kind:PersistentVolumeClaimmetadata:name:nfsscpvcspec:storageClassName:nfsclient不指定则使用默认的SCaccessModes:ReadWriteOnceresources:requests:storage:1Gi
直接创建上面的PVC资源对象后就会自动创建一个PV与其进行绑定:kubectlgetpvcnfsscpvcNAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGEnfsscpvcBoundpvced8e2fb7897d465f873581d52c91d0741GiRWOnfsclient15s
对应自动创建的PV如下所示:kubectlgetpvpvced8e2fb7897d465f873581d52c91d074oyamlapiVersion:v1kind:PersistentVolumemetadata:annotations:pv。kubernetes。ioprovisionedby:cluster。localnfssubdirexternalprovisionercreationTimestamp:20220213T09:44:13Zfinalizers:kubernetes。iopvprotectionname:pvced8e2fb7897d465f873581d52c91d074resourceVersion:3954045uid:6d66e6ea888b4bc0bab09aca3a536cb5spec:accessModes:ReadWriteOncecapacity:storage:1GiclaimRef:apiVersion:v1kind:PersistentVolumeClaimname:nfsscpvcnamespace:defaultresourceVersion:3954040uid:ed8e2fb7897d465f873581d52c91d074nfs:path:varlibk8sdatadefaultnfsscpvcpvced8e2fb7897d465f873581d52c91d074server:192。168。31。31persistentVolumeReclaimPolicy:DeletestorageClassName:nfsclientvolumeMode:Filesystemstatus:phase:Bound
挂载的nfs目录为varlibk8sdatadefaultnfsscpvcpvced8e2fb7897d465f873581d52c91d074,和上面的{namespace}{pvcName}{pvName}规范一致的。原理
我们只是在volumes中指定了我们上面创建的PVC对象,当这个Pod被创建之后,kubelet就会把这个PVC对应的这个NFS类型的Volume(PV)挂载到这个Pod容器中的目录中去。前面我们也提到了这样的话对于普通用户来说完全就不用关心后面的具体存储在NFS还是Ceph或者其他了,只需要直接使用PVC就可以了,因为真正的存储是需要很多相关的专业知识的,这样就完全职责分离解耦了。
普通用户直接使用PVC没有问题,但是也会出现一个问题,那就是当普通用户创建一个PVC对象的时候,这个时候系统里面并没有合适的PV来和它进行绑定,因为PV大多数情况下是管理员给我们创建的,这个时候启动Pod肯定就会失败了,如果现在管理员如果去创建一个对应的PV的话,PVC和PV当然就可以绑定了,然后Pod也会自动的启动成功,这是因为在Kubernetes中有一个专门处理持久化存储的控制器VolumeController,这个控制器下面有很多个控制循环,其中一个就是用于PV和PVC绑定的PersistentVolumeController。
PersistentVolumeController会不断地循环去查看每一个PVC,是不是已经处于Bound(已绑定)状态。如果不是,那它就会遍历所有的、可用的PV,并尝试将其与未绑定的PVC进行绑定,这样,Kubernetes就可以保证用户提交的每一个PVC,只要有合适的PV出现,它就能够很快进入绑定状态。而所谓将一个PV与PVC进行绑定,其实就是将这个PV对象的名字,填在了PVC对象的spec。volumeName字段上。
PV和PVC绑定上了,那么又是如何将容器里面的数据进行持久化的呢,我们知道Docker的Volume挂载其实就是将一个宿主机上的目录和一个容器里的目录绑定挂载在了一起,具有持久化功能当然就是指的宿主机上面的这个目录了,当容器被删除或者在其他节点上重建出来以后,这个目录里面的内容依然存在,所以一般情况下实现持久化是需要一个远程存储的,比如NFS、Ceph或者云厂商提供的磁盘等等。所以接下来需要做的就是持久化宿主机目录这个过程。
当Pod被调度到一个节点上后,节点上的kubelet组件就会为这个Pod创建它的Volume目录,默认情况下kubelet为Volume创建的目录在kubelet工作目录下面:varlibkubeletpodsPod的IDvolumeskubernetes。ioVolume类型Volume名字
比如上面我们创建的Pod对应的Volume目录完整路径为:varlibkubeletpodsd4fcdb11baf743d98d7d3ede24118e08volumeskubernetes。ionfsnfspv
提示
要获取Pod的唯一标识uid,可通过命令kubectlgetpodpod名ojsonpath{。metadata。uid}获取。
然后就需要根据我们的Volume类型来决定需要做什么操作了,假如后端存储使用的CephRBD,那么kubelet就需要先将Ceph提供的RBD挂载到Pod所在的宿主机上面,这个阶段在Kubernetes中被称为Attach阶段。Attach阶段完成后,为了能够使用这个块设备,kubelet还要进行第二个操作,即:格式化这个块设备,然后将它挂载到宿主机指定的挂载点上。这个挂载点,也就是上面我们提到的Volume的宿主机的目录。将块设备格式化并挂载到Volume宿主机目录的操作,在Kubernetes中被称为Mount阶段。但是对于我们这里使用的NFS就更加简单了,因为NFS存储并没有一个设备需要挂载到宿主机上面,所以这个时候kubelet就会直接进入第二个Mount阶段,相当于直接在宿主机上面执行如下的命令:mounttnfs192。168。31。31:varlibk8sdatavarlibkubeletpodsd4fcdb11baf743d98d7d3ede24118e08volumeskubernetes。ionfsnfspv
同样可以在测试的Pod所在节点查看Volume的挂载信息:findmntvarlibkubeletpodsd4fcdb11baf743d98d7d3ede24118e08volumeskubernetes。ionfsnfspvTARGETSOURCEFSTYPEOPTIONSvarlibkubeletpodsd4fcdb11baf743d98d7d3ede24118e08volumeskubernetes。ionfsnfspv192。168。31。31:varlibk8sdatanfs4rw,relatime,
我们可以看到这个Volume被挂载到了NFS(192。168。31。31:varlibk8sdata)下面,以后我们在这个目录里写入的所有文件,都会被保存在远程NFS服务器上。
这样在经过了上面的阶段过后,我们就得到了一个持久化的宿主机上面的Volume目录了,接下来kubelet只需要把这个Volume目录挂载到容器中对应的目录即可,这样就可以为Pod里的容器挂载这个持久化的Volume了,这一步其实也就相当于执行了如下所示的命令:docker或者nerdctldockerrunvvarlibkubeletpodsPod的IDvolumeskubernetes。ioVolume类型Volume名字:容器内的目标目录我的镜像。。。
整个存储的架构可以用下图来说明:
PVController:负责PVPVC的绑定,并根据需求进行数据卷的ProvisionDelete操作ADController:负责存储设备的AttachDetach操作,将设备挂载到目标节点VolumeManager:管理卷的MountUnmount操作、卷设备的格式化等操作VolumePlugin:扩展各种存储类型的卷管理能力,实现第三方存储的各种操作能力和Kubernetes存储系统结合
我们上面使用的NFS就属于InTree这种方式,InTree就是在Kubernetes源码内部实现的,和Kubernetes一起发布、管理的,但是更新迭代慢、灵活性比较差,另外一种方式OutOfTree是独立于Kubernetes的,目前主要有CSI和FlexVolume两种机制,开发者可以根据自己的存储类型实现不同的存储插件接入到Kubernetes中去,其中CSI是现在也是以后主流的方式,接下来我们会主要介绍CSI这种存储插件的使用。
投诉 评论 策马扬鞭!赛马场上的速度与激情中新网新疆新闻3月26日电(巴金)为传承发扬传统文化,加强马术爱好者交流交往,近日,精河县体育设施管理中心、茫丁乡巴音阿门村、八家户农场牧业一队在精河县赛马场联合举办三河杯赛马……
有史以来最大细菌被发现长达2厘米!颠覆对微生物的认知根据定义,微生物的个体小到肉眼无法可见。但据《科学》杂志近日报道,科学家们发现了一种无需借助显微镜就可用肉眼看到的、有史以来最大的细菌华丽硫珠菌(Thiomargaritama……
2022清明奇妙游,邀你共赴宋风雅集来源:河南广电映象网清明春分后十五日,斗指丁,为清明,时万物皆洁齐而清明,盖时当气清景明,万物皆显,因此得名。在中国的传统文化里……
千元机又一力作OPPOk10低价旗舰,值得表扬这篇文章,为大家推荐千元价格中值得购买的机型。上文已推荐了Realme真我GTNeo2T,1500以内12256GB大内存手机,CPU跑分70万的性能,采用联发科天玑1200A……
2022江苏民营企业百强发布常州61家企业入围4个榜单数量位常报新媒体讯(常联轩黄钰)记者9月26日从市工商联获悉,2022江苏民营企业百强发布会近日召开,发布了2022江苏民营企业200强2022江苏民营企业制造业100强2022江苏……
K8SNFS共享存储NFS共享存储前面我们学习了hostPath与LocalPV两种本地存储方式,但是平时我们的应用更多的是无状态服务,可能会同时发布在不同的节点上,这个时候本地存储就不适用……
赛事预告!国乒本月角逐4大赛事,团体对抗赛名单确定2人进入7月之后,中国乒乓球队全体主力队员又将踏上征战WTT赛场之路,从7月11日开始连续4周将参与4个国际赛事的角逐,其中WTT球星挑战赛和WTT冠军赛均由国乒主力出战,而WTT……
春风十里,我在江安等你三月,春来、草长、风起四季中最让人感到舒服的春天来啦是时候走出家门欣赏这一程春暖花开享受这一路春风得意春光无限好快来打卡江安这几个宝藏……
渲染图全错了,iPhone14Pro屏幕没有感叹号两种状态对比图昨天皓瀚君说了,有传言称iPhone14Pro显示屏上感叹号形状的双开孔,将可以通过软件控制将开孔中间的显示区域显示为黑色而连成一体,从视觉上给人一种这是一……
海南离岛旅客免税购物新增担保即提即购即提提升消费体验央视网消息:为支持海南自由贸易港建设,进一步提升离岛旅客购物体验,自4月1日起,海南离岛旅客免税购物在2021年增加了邮寄送达和返岛提取这两种提货模式的基础上,再次增加了担保即……
常吃血脂康血塞通地奥心血康,有哪些必须知道的注意事项?心健康信科普血塞通以单味三七提取总皂苷为原料精制而成,三七性味甘、微苦,温,具有化瘀止血、活血定痛的功效。现代药理学研究证实,血塞通具有降血脂的作用,能降低2型糖尿……
大呼悠和小呼悠山东快书:新朋友和老朋友,各地网友好朋友。听我说来听我讲,今说笑话一小段,大呼悠和小呼悠。某村爷俩本姓鲁。当地人称呼悠悠,呼悠一……
热血江湖宝珠幸运符效果是什么在热血江湖里面很多玩家都不太清楚这个宝珠幸运符到底是什么效果,有什么用,小编在这里给大家讲一讲它的作用,如果还有朋友不知道,就往下看吧。热血江湖宝珠幸运符效果是什么……
父岛事件是怎么回事揭秘老布什的二战经历若是要说起第二次世界大战期间最残忍血腥的国家,那日本绝对是首屈一指的。纳粹德国虽然杀害无辜也非常多,但是在用次上是屠杀,也就是说,死者多半是很快就死了,没有那么的痛苦。但是日本……
硬核来袭!首曝奇瑞新能源版硬派越野SUV谍照,满身都是阳刚之时下的新能源车型,按照一些车友的说法,到处都是充斥着圆润的风格,想耍一把个性几乎没什么选择余地,随着消费者日趋年轻化,对于生活品质和科技接受度的快速吸收能力的增强,仅仅局限于圆……
外来媳妇本地郎当中的四位70后女演员,只有一人一直美到现在在广东地区,《外来媳妇本地郎》是一部使得广东人有着共同青春回忆的电视剧,在该剧开播之初,剧中甚至还出现了BB机、提倡只生一个小孩等题材元素,如今这些都早已走进历史了。岁月……
自己做的超市货架安全吗很多人觉得开个小超市,为了想要节省钱,准备自制货架,那么自己做的超市货架安全吗?这个问题很多人都在考虑,一起来关注本站进行了解。自己做的超市货架一般安全性不好,因为这需要……
蓬莱阁游玩攻略9月27日,游玩蓬莱阁、踩点海船轮渡码头。早上,从酒店出发,自驾去蓬莱阁景区,路程60公里,用时1。40小时。蓬莱阁位于烟台蓬莱区西北的丹崖山上,面朝黄渤海分界处。……
北京三轮供地建发32。7亿摘得昌平区中关村地块新京报讯(记者饶舒玮)9月23日,北京今年第三批集中供地的最后一宗地块花落建发。该地块为昌平区中关村生命科学园三期及北四村棚户区改造土地开发A地块CP0201016004、60……
天天参考知性优雅发型一周支招在这个早秋,做一个什么样的发型来迎合这个美丽的季节呢?为大家推荐几款时尚、优雅的职业发型,让OL美人一周发型不重样。天天参考!知性优雅OL发型一周支招星期一黑色花朵……
三款适合备孕期的营养食谱孕前该如何调整饮食呢?饮食对于备孕期的夫妻们非常的重要,调整好日常的饮食才能创造更优良的精子与卵子,才能孕育更健康的小宝宝。那么孕前我们该如何调整饮食呢?下面就为大家介绍三款适……
中国队惊险绝杀缅甸队,出线依然难度不小文羊城晚报全媒体记者柴智今日凌晨,亚足联第41届U20亚洲杯预选赛全面打响。在A组首轮比赛中,中国U19队在沙特以3比1绝杀缅甸队,来自广州队的前锋艾菲尔丁梅开二度,替补……
淋巴造句用淋巴造句大全61、应用同位素掺入法,观察榄香烯对淋巴细胞亚群,以及亚群间调节的影响。62、表明抑制碳酸酐酶是速尿对内淋巴脱水的作用机理之一。63、细菌大批出没于骨头髓,淋巴腺,……
稻盛和夫与李书福的管理对决对于新接手的企业,用什么方法去改造?如何建立领导者权威?又如何推进新运作模式?2010年中国企业管理界的两个热点事件:一是稻盛和夫在日本首相恳求下于2010年1月13日0……