本文详细整理了自己对PV和PVC存储体系、CSI 自定义存储插件等容器持久化存储方面的设计思想和知识理解,是在学习张磊老师Kubernetes课程中持久化存储过程中的学习笔记。
【Kevin亓】
文章目录
一、Kubernetes 本身的持久化存储体系
1.1 容器的“持久化存储”是什么?
容器的存储依赖容器 Volume 的挂载机制,将一个宿主机上的目录,跟一个容器里的目录绑定挂载在了一起。
那持久化存储就是“持久化 Volume”,指的就是这个宿主机上的目录,具备“持久性”。即:这个目录里面的内容,既不会因为容器的删除而被清理掉,也不会跟当前的宿主机绑定,即可以被“迁移”到其他节点上。这样,当容器被重启或者在其他节点上重建出来之后,它仍然能够通过挂载这个 Volume,访问到这些内容。大多数情况下,持久化 Volume 的实现,往往依赖于一个远程存储服务,比如:远程文件存储(比如,NFS、GlusterFS)、远程块存储(比如,公有云提供的远程磁盘)等等。
所以,Kubernetes 需要做的持久化工作,就是为容器准备一个宿主机目录,将其绑定挂载一个持久化的远程服务,使容器在这个目录里写入的文件,都会保存在远程存储中,从而使得这个目录具备了“持久性”。
1.2 在 Kubernetes 中容器如何实现持久化存储?
核心:依赖 Persistent Volume(PV)和 Persistent Volume Claim(PVC)这套持久化存储体系
注:这里的 PV 是一个 API 对象,下面会对应 Volume 处理流程,得到一个持久化目录
容器实现持久化存储的过程:
(PV 和 PVC 的使用过程大体就是:运维人员维护一组 PV 对象,用户使用时只需要定义 PVC 声明想要的 Volume 属性,然后创建 Pod 时声明使用这个 PVC 就可以了。Kubernetes 会针对这些 API 对象进行一系列的控制循环工作,由 Kubernetes 中专门处理持久化存储的控制器来实现,比如 PV 和 PVC 的绑定、将 PV 对象转化为真正的持久化存储。)
1、事先创建 PV 对象
-创建方式:
(1)Static Provisioning(人工管理 PV 的方式),就是简单的编写提交 PersistentVolume 这个 API 对象。
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs
spec:
storageClassName: manual
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.244.1.4
path: "/"
(2)Dynamic Provisioning(自动创建 PV 的机制),会在一个 PVC 被创建时,自动创建对应 PV。原理是通过 StorageClass 这个 API 对象的描述来实现,StorageClass 其实就是创建 PV 的模板,包含 PV 的属性和创建这种 PV 需要用到的 Provisioner(存储插件)。
apiVers