从建议的存储下载镜像¶
https://blueprints.launchpad.net/glance/+spec/download-from-specific-store
目前,当你使用 GET /v2/images/{image_id}/file 下载镜像时,Glance 首先尝试默认存储。如果镜像不在那里,它会尝试其他存储,直到找到镜像为止。此规范添加了一种方法,可以告诉 Glance 在特定请求中定位镜像数据时使用哪种排序。你可以提供一个想要尝试的存储列表。这有助于计算节点和 Nova 和 Cinder 等服务从靠近它们的存储下载。
问题描述¶
在具有多个存储的部署中,镜像可以位于不同的位置,例如 Swift、Cinder、文件系统或 S3。目前 Glance 首先从默认存储下载。如果不在那里,它会逐个尝试其他存储,直到找到镜像为止。
这存在问题
服务无法指定使用哪个存储
服务无法选择更快的存储或靠近它们的存储
操作员无法测试特定存储是否正常工作
无法在不同的存储之间分散下载
2023.2 中的存储权重功能允许操作员设置存储优先级。但这仅适用于操作员。像 Nova 和 Cinder 这样的服务无法根据它们运行的位置选择存储。
用例
服务可以使用现有的 API(如 GET /v2/info/stores 和 GET /v2/info/stores/detail)找到可用的存储。这些显示存储名称、描述、类型和属性,有助于决定使用哪个存储。
性能:计算节点可以从本地存储下载,而不是远程存储
邻近性:边缘计算节点可以从靠近它们的存储下载(例如“us-east”或“eu-west”)
测试:操作员可以测试特定存储是否正常工作
负载分布:在不同的存储之间分散下载,这样单个存储就不会承受过多的负载
成本问题
如果用户可以选择任何存储,他们可能会选择昂贵的存储。例如,如果在 S3 上有一个备份存储,从它下载会产生数据传出的费用。用户可能不知道这一点。为了解决这个问题,操作员可以使用策略来控制谁可以使用此功能。操作员还可以使用良好的存储名称和描述来引导用户选择更便宜的存储。
提议的变更¶
向现有的下载端点添加新的查询参数。这允许服务建议尝试存储的顺序。
API 调用:GET /v2/images/{image_id}/file?prefer=store1,store2
工作原理
如果启用了缓存,并且镜像已缓存,则会忽略“prefer”参数并返回数据。
检查列表中存储是否存在且已配置。如果存储不存在,则返回错误。
按顺序尝试列表中的存储。从第一个具有镜像的存储下载。
如果在列出的任何存储中未找到镜像,则回退到默认行为(尝试所有存储)
这种方法优于新的端点,因为
没有添加另一个下载 API
Nova 和 Cinder 可以轻松添加首选存储,而无需进行重大更改
仍然向后兼容 - 如果没有提供参数,则工作方式与以前相同
注意
重要的缓存行为:存储偏好参数仅在从后端存储获取镜像时有效,而不是从缓存提供时。当镜像被缓存时,缓存中间件会直接提供它并完全绕过存储偏好逻辑。这意味着缓存的镜像将始终返回 HTTP 200,无论存储参数如何,并且对于缓存的镜像,将不会发生存储偏好验证(无效存储的 400 错误)。
存储偏好的策略
将添加一个新的策略规则“download_from_store”来控制谁可以使用存储偏好参数。默认策略将允许任何可以下载镜像的人也使用存储偏好。这与当前行为相匹配,即存储偏好可供所有可以下载的用户使用。部署者以后可以根据需要限制此策略。例如,他们可以使其仅对管理员或服务角色有效,以防止普通用户选择昂贵的存储。
备选方案¶
新的端点方法:创建 GET /v2/stores/{store_id}/{image_id}/file 端点。这遵循与 delete-from-store API 相同的模式。但它一次只允许一个存储。服务需要进行多次调用才能尝试不同的存储。这会使事情变得更慢更复杂。
基于标头的方案:使用 HTTP 标头来指定哪个存储。但标头更难发现和使用。
仅存储权重:使用 2023.2 中的现有存储权重。但这仅在操作员级别工作。服务无法根据它们运行的位置选择存储。
不更改:保持当前行为。但这不允许服务选择靠近它们的存储。
数据模型影响¶
无
REST API 影响¶
修改后的端点:GET /v2/images/{image_id}/file
新的查询参数
prefer:逗号分隔的存储名称列表(可选)
响应代码
200 OK:镜像已下载
400 Bad Request:无效的存储名称或错误的参数
403 Forbidden:用户没有使用此功能的权限
404 Not Found:未找到镜像
示例
从首选存储下载
- curl -H “X-Auth-Token: $TOKEN”
“http://glance-api:9292/v2/images/{image_id}/file?prefer=local-store,backup-store”
正常方式下载(无更改)
- curl -H “X-Auth-Token: $TOKEN”
“http://glance-api:9292/v2/images/{image_id}/file”
存储发现
服务可以使用 GET /v2/info/stores 找到可用的存储
- curl -H “X-Auth-Token: $TOKEN”
响应示例
{
"stores": [
{"id": "local-store", "description": "Fast local store"},
{"id": "backup-store", "description": "S3 backup store"}
]
}
向后兼容性
如果未提供查询参数,则端点的工作方式与以前完全相同。这意味着现有代码无需任何更改即可继续工作。
安全影响¶
访问控制
正常的镜像下载策略仍然适用。用户必须具有下载镜像的权限。一个新的策略规则“download_from_store”控制谁可以使用存储偏好参数。默认情况下,任何可以下载镜像的人也可以使用存储偏好。部署者以后可以根据需要限制此策略。
存储验证
Glance 将在尝试使用它们之前检查存储名称是否有效且已配置。
没有新的数据暴露
这只会更改从哪个存储下载。用户只能下载他们已经有权访问的镜像。
通知影响¶
无
其他最终用户影响¶
用户文档和 API 参考需要更新以解释新的查询参数。
性能影响¶
积极影响
服务可以选择更快的存储或靠近它们的存储。这可以使下载更快。未缓存的请求。
其他部署者影响¶
存储管理
部署者应使用良好的存储名称和描述。这有助于服务选择正确的存储。例如,“local-fast”与“backup-s3”清楚地表明哪个是本地的,哪个是昂贵的。
成本考虑
服务可能会选择昂贵的存储,例如 S3 备份存储,而不知道成本。为了处理这个问题
使用清晰的存储名称来显示哪些存储是昂贵的
添加策略规则以限制谁可以使用存储建议
考虑最初使其仅对管理员或服务角色有效
策略控制
操作员可以添加可选的策略规则来控制谁可以使用此功能。这可以基于用户角色或项目。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
abhishek-kekane
- 其他贡献者
无
工作项¶
添加查询参数解析到下载端点
实现存储列表验证
添加策略支持以控制存储建议
添加逻辑以尝试列表中的存储,如果未找到则回退到默认值
为新参数添加单元测试
为不同的场景添加功能测试
更新 API 文档
依赖项¶
无
测试¶
添加所需的单元和功能测试
添加 tempest 测试
文档影响¶
更新 API 文档
更新用户文档
更新操作员文档