【云原生】K8S 相关知识点整理 -- 持久化存储

在 K8S 中部署的应用都是以 Pod 容器的形式运行的,若部署 MySQL、Redis 等数据库,需要对这些数据库产生的数据做备份;因为 Pod 是有生命周期的,若 Pod 不挂载数据卷,那么 Pod 被删除或重启后这些数据会随之消失,如果想要长久的保留这些数据就需要进行 Pod 数据持久化存储;
【1】K8S 持久化存储类型

【1.1】emptyDir
emptyDir 类型的 Volume 在 Pod 分配到 Node 上时被创建,K8S 会在 Node 上自动分配一个目录,因此无需指定宿主机 Node 上对应的目录文件;该目录的初始内容为空,当 Pod 从 Node 上移除时,emptyDir 中的数据会被永久删除;
emptyDir Volume 主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等;

【1.2】hostPath
hostPath Volume 是指 Pod 挂载宿主机上的目录或文件;hostPath Volume 使得容器可以使用宿主机的文件系统进行存储,hostpath (宿主机路径) 节点级别的存储卷,在 Pod 被删除时,该存储卷还是存在的,不会被删除,所以只要是同一个节点上的同一个 Pod,若该 Pod 被删除并重新被调度到该节点之后,对应的数据依然是存在的;
hostpath 存储卷缺点,单节点,Pod 删除之后重新创建必须调度到同一个 Node 节点,数据才不会丢失;

【1.3】PersistentVolumeClaim (PVC)
【1.3.1】K8S PV 简介
PersistentVolume (PV) 是群集中的一块存储,由管理员配置或使用存储类动态配置;PV 是集群中的资源,PV 是容量插件,其生命周期独立于使用 PV 的任何单个 Pod;

【1.3.2】K8S PVC 简介
PersistentVolumeClaim (PVC) 是一个持久化存储卷,在创建 Pod 时可以定义该类型的存储卷,其类似于一个 Pod,Pod 消耗节点资源,PVC 消耗 PV 资源;Pod 可以请求特定级别的资源 (CPU 和内存),PVC 在申请 PV 时也可以请求特定的大小和访问模式 (例如,可以一次读写或多次只读);

两者间的关系可以总结为,PV 是群集中的资源,PVC 是对这些资源的请求;

【1.3.3】K8S PVC 和 PV 工作原理

  • (1) PV 的供应方式
  • 静态方式,集群管理员创建许多个 PV,它们包含可供群集用户使用的实际存储的详细信息,存在于 Kubernetes API 中,可供使用;
  • 动态方式,当管理员创建的静态 PV 都不匹配用户的 PersistentVolumeClaim (PVC) 时,群集可能会尝试为 PVC 专门动态配置卷,此配置基于 StorageClasses,PVC 必须请求存储类,管理员必须创建并配置该类,以便进行动态配置;
  • (2) 绑定
  • 用户创建 PVC 并指定需要的资源和访问模式,在找到可用 PV 之前,PVC 会保持未绑定状态;
  • (3) 使用
  • a) 需要找一个存储服务器,把它划分成多个存储空间;
  • b) K8S 管理员可以把这些存储空间定义成多个 PV;
  • c) 在 Pod 中使用 PVC 类型的存储卷之前需要先创建 PVC,通过定义需要使用的 PV 的大小和对应的访问模式,找到合适的 PV;
  • d) PVC 被创建之后,就可以当作存储卷使用,在定义 Pod 时就可以使用该 PVC 的存储卷;
  • e) PVC 和 PV 是一一对应的关系,PV 若被 PVC 绑定,就不能被其他 PVC 使用;
  • f) 在创建 PVC 时,应该确保和 PV 能绑定,如果没有合适的 PV,那么 PVC 就会处于 pending 状态;
  • (4) 回收策略
  • 当创建 Pod 时若使用 PVC 做为存储卷,那么它会和 PV 绑定,当删除 Pod,PVC 和 PV 的绑定就会解除,解除之后和 PVC 绑定的 PV 卷里的数据可以保留,回收或删除;
  • 回收策略如下
  • 1、Retain
  • 当删除 PVC 时,PV 仍然存在,处于 released 状态,但是它不能被其他 PVC 绑定使用,里面的数据还是存在的,当下次再使用的时候,数据还是存在的,这个是默认的回收策略
  • 2、Delete
  • 删除 PVC 时即会从 K8S 中移除 PV,也会从相关的外部设施中删除存储数据
  • 注,使用 PVC 和 PV 的注意事项
  • 1、每次创建 PVC 时,需要事先划分好 PV,或者在创建 PVC 时直接动态创建一个 PV 存储类
  • 2、PVC 和 PV 绑定,如果使用默认的回收策略 retain,那么删除 PVC 之后,PV 会处于 released 状态,当继续使用该 PV 时,需要手动删除 PV (kubectl delete pv pv_name,删除 PV,不会删除 PV 里的数据),当重新创建 PVC 时还会和该最匹配的 PV 绑定,数据还是原来数据,不会丢失;

【1.4】StorageClass
K8S 提供的一种自动创建 PV 的机制,其可以作为创建 PV 的模板,K8S 集群管理员通过创建 StorageClass 可以动态生成一个存储卷 PV 供 K8S PVC 使用;
StorageClass 定义分为两部分

  • 1. PV 的属性,比如存储的大小、类型等;
  • 2. 创建这种 PV 需要使用到的存储插件,比如 Ceph、NFS 等;
  • 有了这两部分信息,K8S 就能够根据用户提交的 PVC,找到对应的 StorageClass,然后 K8S 就会调用 StorageClass 声明的存储插件,创建出需要的 PV;

每个 StorageClass 包含字段 provisioner,parameters 和 reclaimPolicy

  • provisioner,供应商,storageclass 需要有一个供应者,用来确定使用什么样的存储来创建 PV,provisioner 既可以由内部供应商提供,也可以由外部供应商提供;
  • parameters,参数
  • reclaimPolicy,回收策略