通过 Aetos 支持 Prometheus 数据源的多租户¶
launchpad 蓝图
https://blueprints.launchpad.net/watcher/+spec/prometheus-multitenancy-support
遥测团队正在开发 Aetos 反向代理,以添加多租户能力和基于 Keystone 的身份验证,用于存储在 Prometheus 中的指标。需要在 watcher 中添加对 Aetos 的支持。
问题描述¶
目前 Watcher 支持 Prometheus 作为指标数据源,并提供可选的基本身份验证或 mTLS。但 Prometheus 不支持多租户或基于角色的访问控制,这在 OpenStack 服务中很常见。为了解决这个问题,遥测团队正在开发一个名为 Aetos 的反向代理,以允许使用 Keystone 身份验证和角色进行多租户管理,类似于当前 Gnocchi 的处理方式。Watcher 目前不支持与 Aetos 通信,因此需要增强 Watcher 以支持 Aetos 作为新的数据源
用例¶
作为部署者,我希望通过禁用对 Prometheus 的外部访问并实施通过 Aetos 反向代理服务器的 RBAC 来提供更安全的存储指标。
提议的变更¶
从 Watcher 的角度来看,Aetos 的描述
Aetos 是一个反向代理,部署在 Prometheus 前面。Aetos 暴露了 Prometheus HTTP API 的一部分,并要求并验证每个请求的 Keystone Token。Token 会被检查以确定发送请求的用户的角色。Watcher 预计会附加一个具有管理员或服务角色的 Token。如果一切正常,则每个请求将原样转发到 Prometheus,Prometheus 的响应将原样转发回 Watcher。完全支持 PromQL 语言,并且 Watcher 所需的所有 API 均受支持。预计 Aetos 始终会在 Keystone 中注册一个具有服务类型为“metric-storage”的端点。
添加支持所需的更改如下
将添加一个新的 Aetos 数据源。当前的 PrometheusHelper 类将被转换为基类或 mixin。这将会在 PrometheusDirect 和 Aetos 数据源之间共享。__init__ 和 _setup_prometheus_client 方法将在 Aetos 数据源类中实现,并使用 Keystone 端点获取 Aetos 的端点,而不是使用配置中的主机和端口值。新的数据源将保持数据源和 Python 类之间的 1:1 映射,同时确保查询逻辑在基类中实现。
将添加一个新的 Aetos 配置部分,其中包含配置 Keystone 端点发现和用于主机和实例指标的标签的选项。
对于 PrometheusDirect 数据源,我们将使用当前实现,该实现使用配置中的主机和端口值。
在初始化 PrometheusAPIClient 时,Aetos 数据源将构造一个 Keystone 会话并将其提供给 PrometheusAPIClient 对象。
如果 aetos 服务未在 Keystone 中注册,Aetos 数据源将以错误退出,从而阻止决策引擎启动。同时配置 Prometheus 和 Aetos 数据源将被视为配置错误。
备选方案¶
无
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
我们期望在指标存储方面提高安全性,这是本次更改的全部目的。将需要进行指标访问身份验证
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
存在轻微的性能影响。由于 Aetos 作为 Prometheus 前面的反向代理,与直接向 Prometheus 发送请求相比,每个请求都需要额外的步骤。因此,预计每个请求会有略微的延迟。
其他部署者影响¶
配置选项 ‘watcher_datasources.datasources’ 将具有一个新的有效值:‘aetos’
将有一个名为 ‘Aetos’ 的新的配置部分,其中包含以下选项
interface
- 类型
string
- 默认值
public
- 有效值
internal, public, admin
在 keystoneclient 中使用的端点类型。
region_name
- 类型
string
- 默认值
<None>
用于与 OpenStack 服务通信的 Identity 服务目录中的区域。
fqdn_label
- 类型
string
- 默认值
fqdn
Prometheus 用于存储导出器 fqdn 的标签。默认为 ‘fqdn’。
instance_uuid_label
- 类型
string
- 默认值
resource
Prometheus 用于存储 OpenStack 实例 UUID 的标签。默认为 ‘resource’。
开发人员影响¶
无
实现¶
负责人¶
jwysogla
工作项¶
使用更新的 python-observabilityclient
将当前的 PrometheusHelper 类转换为基类或 mixin。__init__ 和 _setup_prometheus_client 方法应在继承自它的类中实现。
创建一个类来实现 Prometheus 数据源,该类继承自基类并使用 __init__ 和 _setup_prometheus_client 方法的当前实现。
为 Aetos 数据源添加一个配置部分,其中包含以下选项“interface”、“region_name”、“fqdn_label”、“instance_uuid_label”。描述和值应与现有客户端配置部分中的相同。
将 Aetos 添加为可能的数据源
创建一个类来实现 Aetos 数据源,该类继承自 Prometheus 基类/mixin,但实现不同的 __init__ 和 _setup_prometheus_client 方法。
Aetos 数据源类使用 Keystone 端点获取 Aetos 的端点。
Aetos 数据源类创建 PrometheusAPIClient,类似于当前为 Prometheus 创建的方式,但也会指定一个 Keystone 会话和一个从 Aetos 的端点提取的 root_path。
添加一个类似于 watcher-prometheus-integration 的 tempest 作业,该作业将配置为使用新的 Aetos 数据源而不是直接使用 Prometheus
依赖项¶
python-observabilityclient 1.0.0 或更新版本
测试¶
当前的 watcher-prometheus-integration 作业可以复制并略作修改,以便与 Aetos 一起部署,使用 Aetos 的 devstack 插件。
也将添加单元测试
文档影响¶
将在文档中添加一个新的 Aetos 数据源部分。内容应与当前的 Prometheus 文档非常相似。不同之处主要在于使用的配置选项。与 Prometheus 相比,不需要“host”、“port”或任何身份验证或 TLS 选项。但我们需要知道“interface”和“region_name”,就像大多数其他客户端一样。
将添加说明,同时拥有 Prometheus 和 Aetos 数据源不受支持,并会导致配置错误。
参考资料¶
一个与相关讨论相关的错误:https://bugs.launchpad.net/watcher/+bug/2108855
为 Prometheus 添加租户和身份验证支持的整个工作在遥测 PTG 期间进行了讨论 https://etherpad.opendev.org/p/apr2025-ptg-telemetry
历史¶
发布名称 |
描述 |
|---|---|
2025.2 |
引入 |