Difference on Volume

emptyDir

emptyDir类型的Volume在Pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。

注:容器的crashing事件并不会导致emptyDir中的数据被删除。

apply to scene

  • 临时空间,例如基于磁盘的合并排序
  • 设置检查点以从崩溃事件中恢复未执行完毕的长计算
  • 保存内容管理器容器从Web服务器容器提供数据时所获取的文件

默认情况下,emptyDir可以使用任何类型的由node节点提供的后端存储。如果你有特殊的场景,需要使用tmpfs作为emptyDir的可用存储资源也是可以的,只需要在创建emptyDir卷时增加一个emptyDir.medium字段的定义,并赋值为”Memory”即可。

注:在使用tmpfs文件系统作为emptyDir的存储后端时,如果遇到node节点重启,则emptyDir中的数据也会全部丢失。同时,你编写的任何文件也都将计入Container的内存使用限制。


hostPath

hostPath类型则是映射node文件系统中的文件或者目录到pod里。在使用hostPath类型的存储卷时,也可以设置type字段,支持的类型有文件、目录、File、Socket、CharDevice和BlockDevice。

apply to scene

  • 当运行的容器需要访问Docker内部结构时,如使用hostPath映射/var/lib/docker到容器;
  • 当在容器中运行cAdvisor时,可以使用hostPath映射/dev/cgroups到容器中;

注意事项:

  • 配置相同的pod(如通过podTemplate创建),可能在不同的Node上表现不同,因为不同节点上映射的文件内容不同
  • 当Kubernetes增加了资源敏感的调度程序,hostPath使用的资源不会被计算在内
  • 宿主机下创建的目录只有root有写权限。你需要让你的程序运行在privileged container上,或者修改宿主机上的文件权限。

emptyDir和hostPath在功能上的异同

  • 二者都是node节点的本地存储卷方式;
  • emptyDir可以选择把数据存到tmpfs类型的本地文件系统中去,hostPath并不支持这一点;
  • hostPath除了支持挂载目录外,还支持File、Socket、CharDevice和BlockDevice,既支持把已有的文件和目录挂载到容器中,也提供了“如果文件或目录不存在,就创建一个”的功能;
  • emptyDir是临时存储空间,完全不提供持久化支持;
  • hostPath的卷数据是持久化在node节点的文件系统中的,即便pod已经被删除了,volume卷中的数据还会留存在node节点上;

local volume


Refer

https://www.kubernetes.org.cn/4846.html