间接访问虚拟机

https://blueprints.launchpad.net/sahara/+spec/indirect-vm-access

该蓝图提出了一种 Sahara 管理虚拟机的新方式。管理可以通过充当代理节点的虚拟机来完成。在这种情况下,只有一台虚拟机需要从控制器获得访问权限。

问题描述

目前有几种方法可以使 Sahara 访问虚拟机

  1. 扁平私有网络

    • 不安全

    • 不适用于 neutron

  2. 浮动 IP

    • 所有节点都需要具有浮动 IP

      • 浮动 IP 是有限的资源

      • 浮动 IP 通常用于外部世界,而不是从控制器访问

    • 所有节点都需要从控制器节点可访问

      • 在 HA 模式下更加复杂

    • 对数据节点的访问应该是安全的

  3. net_ns

    • 难以配置

    • 可能不合适

    • 不适用于 HA 模式

  1. 特定于租户的代理节点 (https://review.openstack.org/#/c/131142/)

    • 代理设置适用于整个系统(基于模板)

    • 无法为特定集群配置代理

    • 需要手动生成和配置代理节点

  1. 代理

    • 尚未实现

    • 需要虚拟机和控制器可访问的外部消息队列

    • 需要维护代理

因此,可能存在上述方法都不适用的情况。

提议的变更

该蓝图提出了一种 Sahara 访问虚拟机的新方法。Sahara 将使用其中一个生成的虚拟机作为代理节点,并通过它访问所有其他节点。可以使用上述任何一种方法获得对具有代理节点角色的虚拟机的访问权限。

Sahara 将通过 nodegroup 的“is_proxy”字段来了解使用哪个节点作为代理节点。如果此 nodegroup 包含多个实例,则第一个实例将用作代理(这为负载均衡留下了空间)。

因此,建议的工作流程

  1. Nodegoup 对象扩展了“is_proxy”字段,horizon 相应地进行了更改。

  2. 用户为其中一个节点组(manager、master 或单独的节点组)选择“is_proxy”复选框。如果代理用于单独的节点组,则可以使用非常小的 flavor。

  3. Sahara 生成所有基础设施

  4. Sahara 通过具有代理角色的节点与所有实例通信。内部 IP 用于通信。这消除了如果使用浮动网络进行管理,所有节点都必须具有浮动 IP 的限制。在代理节点的情况下,此限制仅适用于代理节点。

优点

  1. 我们只需要对一台虚拟机进行外部访问。

  2. 可以隔离数据节点

缺点

  1. 间接访问可能会更慢。

  2. 代理丢失意味着丢失对整个集群的访问权限。可以进行智能选择,但首次实现中不计划这样做。

实现将扩展在 https://review.openstack.org/#/c/131142/ 实现的全局代理。对于间接访问,将使用基于 Paramiko 的“ssh proxy nc host port”命令的类似方法。Paramiko 实现将允许使用内存中的私钥。

请注意,代理命令仍然可以用于访问代理实例。

实现细节

Sahara 使用两种方式访问实例

  1. SSH

  2. HTTP

SSH 访问

对于 ssh 访问,将添加一层 ssh。旧代码

_ssh.connect(host, username=username, pkey=private_key, sock=proxy)

新代码

_proxy_ssh = paramiko.SSHClient()
_proxy_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

_proxy_ssh.connect(proxy_host, username=proxy_username,
                   pkey=proxy_private_key, sock=proxy)

chan = _proxy_ssh.get_transport().open_session()
chan.exec_command("nc {0} {1}".format(host, SSH_PORT))

_ssh.connect(host, username=username, pkey=private_key, sock=chan)

HTTP 访问

Http 访问将以类似于 ProxiedHTTPAdapter 的方式实现。将实现一个 SshProxySocket 类,该类对应于在远程主机上运行的 netcat socket。

请注意,如果存在 proxycommand,它将直接传递给 paramiko,而不涉及 NetcatSocket 类。

替代方案

该蓝图提供了访问虚拟机的另一种方式。所有现有方式将保持不变。

数据模型影响

REST API 影响

nodegroup 和 nodegroup template 对象中的新布尔字段“is_proxy”。

其他最终用户影响

部署者影响

需要考虑的另一个部署选项。

开发者影响

Sahara-image-elements impact

Sahara-dashboard / Horizon 影响

nodegroup template 编辑表单中的复选框。

实现

负责人

主要负责人

Andrew Lazarev (alazarev)

工作项

  • Sahara 核心更改

  • Python 客户端更改

  • Horizon 更改

  • 文档更改

依赖项

测试

手动

文档影响

需要记录此功能。

参考资料