存储管理4:理解Local PV

在前面的文章中,我们都是基于一个外部的存储服务来提供PV。此时,我们可能有这样的疑问:能否直接使用宿主机上的目录或磁盘作为PV呢?答案是肯定的。这就是我们今天就要讨论的主题:Local Persistent Volume。

1.1、什么是Local PV

Kubernetes 支持直接使用宿主机上目录或磁盘,而不依赖于远程存储服务来提供“持久化”的 Volume。这样做的好处显而易见:由于这个 Volume 直接使用的是本地磁盘,尤其是 SSD 盘,它的读写性能相比于大多数远程存储来说,要好得多。这个需求对部署在本地物理服务器上的私有 Kubernetes 集群来说,非常常见。所以,Kubernetes 在 v1.10 之后,就逐渐依靠 PV、PVC 体系实现了这个特性。这个特性的名字叫作:Local Persistent Volume。

这里,我们需要知道的是,Local Persistent Volume 并不适用于所有应用。事实上,它的适用范围非常固定,比如:高优先级的系统应用,需要在多个不同节点上存储数据,并且对 I/O 较为敏感。典型的应用包括:分布式数据存储比如 MongoDB、Cassandra 等,分布式文件系统比如 GlusterFS、Ceph 等,以及需要在本地磁盘上进行大量数据缓存的分布式应用。

相比于正常的 PV,一旦节点宕机且不能恢复时,Local Persistent Volume 的数据就可能丢失。这就要求使用 Local Persistent Volume 的应用必须具备数据备份和恢复的能力,允许我们把这些数据定时备份在其他位置。

1.2、实现Local PV的难点

Local Persistent Volume 的设计,主要面临两个难点。

第一个难点在于:如何把本地目录或磁盘抽象成 PV?

此时,我们可能会有这样的想法,Local Persistent Volume,不就等同于 hostPath 加 NodeAffinity 吗?比如,一个 Pod 可以声明类型为 Local 的 PV,而这个 PV 其实就是一个 hostPath 类型的 Volume。如果这个 hostPath 对应的目录,已经在节点 A 上被事先创建好了。那么,我们只需要再给这个 Pod 加上一个 nodeAffinity=nodeA,不就可以使用这个 Volume 了吗?

这样使用确实没有问题,但在生产环境中,我们绝不应该把一个宿主机上的目录当作 PV 使用。这是因为,这种本地目录的存储行为完全不可控:它所在的磁盘随时都可能被应用写满,甚至造成整个宿主机宕机。而且,不同的本地目录之间也缺乏哪怕最基础的 I/O 隔离机制。所以,一个 Local Persistent Volume 对应的存储介质,一定是一块额外挂载在宿主机上的磁盘或者块设备(“额外”的意思是,它不应该是宿主机根目录所使用的主硬盘)。这个原则,我们可以称为“一个 PV 一块盘”。

第二个难点在于:如何保证 Pod 始终被调度到正确的节点上?

对于常规的 PV 来说,Kubernetes 都是先调度 Pod 到某个节点上,然后,再通过“两阶段处理”来“持久化”这台机器上的 Volume 目录,进而完成 Volume 目录与容器的绑定挂载。可是,对于 Local PV 来说,节点上可供使用的磁盘(或者块设备),必须是事先提前准备好的。它们在不同节点上的挂载情况可以完全不同,甚至有的节点可以没这种磁盘。

所以,这时候,调度器就必须能够知道所有节点与 Local Persistent Volume 对应的磁盘的关联关系,然后根据这个信息来调度 Pod。这个原则,我们可以称为“在调度的时候考虑 Volume 分布”。在 Kubernetes 的调度器里,有一个叫作 VolumeBindingChecker 的过滤条件专门负责这个事情。在 Kubernetes v1.11 中,这个过滤条件已经默认开启了。

1.3、小结

在这篇文章中,我们主要讨论了如下内容:

  • Local PV 就是将宿主机上的目录或磁盘作为PV,而无需一个额外的外部存储服务。
  • Local PV常常应用于对IO较为敏感的数据服务,比如,分布式数据存储、分布式文件系统、以及需要在本地磁盘上缓存数据的分布式应用。
  • Local PV所在节点一旦宕机且不能恢复时,会存在数据丢失问题,因此使用Local的应用必须具备数据备份和恢复的能力。
  • 实现Local PV的难点在于:如何把本地目录或磁盘抽象成PV,以及如何保证Pod始终能被调度到正确的节点上。

1.4、参考

https://time.geekbang.org/column/intro/100015201


存储管理4:理解Local PV
https://kuberxy.github.io/2020/10/05/存储管理4:理解Local PV/
作者
Mr.x
发布于
2020年10月5日
许可协议