城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

K8S专栏Kubernetes数据持久化管理

6月14日 夜未央投稿
  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,或C
  Recycle:回收,清楚PV中的所有数据,相当于执行
  创建过后,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,如果使用它作为后端存储,你必须对其非常熟悉,方便在出问题的时候好排查,如果你对这些存储系统都不熟悉,在使用的时候可能会出现很多问题。
  最后,求关注。如果你还想看更多优质原创文章,欢迎关注我们的公众号运维开发故事。
  如果我的文章对你有所帮助,还请帮忙一下,你的支持会激励我输出更高质量的文章,非常感谢!
  你还可以把我的公众号设为星标,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新。
投诉 评论

莲子乌鸡汤,冬季来一碗,暖胃又暖心立冬到了冬季正式拉开了序幕对于初冬的燥与冷多喝汤有助于滋补身体去燥又驱寒本期向大家推荐莲子乌鸡汤鸡汤经过长时间的烹煮熬出精华且鲜香四溢……K8S专栏Kubernetes数据持久化管理Kubernetes为了能更好的支持有状态应用的数据存储问题,除了基本的HostPath和EmptyDir提供的数据持久化方案之外,还提供了PV,PVC和StorageClas……风云漫画刀真的不如剑吗?至少四把神刀不弱于绝世好剑每当提及《风云》系列的神兵,大家第一时间想到的都会是绝世好剑,英雄剑,火麟剑等剑类神兵,事实上《风云》系列的刀类神兵同样很多,然而无论这些刀有多厉害,知名度始终比不上剑类神兵,……为什么有人宁可多花钱买苹果手机,也不买国产手机?怎么会这样?平果手机毕竟有它的长处,大家都不是傻子,苹果好不好也不用多说了,就单说苹果系统就甩安卓一条街,所以大家选择不会错软骨症。因为久用不卡!!!实事实说!喷子别喷!……一级致癌物被揪出,世卫组织呼吁请立即停止食用现如今,癌症已经成为了威胁人类生命健康的头号杀手,如果一个人查出了癌症,那么就意味着一个家庭的负担。对于癌症,很多人都是谈癌色变,避之不及,其实癌症越是可怕,我们就应该越……河北传媒学院怎么样?最新排名:河北传媒学院位列中国艺术类民办大学第一名根据最新艾瑞深中国校友会《2018中国艺术类民办大学排行榜》,河北传媒学院排名全国第一,五星级,办学层次为:中国一流民办……德国很生气!坚持要求立陶宛解除对加里宁格勒过境直运禁令俄新社7月2日援引德国《明镜》周刊消息称,欧盟在加里宁格勒过境直运问题上的立场被立陶宛视为失败。据报道,《明镜》周刊早些时候援引消息源的话说,立陶宛对加里宁格勒的行动令德……哈哈哈哈!让我看看这场大赛谁赢了今天是春节假期后的第一个工作日不少回家过年的人已经返程投入到工作中(比如热爱上班的小编我)不管你想不想春节假期就这么结束了……袭人和贾宝玉偷试多年,为何一直没怀孕?看赵姨娘就是答案我国历史文化源远流长,远至秦朝,近至明清,每一朝代都留有传奇的历史文化供人们欣赏。就这些历史文化而言,有的值得我们学习,有的却是文化糟粕,而这些文化都可以通过书籍的撰写记……中国新型导弹列装高原,印度看了之后,该冷静了最近,正在海拔4500多米的雪域高原驻训的新疆军区某红军团迎来了某新型反坦克导弹的列装。咱们官方报道说得不多,只是说这是一套多用途导弹武器系统,不仅可以对装甲目标进行精准打击,……奖牌榜中国单日1铜,刘诗颖遗憾从第2到第4,苏炳添接力出局7月23日,田径世锦赛又一个比赛日。备受关注的,就是中国队男女接力,可惜,中国女队尽管葛曼棋、梁小静出击,可惜与决赛失之交臂,总成绩排第9。男队更显遗憾,汤星强、谢震业、……天天刷牙还口臭?做好这3步,口臭退!退!退口臭真是件烦人事儿,因为有口臭,连最平常的社交都成了难题。很多朋友都很困惑:明明我每天也都认真刷牙了,怎么还是有口臭?如果你也有相同的烦恼,别急,这篇文章带给你答案……
王者荣耀后期开团,最厉害的英雄是谁?晶晶牌蛋炒饭男人婚后大变样婚后男人有哪些变化高考志愿报考,该不该填报冲的院校?两种情况,我支持你去冲冬天吃些它们手脚不再冰凉人民智库平台经济监管常态化,哪些问题值得关注?秋天的回忆乌鲁木齐地铁号线停运原因调整好心态的文案踔厉奋发助共富勇毅前行有暖光浙江体彩筑梦再续美好篇章品牌思维高阶新媒体人的王牌武器铝箔龙头与动力电池一哥再度牵手!搞啥大事?赫莲娜高光精华适合多大年纪用赫莲娜高光精华好用吗一针治偏瘫从动弹不得到站立行走游西湖碳素为什么贵(碳纤维卖出白菜价水木论坛)国际新闻中国旗袍秀之美马尾简单时尚的扎法图解学明星扎别有心意马尾让你变身小魔女美丽的家乡氨茶碱可以治疗高原反应吗标新立异,一生不愿走寻常路的星座左眼跳财(左眼)堆糖产品实习笔试一就这么任性的交给你改液晶电视4k什么意思液晶电视工作原理介绍详解

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找