所属技术领域:
云原生
|名词定义|
PersistentVolume(PV)是已经由管理员提供或者动态使用供应的集群中的一块存储的存储类。它是集群中的资源,就像节点是集群资源一样。PV是类似于Volumes的卷插件,但是其生命周期独立于使用PV的任何单个Pod。此API对象捕获NFS,iSCSI或特定于云提供商的存储系统的存储实现的详细信息。
PersistentVolume 持久卷,简称PV,对存储的具体实现,供集群使用。
|技术特点|
数据卷 可以在容器之间共享和重用
对 数据卷 的修改会立马生效
对 数据卷 的更新,不会影响镜像
数据卷 默认会一直存在,即使容器被删除
|相关词|
Capacity(容量):
一般来说,PV会指定存储的容量,使用PV的capacity属性来设置。查看Kubernetes的Resource Model来了解capacity。
当前,存储大小是唯一能被设置或请求的资源。未来可能包含IOPS,吞吐率等属性。
empty:
初始值是一个空目录。用于放置一些临时数据,pod重启或移除后会丢失。
hostpath:
将node节点的一个目录或文件挂载到pod上边。这个还是比较常用的。
应用场景:挂载node的/etc/hosts,/etc/localtime时区文件,挂载特定目录或者日志文件等。yaml文件声明里边volume,主要是name以及hostpath, 容器挂载指定volumemounts挂载的路径以及name即可。
适用场景:
• 场景一:pod 重建销毁,如用 Deployment 管理的 pod,在做镜像升级的过程中,会产生新的 pod并且删除旧的 pod ,那新旧 pod 之间如何复用数据?
• 场景二:宿主机宕机的时候,要把上面的 pod 迁移,这个时候 StatefulSet 管理的 pod,其实已经实现了带卷迁移的语义。这时通过 Pod Volumes 显然是做不到的;
• 场景三:多个 pod 之间,如果想要共享数据,应该如何去声明呢?我们知道,同一个 pod 中多个容器想共享数据,可以借助 Pod Volumes 来解决;当多个 pod 想共享数据时,Pod Volumes 就很难去表达这种语义;
• 场景四:如果要想对数据卷做一些功能扩展性,如:snapshot、resize 这些功能,又应该如何去做呢?
以上场景中,通过 Pod Volumes 很难准确地表达它的复用/共享语义,对它的扩展也比较困难。因此 K8s 中又引入了 Persistent Volumes 概念,它可以将存储和计算分离,通过不同的组件来管理存储资源和计算资源,然后解耦 pod 和 Volume 之间生命周期的关联。这样,当把 pod 删除之后,它使用的 PV 仍然存在,还可以被新建的 pod 复用。