跳转到: 导航, 搜索

ImageStores

总结

Nova 计算节点需要能够发现可用的镜像,以及从各种对象存储中获取这些镜像的机制。镜像发现将通过镜像注册表(Parallax)提供。远程获取镜像将由缓存镜像代理(Teller,以前称为 Iback)提供。这些组件共同构成了 Glance 项目。

原理

OpenStack 的目标之一是实现云提供商之间的可移植性。为了实现这个目标,我们需要一种全局识别、描述、定位和检索镜像的方法。

镜像标识符需要在所有 OpenStack 安装中都是通用的,因为这些镜像的实例可能会从一个云提供商移动到另一个云提供商。Parallax 提供了一个系统,用于注册、发现和全局识别镜像。

Nova 控制域可以与互联网隔离以提高安全性。此外,镜像可以通过各种对象存储提供,包括公共和私有对象存储。Nova 节点应该能够通过单个代理访问这些镜像。Teller 作为此代理,并为这些各种对象存储提供一个通用接口。最后,作为一种选择,Teller 可以缓存经常访问的镜像以提高性能。

用户故事

用户希望从公共镜像构建服务器。用户查询 Parallax 以获取可用镜像列表。用户通过在 Nova API 的创建实例调用中将镜像的 Parallax URI 作为 `image_uri` 参数传递来从该镜像构建 VM。`image uri` 将传播到节点代理,节点代理会向 Teller 发送 HTTP 请求,并传递 `image_uri`。Teller 反过来从对象存储中获取镜像,并将镜像作为 HTTP 响应的主体返回给节点代理。节点代理解包镜像,执行所需的任何修复,然后启动实例。

前提条件

  • 需要支持多个镜像注册表
  • 一些镜像注册表将是公共的,但是,有些需要凭据才能访问
  • 镜像将具有可以通过 Parallax 轻松搜索的元数据
  • 需要支持各种对象存储(Swift、S3、本地文件系统等)。
  • 一些对象存储将是公开可访问的,但是,有些需要凭据才能访问。
  • 对象存储可能需要将大型镜像拆分为块。

设计

此设计提出了两个新组件:Parallax 镜像注册表和 Teller 缓存镜像代理。

Parallax 镜像注册表是一个 ReSTful Web 服务,通过查询它来提供与一组标准匹配的可用镜像列表。查询响应将包含,除其他内容外,镜像的名称、镜像的位置以及作为镜像全局唯一标识符的 URI。将 URI 作为镜像标识符将使 Nova 支持多个镜像注册表,并促进 OpenStack 安装之间的镜像共享。根据具体情况,Parallax 服务器可以选择性地需要身份验证才能执行某些或所有操作,并且可以使用 SSL 进行传输。

Nova API 的“创建实例”调用将支持一个新参数 `image_uri`,它将包含要使用的镜像的 Parallax URI。

`image_uri` 将传递给节点代理,节点代理反过来将使用 `image_uri` 向 Teller 发送 GET 请求以获取镜像。

Teller 在收到镜像 GET 请求后,将使用 `image_uri` 来验证目标镜像是否仍然可用。如果镜像仍然可用,Teller 将咨询其缓存。如果镜像存在,Teller 将返回 200 OK 并开始将数据作为响应主体的一部分进行流式传输。

如果镜像不在缓存中,Teller 将尝试验证对象存储中的对象是否仍然存在且未被修改,然后再返回响应。对于 Swift 后端,Teller 将通过对所需的每个对象执行 HEAD 请求来验证对象是否存在(对于其他后端,测试存在的方法将不同)。HEAD 请求中返回的还将是一个 Etag,Teller 将将其与存储在 Parallax 中的 `checksums` 字段进行比较。如果对象不存在或校验和不匹配,Teller 将返回 500 类错误。如果两个检查都成功,Teller 将返回 200 OK 并开始从对象存储流式传输数据。然后将数据代理回节点代理。如果镜像由对象存储中的多个块组成(例如,10 GB 镜像存储为 Swift 中的两个 5 GB 对象),则 Teller 会无缝地将这些块连接起来,以便节点代理接收单个文件:打包的镜像。

节点代理将负责根据指定的编码和格式(例如,解压缩和解压镜像)来解包镜像。

实现

由于 Parallax 在概念上只是通过 ReSTful Web 服务公开的键/值存储,因此我们在实现方面具有很大的灵活性。对于初始版本,由 SQLite 或 MySQL 数据库支持的小型 Eventlet Web 服务器就足够了。随着系统需求的增加,我们可以添加缓存、负载均衡,并可能迁移到 Redis 或 Cassandra 等 NoSQL 存储。

Teller 将由几个离散的组件组成,这些组件可以独立开发和测试。其中将包括后端适配器模块(Swift、HTTP、S3 等)、用于查询 Parallax 以获取位置信息的模块以及将公开用于镜像的 ReSTful Web 服务的 Web 服务器。由于 Teller 使用纯 HTTP 与节点代理通信,因此我们可以使用标准的 HTTP 缓存代理(例如 Varnish)进行镜像缓存。此外,我们可以将多个 Teller 服务器添加到集群中,并使用负载均衡器来分发请求。

测试/演示计划

使用 Parallax 和对象存储的模拟对象,我们将能够功能性地测试镜像获取请求。

未解决的问题

需要管理私有 Parallax 镜像注册表以及私有对象存储的凭据。我们需要设计一种代表用户向这些系统发出经过身份验证的请求的机制。OAuth 是一个选项吗?

Bit Torrent 可以在两个地方使用:外部用于将镜像获取到系统中,内部用于在获取缓存镜像时在所有主机之间分配 I/O 负载(数百台主机与 1-10 台 Teller 服务器)。我们需要讨论是否在将来采用其中一个或两个选项。

GlanceAPISpec

图表

attachment:ImageStoreCreateFromPublicImage.jpg