Kubernetes容器要持久化数据,离不开volume,k8s的volume和Docker原生概念中的volume有一些差别,不过本次不讲这个,本次要明确的是k8s持久化数据用到的几个对象PersistentVolume、PersistentVolumeClaim和StorageClass,首先明确这既然都是k8s对象,就可以通过API来创建的。

k8s的volume支持的类型有很多,例如emptyDir、hostPath、nfs等,这些相对好理解,还有一种就是ersistentVolumeClaim,刚开始接触的时候不太理解这个对象该如何使用,本次主要介绍ersistentVolumeClaim相关的概念和使用方法。

开始先要提一下PersistentVolume(PV)对象,PersistentVolume和Volume一样是群集中的一块存储区域,然而Kubernetes将PersistentVolume抽象成了一种集群资源,类似于集群中的节点(Node)对象,这意味着我们可以使用Kubernetes API来创建PersistentVolume对象。PV与Volume最大的不同是PV拥有着独立于Pod的生命周期。

而PersistentVolumeClaim(PVC)代表了用户对PV资源的请求。用户需要使用PV资源时,只需要创建一个PVC对象(包括指定使用何种存储资源,使用多少GB,以何种模式使用PV等信息),Kubernetes会自动为我们分配我们所需的PV。如果把PersistentVolume类比成集群中的Node,那么PersistentVolumeClaim就相当于集群中的Pod,Kubernetes为Pod分配可用的Node,类似的也可以理解成为PersistentVolumeClaim分配可用的PersistentVolume。

1、静态创建PV对象

可以直接静态创建一个PV对象,作为一个存储供PVC使用,创建PV主要有下面几个参数

accessModes 访问模式有下面三种:

  • ReadWriteOnce(RWO):是最基本的方式,可读可写,但只支持被单个 Pod 挂载。
  • ReadOnlyMany(ROX):只读模式,可以被多个 Pod 挂载。
  • ReadWriteMany(RWX):可读可写,并且可以被被多个 Pod 挂载。
persistentVolumeReclaimPolicy 回收策略,即 PVC 释放卷的时候 PV 该如何操作,有下面三种:
  • Retain,不清理,删除PVC时,PV仍然存在并标记为“released”(需要删除时需要手动清理)
  • Recycle,删除数据,对卷执行清理(rm -rf / thevolume / *),并使其再次可用于新索引(只有 NFS 和 HostPath 支持)
  • Delete,删除存储资源,会从Kubernetes中删除PV对象,以及外部基础结构中的关联存储资产,例如AWS EBS,GCE PD,Azure磁盘或Cinder卷
#静态创建PVapiVersion: v1
kind: PersistentVolume
metadata:name: pv0003
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: slowmountOptions:- hard- nfsvers=4.1nfs:path: /tmpserver: 172.17.0.2

定义PV时,我们需要指定其底层存储的类型,例如上文中创建的PV,底层使用nfs存储,支持的类型很多,例如awsElasticBlockStore、FC、nfs、RBD、CephFS、Hostpath、StorageOS等等,可以查看官方文档。

可以查看当前集群下创建的PV对象,kubectl get PersistentVolume --all-namespaces

2、静态创建PVC对象

    创建PV之后,并没有被使用,如果想使用这个PV就需要创建PVC了,最后在pod中指定使用这个PVC而建立起pod和PV的关系。

#静态创建PVCapiVersion: v1
kind: PersistentVolumeClaim
metadata:name: myclaim
spec:accessModes:- ReadWriteOnce  volumeMode: Filesystemresources:requests:storage: 8GistorageClassName: slowselector:matchLabels:release: "stable"

#pod使用PVC
kind: Pod
apiVersion: v1
metadata:name: mypod
spec:containers:- name: myfrontendimage: dockerfile/nginxvolumeMounts:- mountPath: "/var/www/html"name: mypdvolumes:- name: mypdpersistentVolumeClaim:claimName: myclaim

分析一下上面的代码:

  • 创建PVC时指定了accessModes = ReadWriteOnce。这表明这个PVC希望使用accessModes = ReadWriteOnce的PV。
  • 创建PVC时指定了volumeMode= Filesystem。这表明这个PVC希望使用volumeMode= Filesystem的PV。
  • 创建PVC时指定了storageClassName: slow,此配置用于绑定PVC和PV,意思是这个PVC希望使用storageClassName=slow的PV。我们可以看到最上面创建PV时也包含storageClassName=slow的配置。
  • PVC还可以指定PV必须满足的Label,如加了selector匹配matchLabels: release: "stable"。这表明此PVC希望使用Label:release: "stable"的PV。
  • 最后是resources声明,跟pod一样可以声明使用特定数量的资源,storage: 8Gi表明此PVC希望使用8G的Volume资源。

通过上面的分析,我们可以看到PVC和PV的绑定,不是简单的通过Label来进行。而是要综合storageClassName,accessModes,matchLabels以及storage来匹配符合条件的PV进行绑定。

3、动态创建PV对象

    上面我们通过描述文件静态创建PV对象最终完成和pod的绑定,这种直接通过描述文件创建PV的方式称为静态创建,这样的创建方式有弊端,假如我们创建PV时指定大小为50G,而PVC请求80G的PV,那么此PVC就无法找到合适的PV来绑定。因此实际生产中更多的使用PV的动态创建。

PV的动态创建依赖于StorageClass对象。我们不需要手动创建任何PV,所有的工作都由StorageClass为我们完成,可以查看集群中的StorageClass信息 ,kubectl get StorageClass --all-namespaces

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: slow
provisioner: kubernetes.io/glusterfs
parameters:resturl: "http://192.168.10.100:8080"restuser: ""secretNamespace: ""secretName: ""
reclaimPolicy: Retain
allowVolumeExpansion: true

这个例子使用创建了一个基于glusterfs分布式存储的StorageClass,只有allowVolumeExpansion=teue时,才能扩展PVC,要为PVC请求更大的卷,请编辑PVC对象并指定更大的大小,这会触发底层PersistentVolume的卷的扩展。永远不会创建新的,而是调整现有卷的大小。

StorageClass的定义包含四个部分:

  • provisioner:指定 Volume 插件的类型,包括内置插件(如kubernetes.io/glusterfs、kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)。
  • parameters:指定 provisioner 的选项,比如 glusterfs 支持 resturl、restuser 等参数。
  • mountOptions:指定挂载选项,当 PV 不支持指定的选项时会直接失败。比如 NFS 支持 hard 和 nfsvers=4.1 等选项。
  • reclaimPolicy:指定回收策略,同 PV 的回收策略。

手动创建的PV时,我们指定了storageClassName=slow的配置项,然后Pod定义中也通过指定storageClassName=slow,从而完成绑定。而通过StorageClass实现动态PV时,我们只需要指定StorageClass的metadata.name即可,这个名称非常重要,用户通过名称类请求特定的存储类,储类的对象一旦被创建,name将不能再更改。
        回到上文中创建PVC的例子,此时PVC指定了storageClassName=slow。那么Kubernetes会在集群中寻找是否存在metadata.name=slow的StorageClass,如果存在,此StorageClass会自动为此PVC创建一个accessModes = ReadWriteOnce,并且大小为8GB的PV。

或者直接写到一起

#上面的部分省略了volumeMounts:- name: data-dirmountPath: /var/mysql/data#volumes:#- name: data-dir#  hostPath:#    path: /opt/mysqlvolumeClaimTemplates:- metadata:      #annotations: volume.alpha.kubernetes.io/storage-class: xxxxcreationTimestamp: nullname: data-dirspec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: slowvolumeMode: Filesystemstatus:phase: Pending

下面是参考官方的一种比较通用的写法,基于helm的,直接将PVC的代码写到volumes的后面,根据values.yaml中的参数生成是挂载PVC的存储还是其他存储,可以作为以后自己写脚本的参考

      volumes:- name: configconfigMap:name: {{ template "redis-ha.fullname" . }}-configmap- name: probesconfigMap:name: {{ template "redis-ha.fullname" . }}-probes{{- if .Values.sysctlImage.mountHostSys }}- name: host-syshostPath:path: /sys{{- end }}
{{- if .Values.persistentVolume.enabled }}volumeClaimTemplates:- metadata:name: dataannotations:{{- range $key, $value := .Values.persistentVolume.annotations }}{{ $key }}: {{ $value }}{{- end }}spec:accessModes:{{- range .Values.persistentVolume.accessModes }}- {{ . | quote }}{{- end }}resources:requests:storage: {{ .Values.persistentVolume.size | quote }}{{- if .Values.persistentVolume.storageClass }}{{- if (eq "-" .Values.persistentVolume.storageClass) }}storageClassName: ""{{- else }}storageClassName: "{{ .Values.persistentVolume.storageClass }}"{{- end }}{{- end }}
{{- else if .Values.hostPath.path }}- name: datahostPath:path: {{ tpl .Values.hostPath.path .}}
{{- else }}- name: dataemptyDir: {}
{{- end }}

总结一下整个过程

1)集群管理员预先创建存储类(StorageClass);

2)用户创建使用存储类的持久化存储声明(PVC:PersistentVolumeClaim);

3)存储持久化声明通知系统,它需要一个持久化存储(PV: PersistentVolume);

4)系统读取存储类的信息;

5)系统基于存储类的信息,在后台自动创建PVC需要的PV;

6)用户创建一个使用PVC的Pod;

7)Pod中的应用通过PVC进行数据的持久化;

8)而PVC使用PV进行数据的最终持久化处理。

官方文档 https://kubernetes.io/docs/concepts/storage/persistent-volumes/

转载于:https://www.cnblogs.com/yanh0606/p/11269142.html

Kubernetes对象中的PersistentVolume、PersistentVolumeClaim和StorageClass的概念关系相关推荐

  1. Kubernetes持久化存储PV、PVC和StorageClass介绍

    PV和PVC Kubernetes Volume提供了非常好的数据持久化方案,不过对于大型Kubernetes集群来说管理上还有不方便之处.Volume方案需要创建Pod或者Deployment的管理 ...

  2. ceph rbd mysql_如何在 Kubernetes 环境中搭建 MySQL(三):使用 PVC 挂接 RBD

    MySQL in Kubernetes MySQL 中的数据是关键信息,是有状态的,不可能随着 MySQL pod 的销毁而被销毁,所以数据必须要外接到一个可靠的存储系统中,目前已经有了 Ceph 系 ...

  3. 容器编排技术 -- 了解Kubernetes对象

    容器编排技术 -- 了解Kubernetes对象 1 了解Kubernetes对象 1.1 对象(Object)规范和状态 1.2 描述Kubernetes对象 1.3 必填字段 2 下一步? 了解K ...

  4. kubectl命令管理kubernetes对象的三种方式

    kubenetes的抽象概念,如Pod.Service.Volume.Namespace.ReplicaSet.Deployment.StatefulSet.DaemonSet.Job等统称对象,ku ...

  5. html 表单内容怎么获取不到,jquery中formdate一直获取不到对象中的[0]的值 包括本身也是一个空的数据怎么办?...

    jquery中formdate一直获取不到对象中的[0]的值 包括本身也是一个空的数据怎么办? 再做一个前台的ajax方法 查网上用formdate方法上传.可是进了接口之后一直在控制台获取不到for ...

  6. JavaScript如何声明对象、函数以及对象中的函数(即方法)

    目录 声明对象的2种最常见方法 声明函数的2种最常见方法 在对象中声明函数 声明对象的2种最常见方法 1) var Zhihuijun = {name:'彭志辉',age:28,upName:'稚晖君 ...

  7. vue 往对象中添加键值对_【Vue】Vue学习之混入

    今天学习了Vue中的"混入"知识点,写篇文章用自己的语言来向自己解释它,如有不足还望指点. 混入(mixins): 混入提供了一种非常灵活的方式,来分发Vue组件中的可复用功能 - ...

  8. Window对象中的函数confirm方法的简单介绍

    <!DOCTYPE html> <html> <head>     <meta charset="utf-8"> <title ...

  9. R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series)、使用window函数从时间序列对象中提取数据子集

    R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series).使用window函数从时间序列对象中提取数据子集 目录

最新文章

  1. 【MATLAB】符号数学计算(二):符号运算中的运算符和函数
  2. Angular19 自定义表单控件
  3. oracle Hash Join及三种连接方式
  4. ML之kNNC:基于iris莺尾花数据集(PCA处理+三维散点图可视化)利用kNN算法实现分类预测daiding
  5. noi99钉子和小球 解题报告
  6. 小猿圈之python的输入和输出
  7. oracle hang analyze,hanganalyze 分析数据库挂起
  8. python 中 print 函数用法总结
  9. 解决Nginx出现403 forbidden
  10. SVN 客户端的安装与配置
  11. webpack和 php配合,javascript - webpack和laravel-elixir-webpack的正确配合方式?
  12. 《JavaSE系列教程》
  13. java冒泡排序代码简单_Java冒泡排序简单实现
  14. strut 多文件上传
  15. vue中a的href写法
  16. python输入一个正整数、将其按逆序输出_Python实现按照指定要求逆序输出一个数字的方法...
  17. CIsco思科三层交换配置DHCP,客户端动态获取
  18. w10电脑c盘满了怎么清理_win10系统如何清理c盘空间容量
  19. ap带机量测试软件,无线AP的带机量是多少?
  20. Substance Painter笔记:多显示器且多分辨率显示器时的设置

热门文章

  1. jQuery 对象和 DOM 对象
  2. JVM锁和分布式锁是什么关系
  3. 安装server 2012 时提示输入的密码不满足网络或组管理员设置的密码复杂度
  4. Python 技术篇-使用pygame库展示界面添加图片不显示问题解决办法
  5. Windows 技巧篇 - cmd的复制和粘贴功能
  6. IE8下Jquery获取select选中的值的问题
  7. matlab程序和程序文件
  8. 基于遗传算法优化的BP神经网络的 非线性函数拟合
  9. Python爬虫图形界面封装版本
  10. Java实现大数乘法_java实现大数加法、乘法(BigDecimal)