存储基础知识
存储基础知识
1. 数据卷(Volume)
数据卷(Volume)是Pod与外部存储设备进行数据传递的通道,也是Pod内部容器间、Pod与Pod间、Pod与外部环境进行数据共享的方式。
数据卷(Volume)定义了外置存储的细节,并内嵌到Pod中作为Pod的一部分。其实质是外置存储在Kubernetes系统的一个资源映射,当负载需要使用外置存储的时候,可以从数据卷(Volume)中查到相关信息并进行存储挂载操作。
Pod可以同时使用任意数目的卷类型。临时卷类型的生命周期与Pod相同,但持久卷可以比Pod的存活期长。
Kubernetes提供了非常丰富的Volume类型,您在容器云CSK中可以使用的常用Volume类型如下:
数据卷(Volume)分类 | 描述 |
---|---|
本地存储 | 适用于本地存储的数据卷,例如emptyDir。本地存储卷的特点是数据保存在集群的特定节点上,并且不能随着应用漂移,节点停机时数据即不再可用。 |
云存储 | 适用于云存储的数据卷,例如CFS。云存储卷的特点是数据不在集群的某个节点上,而是在远端的存储服务上,使用存储卷时需要将存储服务挂载到本地使用。 |
Secret和ConfigMap | Secret和ConfigMap是特殊的数据卷,其数据是集群的一些对象信息,该对象数据以卷的形式被挂载到节点上供应用使用。 |
PVC | 一种数据卷定义方式,将数据卷抽象成一个独立于Pod的对象,这个对象定义(关联)的存储信息即存储卷对应的真正存储信息,供Kubernetes负载挂载使用。 |
1.1. 数据卷(Volume)使用原则
- 一个Pod可以挂载多个数据卷(Volume),虽然单Pod可以挂载多个数据卷(Volume),但是并不建议给一个Pod挂载过多数据卷;
- 一个Pod可以挂载多种类型的数据卷(Volume);
- 每个被Pod挂载的Volume卷,可以在不同的容器间共享;
- Kubernetes环境推荐使用PVC和PV方式挂载数据卷(Volume)。
2. PV和PVC
并非所有的Kubernetes数据卷(Volume)具有持久化特征,为了实现持久化的实现,容器存储需依赖于一个远程存储服务。为此Kubernetes引入了PV和PVC两个资源对象,将存储实现的细节从其如何被使用中抽象出来,并解耦存储使用者和系统管理员的职责。
2.1. PV 基本概念
PV是PersistentVolume的缩写,译为持久化存储卷。PV在Kubernetes中代表一个具体存储类型的卷,其对象中定义了具体存储类型和卷参数。即目标存储服务所有相关的信息都保存在PV中,Kubernetes引用PV中的存储信息执行挂载操作。
PV是一个集群级别的概念,其对象作用范围是整个Kubernetes集群,而不是一个节点。PV可以有自己的独立生命周期,不依附于Pod。
2.2. PV 状态介绍
PV 状态 | 描述 |
---|---|
Avaliable | 创建好的 PV 在没有和 PVC 绑定的时候处于 Available 状态。 |
Bound | 当一个 PVC 与 PV 绑定之后,PV 就会进入 Bound 的状态。 |
Released | 一个回收策略为 Retain 的 PV,当其绑定的 PVC 被删除,该 PV 会由 Bound 状态转变为 Released 状态。 注意: Released 状态的 PV 需要手动删除 YAML 配置文件中的 claimRef 字段才能与 PVC 成功绑定。 |
2.3. PVC 基本概念
PVC是PersistentVolumeClaim的缩写,译为存储声明。PVC是在Kubernetes中一种抽象的存储卷类型,代表了某个具体类型存储的数据卷表达。其设计意图是分离存储与应用编排,将存储细节抽象出来并实现存储的编排。这样Kubernetes中存储卷对象独立于应用编排而单独存在,在编排层面使应用和存储解耦。
2.4. PVC 状态介绍
PVC 状态 | 描述 |
---|---|
Pending | 在没有满足条件的 PV 能与 PVC 绑定时,PVC 将处于 Pending 状态。 |
Bound | 当一个 PV 与 PVC 绑定之后,PVC 会进入 Bound 的状态。 |
2.5. PV和PVC使用说明
PVC和PV的绑定
PVC与PV是一一对应关系,不能一个PVC挂载多个PV,也不能一个PV挂载多个PVC。为应用配置存储时,需要声明一个存储需求声明(PVC),而Kubernetes会通过最佳匹配的方式选择一个满足PVC需求的PV,并与之绑定。所以从职责上PVC是应用所需要的存储对象,属于应用作用域。PV是存储平面的存储对象,属于整个存储域。
PVC只有绑定了PV之后才能被Pod使用,而PVC绑定PV的过程即是消费PV的过程,这个过程是有一定规则的,以下规则都满足的PV才能被PVC绑定:
- VolumeMode:被消费PV的VolumeMode需要和PVC一致;
- AccessMode:被消费PV的AccessMode需要和PVC一致;
- StorageClassName:如果PVC定义了此参数,PV必须有相关的参数定义才能进行绑定;
- LabelSelector:通过标签(labels)匹配的方式从PV列表中选择合适的PV绑定;
- Size:被消费PV的capacity必须大于或者等于PVC的存储容量需求才能被绑定。
PV和PVC定义中的size字段
PVC和PV里面的size字段作用如下:
- PVC、PV绑定时,会根据各自的size进行筛选;
- 通过PVC、StorageClass动态创建PV时,有些存储类型会参考PVC的size创建相应大小的PV和后端存储;
- 对于支持Resize操作的存储类型,PVC的size作为扩容后PV、后端存储的容量值。
一个PVC、PV的size值只是在执行一些PVC和PV管控操作的时候,作为配置参数来使用。
真正的存储卷数据流写数据的时候,不会参考PVC和PV的size字段,而是依赖底层存储介质的实际容量。
3. PV使用方式
3.1. 静态存储卷
静态存储卷一般是指由管理员创建的PV。所有的数据卷(Volume)都支持创建静态存储卷。
静态存储卷先由集群管理员分析集群中存储需求,并预先分配一些存储介质(例如云硬盘),同时创建对应的PV对象。创建好的PV对象等待PVC来消费。如果负载中定义了PVC需求,Kubernetes会通过相关规则实现PVC和匹配的PV进行绑定,这样就实现了应用对存储服务的访问能力。
3.2. 动态存储卷
动态存储卷一般是指通过存储插件自动创建的PV。
动态卷一般由集群管理员配置好后端的存储池,并创建相应的模板(StorageClass),当有PVC需要消费PV的时候,根据PVC定义的需求,并参考StorageClass的存储细节,由存储插件动态创建一个PV。StorageClass的定义如下:
StorageClass
当您声明一个PVC时,如果在PVC中添加了StorageClassName字段,意味着当PVC在集群中找不到匹配的PV时,会根据StorageClassName的定义触发相应的Provisioner插件创建合适的PV供绑定,即创建动态数据卷。
动态数据卷由Provisioner插件创建,并通过StorageClassName与PVC进行关联。
StorageClass可译为存储类,表示为一个创建PV存储卷的模板。在PVC触发自动创建PV的过程中,即使用StorageClass对象中的内容进行创建。
3.3. 动态存储卷的优势
- 动态存储卷让Kubernetes实现了PV的自动化生命周期管理,PV的创建、删除都通过Provisioner完成;
- 自动化创建PV对象,减少了配置复杂度和系统管理员的工作量;
- 动态卷可以实现PVC对存储的需求容量和Provisioner出来的PV容量一致,实现存储容量规划最优。
关于Kubernetes存储的更多详情请参见 Kubernetes官方文档 。