Oslo/blueprints/message-proxy-server
Oslo.messaging: 消息代理
注意:亚特兰大设计峰会的共识是采用“增强 neutron 元数据代理并使用基于 HTTP 的通知(Clint Byrum)”这一方案。
需要根据共识更新蓝图,并为 neutron 提交一个新的 http 代理蓝图。然后开始首次实现。
- 蓝图 https://blueprints.launchpad.net/oslo.messaging/+spec/message-proxy-server
- https://review.openstack.org/77862 _driver: 实现 unix domain 支持
- https://review.openstack.org/77863 proxy: 实现代理服务器
- https://etherpad.openstack.org/p/juno-summit-oslo-messaging-rpc-proxy
在两个消息服务器或传输之间代理消息
一个消息服务器位于 OpenStack 控制网络中,OpenStack 服务器连接到该网络;另一个消息服务器位于 OpenStack 租户网络中,代理连接到该网络。OpenStack 服务器希望向租户网络中的代理发送 RPC 消息。控制网络不直接连接到租户网络。因此,代理服务器通过 unix domain socket 中继 RPC 消息以绕过 Linux netns。支持的 RPC 包括 cast、call 和 fanout。目前不需要通知,因此不支持通知。但很容易添加。
用例
许多 OpenStack 项目使用 server<-> guest agent 模式。Murano, Heat, savanna,
- Heat, Savanna, Trove, Murano, Solum
- 用于 NFV(网络功能虚拟化)的 Neutron
Neutron 也需要与 guest 代理进行类似的通信以支持 NFV。
https://blueprints.launchpad.net/neutron/+spec/adv-services-in-vms 每个 guest 代理都有自己的 UUID,用作 RPC 主题的主机部分。服务器记录这些代理 UUID,并使用 UUID 作为主机发送 RPC 请求。
- 在 guest 中使用 amqp 的示例
guest 代理利用 RPC 很方便。在这种情况下,AMQP 服务可以部署在租户网络中 ![]()
- 0MQ(Dmitry Mescheryakov 建议)
oslo.messaging 也支持 0MQ,因此也可以使用 0MQ 代替 AMQP。
Neutron 代理(不仅是 guest 代理,还包括主机中的现有代理)的工作方式
- 从服务器到代理的通信
- neutron 服务器发送消息以进行配置更改。
- guest 代理根据新请求更新设置/配置:例如,用户更改防火墙规则,请求的更改被推送到代理。
- 从 guest 到服务器的通信
- guest 代理发送消息给 neutron 服务器以进行维护。
- 状态报告:更新统计数据/代理存活状态:在负载均衡器示例中,负载均衡器需要向 neutron 服务器报告其状态(active/slave)。然后将采取反应。
- 定期获取当前配置以防消息重排/丢失:如果代理本地配置与 neutron 服务器的配置不同步,代理需要轮询并重新同步其配置。
设计/实现
oslo.messaging 中增加了什么
- RPC 代理服务器,用于将 RPC 从一个消息队列服务器中继到另一个消息队列服务器。
- 通过 unix domain socket 的新传输支持。虽然目前只支持 unix domain socket,但很容易添加对类似文件的对象(如 unix pipe)的支持。
支持的 RPC 语义
支持 RPC cast/call/fanout。但不支持通知,因为我不需要它。然而,很容易添加。使用 call 语义时的一个棘手部分是超时,因为消息中没有超时信息。
代理管理
假设 VM 中的代理由启动脚本或等效工具(cloud-init)运行,并且始终运行。如果需要某种代理管理,可以引入管理子代理的超级代理。超级代理根据来自 OpenStack 服务器的请求启动/终止子代理。
安全考虑因素
允许 guest 代理与 OpenStack 服务器通信存在安全问题。有几种方法可以缓解这个问题。
- 单向 cast:使用 unix pipe 进行只写
- guest 代理无法向服务器发送任何内容
- 单向 call:需要双向通信
- guest 代理只能发送 RPC 回复
- 允许 guest 代理 cast
- 允许 guest 代理 call
- 限制侦听目标(exchange、topic、host)
- conductor 服务用于审计请求/缓解 DoS
其他需要考虑的事项
- 实时迁移(Daniel P. Berrange)
由于 QEMU 正在迁移,当代理正在向 guest VM 发送数据时,virtio 串行通道可能会关闭,这可能会导致 guest 中的消息丢失或损坏,并且如果此通道是只写的,发送方不会知道这一点,因为没有 ACK。
代理部分
代理部分由使用它的子项目决定。目前不在 oslo.messaging 的范围内。它将通过统一代理工作来解决。https://wiki.openstack.org/wiki/UnifiedGuestAgent
其他方法/想法
这里是在讨论中出现的想法/方法,以供记录
基于网络的代理(Sahara/Marconi 案例)
Sahara 通过公共网络与 guest 代理通信。因此它不需要跨越边界。
server <-mgmt netowrk-> MQ (Marconi) <-pulic network-> agent
guest 代理通过公共 REST API 与 Marconi 通信,并在此之上发出 RPC。前提是运行 guest 代理的 VM 位于连接到公共网络的租户网络中。
增强 neutron 元数据代理并使用基于 HTTP 的通知(Clint Byrum)
如果我们用一个类似于 neutron 元数据代理管理连接的东西替换掉你的本地 socket,它将连接转发到 EC2 元数据服务呢?
- guest 启动,代理通过 REST 请求联系端口 80 上的链路本地地址
以获取与服务 XYZ 的通信通道。
- 元数据代理在代理的网络上分配一个端口,并
将该端口代理到预期的端点。
- guest 现在直接与该地址通信,仍然被 nicely
限制在私有网络中,没有任何网关,但能够与“云下”服务通信。
无论所需的传输方式(marconi, amqp, 0mq, whatever)如何,它都将通用可用,并且在 Neutron 的术语中直接建模,而不是需要与 Nova 和 hypervisors 紧密耦合。
使用 provider network
创建 ServiceVM 连接到的 provider network。
