跳转到: 导航, 搜索

Oslo/blueprints/message-proxy-server

Oslo.messaging: 消息代理

注意:亚特兰大设计峰会的共识是采用“增强 neutron 元数据代理并使用基于 HTTP 的通知(Clint Byrum)”这一方案。

需要根据共识更新蓝图,并为 neutron 提交一个新的 http 代理蓝图。然后开始首次实现。


在两个消息服务器或传输之间代理消息

一个消息服务器位于 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

Guest Agent Architecture.svg

Murano architecture diagram.png

  • 用于 NFV(网络功能虚拟化)的 Neutron

Neutron 也需要与 guest 代理进行类似的通信以支持 NFV。

https://blueprints.launchpad.net/neutron/+spec/adv-services-in-vms 每个 guest 代理都有自己的 UUID,用作 RPC 主题的主机部分。服务器记录这些代理 UUID,并使用 UUID 作为主机发送 RPC 请求。

Notifying-to-geust-agent.svg

Notify-guest-agent-multi-agent.svg

Virtio-serial.svg


    • 在 guest 中使用 amqp 的示例

guest 代理利用 RPC 很方便。在这种情况下,AMQP 服务可以部署在租户网络中 Amqp-per-guest-agent.svg

Single-amqp.svg

    • 0MQ(Dmitry Mescheryakov 建议)

oslo.messaging 也支持 0MQ,因此也可以使用 0MQ 代替 AMQP。


Neutron 代理(不仅是 guest 代理,还包括主机中的现有代理)的工作方式

  • 从服务器到代理的通信
    • neutron 服务器发送消息以进行配置更改。
    • guest 代理根据新请求更新设置/配置:例如,用户更改防火墙规则,请求的更改被推送到代理。
  • 从 guest 到服务器的通信
    • guest 代理发送消息给 neutron 服务器以进行维护。
    • 状态报告:更新统计数据/代理存活状态:在负载均衡器示例中,负载均衡器需要向 neutron 服务器报告其状态(active/slave)。然后将采取反应。
    • 定期获取当前配置以防消息重排/丢失:如果代理本地配置与 neutron 服务器的配置不同步,代理需要轮询并重新同步其配置。

How-neutron-agent-works.svg

设计/实现

oslo.messaging 中增加了什么

  • RPC 代理服务器,用于将 RPC 从一个消息队列服务器中继到另一个消息队列服务器。

Proxy-server.svg

  • 通过 unix domain socket 的新传输支持。虽然目前只支持 unix domain socket,但很容易添加对类似文件的对象(如 unix pipe)的支持。

File-like-transport.svg

支持的 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

Security-with-guest-agent.svg

其他需要考虑的事项

  • 实时迁移(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 位于连接到公共网络的租户网络中。

1aa-network-domains-diagram.svg

增强 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。