镜像缓存

Nova 支持在使用支持的虚拟驱动时,在计算节点上缓存基础镜像。

什么是镜像缓存?

为了理解什么是镜像缓存以及为什么它有益,熟悉从给定基础镜像启动实例的过程会有所帮助。当在计算节点上创建新实例时,计算管理器与虚拟驱动程序一起执行以下一般步骤:

  1. 从 glance 下载基础镜像

  2. 复制或 COW 基础镜像,以创建实例的新根磁盘镜像

  3. 使用新的根磁盘镜像启动实例

第一步涉及将整个基础镜像下载到计算节点上的本地磁盘,这可能涉及大量的网络流量、存储以及启动过程开始到实际运行实例之间许多分钟的延迟。当虚拟驱动程序支持镜像缓存时,如果基础镜像已存在于计算节点上,则可以跳过上述步骤 #1。这通常发生在同一基础镜像最近已在该节点上启动了另一个实例时。如果存在,可以跳过下载操作,从而大大减少使用相同基础镜像的第二个和后续实例的启动时间,并避免对 glance 服务器和网络连接的负载。

默认情况下,计算节点会定期扫描其缓存的镜像,查找未被节点上任何实例使用的且比配置的生命周期(默认情况下为 24 小时)更旧的基础镜像。这些未使用的镜像将从缓存目录中删除,直到再次需要它们为止。

有关配置镜像缓存行为的更多信息,请参阅image_cache组中的配置选项文档。

注意

某些临时后端驱动程序可能不需要或不需要镜像缓存,或者其行为可能与其他驱动程序不同。例如,在使用rbd后端和libvirt驱动程序以及与 glance 共享池时,镜像在存储级别进行 COW,因此根本不需要在计算节点上下载(以及缓存)。

镜像缓存资源会计

通常,镜像缓存的大小不包含在 Nova 在报告可用或已用磁盘空间时包含的数据中。这意味着当nova-compute报告 100G 的总磁盘空间时,调度器将假定可以放置 100G 的实例在那里。通常磁盘是最丰富的资源,因此也是最容易耗尽的资源,因此这通常不是问题。但是,如果许多实例从不同的镜像启动,所有这些镜像都需要缓存,除了实例本身使用的磁盘空间之外,Nova 可能会通过未能考虑镜像缓存的大小而无意中过度提交磁盘。

有两种方法可以解决这种情况:

  1. 将镜像缓存挂载为单独的文件系统。这将导致 Nova 报告仅供实例使用的磁盘空间量,与缓存消耗的空间无关。Nova 将继续忽略镜像缓存的大小,如果缓存空间耗尽,构建将失败。但是,nova-compute将正确报告实例可用的磁盘空间,并由调度器准确考虑。

  2. 启用可选的保留磁盘量行为。配置变通方法workarounds.reserve_disk_resource_for_image_cache将导致nova-compute定期更新保留的磁盘量,以包括静态配置的值以及当前被镜像缓存消耗的量。这将导致调度器看到可用磁盘空间随着镜像缓存的增长而减少。这不是同步更新的,因此不是一个完美的解决方案,但应大大提高调度器的可见性,从而做出更好的决策。(请注意,此解决方案当前是 libvirt 特定的)

如上所述,并非所有后端和虚拟驱动程序都使用镜像缓存,因此第三种选择可能是考虑替代基础设施以完全消除此问题。

镜像预缓存

为了为新实例实现低启动延迟,预缓存计算节点上的镜像可能是有益的。这通常在推出新版本的应用程序时很有用,其中停机时间很重要,并且将新镜像已经可用在计算节点上至关重要。

Nova 提供了(自 Ussuri 版本以来)一种机制,用于请求在无需在节点上启动实际实例的情况下缓存镜像。此尽力服务在主机聚合级别运行,以便提供一种有效的方法来指示大量计算节点应接收给定的镜像集。如果应预缓存镜像的计算节点尚未定义在主机聚合中,则必须首先进行定义。

有关如何执行基于聚合的镜像预缓存的信息,请参阅主机聚合文档的镜像缓存部分。