使用 keystoneauth1 适配器进行端点

https://blueprints.launchpad.net/nova/+spec/use-ksa-adapter-for-endpoints

keystoneauth1 适配器用于端点发现和版本控制,自 keystoneauth1 3.x.x 版本发布以来,已经整合并可用。目前正在推动在任何需要端点发现的情况下,一致地使用这些机制。此举旨在利用适配器,使 Nova 在其使用的各种服务中实现端点发现的一致性:身份验证 (keystone)、镜像 (glance)、块存储 (cinder)、网络 (neutron)、裸机 (ironic) 和放置 (placement)。

注意

这是在 蓝图 use-service-catalog-for-endpoints 基础上持续发展的工作。

问题描述

Nova 使用来自 nova.conf 文件的 API 端点配置参数,与 OpenStack 部署中的其他服务进行通信。这些服务包括

  • 身份验证 (keystone)

  • 镜像 (glance)

  • 块存储 (cinder)

  • 网络 (neutron)

  • 裸机 (ironic)

  • 密钥管理 (barbican)

  • 放置 (placement)

目前,存在多种不同的方式来发现和配置服务端点。例如,不同的服务使用不同的配置键来表示相同的端点特征;例如,端点 URL 可以指定为

  • 裸机,作为一个名为 [ironic]api_endpoint 的单个 URIOpt

  • 网络,作为一个名为 [neutron]url 的单个 URIOpt

  • 镜像,作为一个名为 [glance]api_servers 的 URL 字符串列表 (实际上,这是设置镜像服务端点的唯一方式)

  • 块存储,由一个使用上下文对象中的值进行插值的 StrOpt 模板 ([cinder]endpoint_template)

  • 密钥管理,作为一个名为 [barbican]barbican_endpoint 的单个 StrOpt

  • 放置和身份验证,根本没有 (不允许端点覆盖)

此举的目的是在 Nova 中暴露一个清晰、一致的端点发现机制;并对 Nova 与其通信的所有服务使用该机制。

用例

作为操作员,我希望有一种一致的方式来配置我的服务的端点发现。

作为维护代码的开发人员,我只想学习一种服务端点设置和配置的范例。

作为创建与新服务通信的代码的开发人员,我希望能够采用与其他服务相同的方式。

提议的变更

keystoneauth1 库提供了一种简单而一致的方式来配置服务的端点发现。keystoneauth1 的使用者需要执行以下步骤

# 在 oslo_config 设置中,注册 keystoneauth1 的 conf 选项

auth、Session 和 Adapter 对象通过 keystoneauth1.loading.register_*_conf_options

# 在运行时创建 Adapter,通过链式调用

keystoneauth1.loading.load_*_from_conf_options 来加载 auth、Session 和 Adapter,并将注册的 conf 组提供给这些方法。(或者,可以向 Adapter 加载器提供现有的 auth 和/或 Session。)

# 使用结果 Adapter 的发现方法,例如

get_endpoint,根据需要。

注意

也可以直接使用 Adapter 与 REST 服务进行通信,通过标准方法 (getpost 等)。未来的工作可能会着重消除每个服务的自定义客户端,而支持这种机制。

从操作员的角度来看,这提供了一种一致的方式来配置服务端点。对于每种服务类型,配置选项具有相同的名称和语义。(对于某些服务类型,可以从上下文中获取身份验证信息,从而消除身份验证配置的需要。)

为了使开发人员体验一致,我们建议在 Nova 中添加一个新方法 get_ksa_adapter()。为了与任何其他服务建立通信,Nova 将调用此方法并使用结果 Adapter 来发现端点数据。此方法将使用 服务类型权威机构 通过 os-service-types 将服务类型名称映射到基于项目名称的各自的 conf 组(例如,服务类型 image 映射到 glance 项目,因此映射到 [glance] conf 组)。

注意

在未来的某个时候,应该努力将 conf 组从项目名称重命名为各自的服务类型名称。这不在本蓝图的范围内。

在 Queens 周期中,现有的配置选项和发现机制将继续受到支持。如果指定了遗留配置选项,则它将优先;否则,将使用新机制。这是为了确保向后兼容性和平滑的升级体验。但是,旧样式的选项将在 Queens 中被弃用,设置它们将记录警告。弃用的遗留端点选项将在 Rocky 版本中删除。

例外是 [glance]api_servers,它将继续受到支持。操作员需要一种指定列表镜像服务端点的方式,而 keystoneauth1 适配器中没有这种机制。

如果未通过 valid_interfaces conf 选项另有说明,keystoneauth1 默认情况下会尝试,按顺序,publicinternaladmin。Nova 的实现将覆盖默认设置,尝试 internal,然后 public。(值得注意的是,publicURL 是迄今为止一直使用的形式,但 public 是 keystone v3 版本的接口。配置应该接受两者,但附加到 keystoneauth1 暴露的 conf 选项的文档显示使用 public 的示例。)

关于 Barbican 的说明

Barbican 配置选项由 castellan 库提供和使用。可能可以覆盖/弃用这些选项来自 Nova,以使其符合本规范其余部分的标准。但是,使其发生正确的方法是让 castellan 项目本身转向通用的 keystoneauth 配置。因此,在本规范的范围内,将不会努力“修复”[barbican][key_manager] conf 部分。

备选方案

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

在某些配置下(例如,如果未指定 endpoint_override),端点发现可能需要额外的 API 调用。将尽一切努力通过缓存发现的副产品(Adapter 对象、结果客户端等)来限制这些调用,以便在最坏的情况下,影响每个服务类型和端点版本一次。

其他部署者影响

除了 [glance]api_servers 之外,旧的端点配置选项将在 Queens 中被弃用,并在 Rocky 中删除。

开发人员影响

升级影响

鼓励升级到 Queens 的部署者过渡到使用本规范中描述的新端点发现机制。但是,不这样做不应立即产生功能影响。任何现有的端点相关 conf 选项将继续工作,但将开始记录弃用警告。不包含端点相关 conf 选项的配置部分应开始无缝使用新机制。

升级到 Rocky 的部署者必须过渡到新的 conf 机制。这种影响将在 Rocky 的后续工作中进一步描述。

没有数据库或 REST API 的升级影响。没有外部可见的行为变化。

实现

负责人

主要负责人

Eric Fried (efried@us.ibm.com)

其他贡献者

工作项

  • 添加用于一致 conf 设置的实用程序。这是为了集中例如 valid_interfaces 的覆盖。

  • 修改现有服务的 conf 设置文件,以

    • 使用这些实用程序和 keystoneauth1.loading 方法来注册和列出 keystoneauth1 auth、Session 和 Adapter 对象的 conf 选项。

    • 弃用与端点发现相关的遗留选项(不包括 [glance]api_servers)。

  • 添加 Nova 中的一个实用程序方法来从 conf 创建 keystoneauth1 Adapter。

  • 更新使用端点的 Nova 代码,如果未指定遗留 conf 选项,则利用新的实用程序方法。

  • (Rocky) 删除已弃用的端点相关 conf 选项,以及使用它们的代码分支。

依赖项

  • keystoneauth1 3.2.0 或更高版本

  • os-service-types 1.1.0 或更高版本

  • 服务类型权威机构(这是支持 os-service-types 的与语言无关的数据存储库。它不是 pypi 包,也没有 Nova 的 requirements.txt 中的位置。)

测试

  • 需要添加单元测试。

  • 将提出在 devstack 和其他项目的 devstack 设置中删除遗留端点相关 conf 选项和/或指定新选项的补丁。这些补丁通过各种 devstack 门控将证明新机制有效。(其中一些补丁最终可能会合并,但这不是本规范范围内的要求。)

文档影响

  • 样本 conf 文件将通过对各种 oslo_config 设置模块的更改自动更新。

  • 受影响服务的管理员、用户和安装指南将被清理,以删除对受影响配置选项的引用。

参考资料

历史

修订版

发布名称

描述

Pike

引入(作为 蓝图 use-service-catalog-for-endpoints

Queens

更新以反映 keystoneauth1 适配器使用的方向