DevStack 网络

DevStack 体验的重要组成部分是为创建的虚拟机默认启用的网络。这可能并不适合您的特定测试环境,因此本文档尽力解释正在发生的事情。

默认设置

如果您没有指定任何配置,您将获得以下设置

  • neutron(包括带有 openvswitch 的 l3)

  • 为每个 openstack 项目提供私有项目网络

  • 一个浮动 IP 范围为 172.24.4.0/24,网关为 172.24.4.1

  • demo 项目配置了固定 IP,分配来自 10.0.0.0/22 范围的子网

  • 一个 br-ex 接口由 neutron 控制,用于所有网络(这未连接到任何物理接口)。

  • 基于主机 resolv.conf 的虚拟机 DNS 解析

  • 一个 ip masq 规则,允许创建的虚拟机路由出去

这创建了一个与单个主机隔离的环境。虚拟机可以获取外部网络以进行软件包更新。Tempest 测试在这种环境下可以工作。

注意

默认情况下,所有 OpenStack 环境都有安全组规则,这些规则阻止所有入站数据包到达虚拟机。如果您想能够 ssh / ping 您的创建的虚拟机,您应该运行以下命令。

openstack security group rule create --proto icmp --dst-port 0 default
openstack security group rule create --proto tcp --dst-port 22 default

本地可访问的虚拟机

如果您想让您的虚拟机可以从网络上的其他机器访问,我们必须将 br-ex 连接到物理接口。

专用虚拟机接口

如果您在 devstack 服务器上有 2 个或更多接口,您可以分配一个接口给 neutron 完全管理。这不应该是您用来 ssh 到 devstack 服务器本身的接口。

这通过使用 PUBLIC_INTERFACE 属性设置来完成。

[[local|localrc]]
PUBLIC_INTERFACE=eth1

这将把所有来自虚拟机的 layer 2 流量放到主网络上。以这种模式运行时,ip masq 规则不会在您的 devstack 中添加,您负责使本地网络上的路由工作。

共享虚拟机接口

警告

这不是推荐的配置。由于 OVS 和桥接之间的交互,如果您在激活网络的情况下重新启动您的机器,您可能会失去对系统的网络连接。

如果您需要您的虚拟机可以访问网络,但只有一个接口(使用像 NUC 这样的东西),您可以共享您的一个网络。但是,为了使这起作用,您需要手动设置很多地址,并且所有地址都必须完全正确。

[[local|localrc]]
PUBLIC_INTERFACE=eth0
HOST_IP=10.42.0.52
FLOATING_RANGE=10.42.0.0/24
PUBLIC_NETWORK_GATEWAY=10.42.0.1
Q_FLOATING_ALLOCATION_POOL=start=10.42.0.250,end=10.42.0.254

为了使这种场景起作用,浮动 IP 网络必须与服务器上的默认网络匹配。这会破坏 HOST_IP 检测,因为我们默认排除浮动范围,因此您必须手动指定它。

PUBLIC_NETWORK_GATEWAY 是服务器通常用于离开网络的网关。 Q_FLOATING_ALLOCATION_POOL 控制将分配的浮动 IP 范围。由于我们正在共享您现有的网络,您希望为其提供一个切片,您的本地 dhcp 服务器没有分配该切片。否则,您很容易遇到冲突的 IP 地址,并导致本地网络混乱。

私有网络寻址

私有网络地址由 IPV4_ADDRS_SAFE_TO_USEIPV6_ADDRS_SAFE_TO_USE 变量控制。这允许用户指定一个安全的内部 IP 变量,无论是否使用子网池,都将引用该变量。

对于 IPv4,FIXED_RANGESUBNETPOOL_PREFIX_V4 将直接默认为 IPV4_ADDRS_SAFE_TO_USE 的值。

对于 IPv6,FIXED_RANGE_V6 将默认为 IPV6_ADDRS_SAFE_TO_USE 的第一个 /64。如果 IPV6_ADDRS_SAFE_TO_USE 是 /64 或更小,FIXED_RANGE_V6 将直接使用该值。 SUBNETPOOL_PREFIX_V6 将直接默认为 IPV6_ADDRS_SAFE_TO_USE 的值。

SSH 访问实例

为了验证连接,您可以使用 $PRIVATE_NETWORK_NAME 网络(默认:private)创建一个实例,使用 $PUBLIC_NETWORK_NAME 网络(默认:public)创建一个浮动 IP,并将此浮动 IP 附加到实例

openstack keypair create --public-key ~/.ssh/id_rsa.pub test-keypair
openstack server create --network private --key-name test-keypair ... test-server
fip_id=$(openstack floating ip create public -f value -c id)
openstack server add floating ip test-server ${fip_id}

完成之后,请确保您已为实例使用的安全组启用了 SSH 和 ICMP(ping)访问。您可以创建一个自定义安全组并在创建实例时指定它,也可以在创建之后添加它,或者您可以修改默认为每个项目创建的 default 安全组。让我们做后者

openstack security group rule create --proto icmp --dst-port 0 default
openstack security group rule create --proto tcp --dst-port 22 default

最后,SSH 到实例。如果您使用默认上传的 Cirros 实例,则可以运行以下命令

openstack server ssh test-server -- -l cirros

这将使用 cirros 用户和您在创建实例时配置的密钥对进行连接。

远程 SSH 访问实例

您还可以从其他主机上的 DevStack 主机 SSH 到创建的实例。如果您例如在现有云上的 VM 中部署 DevStack 并且希望在本地机器上进行开发,这会很有帮助。有几种方法可以做到这一点。

配置实例为本地可访问

最明显的方法是配置虚拟机为本地可访问,如 上方 所述。这具有无需在客户端进行进一步努力的优点。但是,它涉及更多内容,并且需要您的云的支持或一些不建议的解决方法。

将您的 DevStack 主机用作跳板主机

您可以选择将您的 DevStack 主机用作跳板主机。要以这种方式 SSH 到实例,请将标准 -J 选项传递给 openstack ssh / ssh 命令。例如

openstack server ssh test-server -- -l cirros -J username@devstack-host

(其中 test-server 是现有实例的名称,如 之前 所述,usernamedevstack-host 是您的 DevStack 主机的用户名和主机名)。

这也可以通过您的 ~/.ssh/config 文件进行配置,使其相当轻松。但是,它仅允许 SSH 访问。如果您想访问实例上的例如 Web 应用程序,您需要配置 SSH 隧道并使用 -L 选项转发选定的端口。例如,要转发 HTTP 流量

openstack server ssh test-server -- -l cirros -L 8080:username@devstack-host:80

(其中 test-server 是现有实例的名称,如 之前 所述,usernamedevstack-host 是您的 DevStack 主机的用户名和主机名)。

正如您可以想象的那样,这可能会迅速失控,特别是对于具有多个端口的更复杂的虚拟机应用程序。

使用代理或 VPN 工具

您可以使用代理或 VPN 工具来启用 $PUBLIC_NETWORK_NAME 网络(默认:public)定义的 $FLOATING_RANGE(默认:172.24.4.0/24)的浮动 IP 地址范围的隧道。有很多这样的工具可以做到这一点。例如,我们可以使用一个有用的工具,称为 shuttle。要使用 shuttle 启用隧道,首先确保您允许 SSH 和 HTTP(S) 流量到您的 DevStack 主机。允许 HTTP(S) 流量是必要的,这样您就可以远程使用 OpenStack API。具体做法取决于您的 DevStack 主机在哪里运行。完成之后,在您的本地主机上安装 sshuttle

sudo apt-get install sshuttle || dnf install sshuttle

最后,使用浮动 IP 地址范围在您的本地主机上启动 sshuttle。例如,假设您正在使用 $FLOATING_RANGE 的默认值,您可以执行

sshuttle -r username@devstack-host 172.24.4.0/24

(其中 usernamedevstack-host 是您的 DevStack 主机的用户名和主机名)。

您现在应该能够创建一个实例并 SSH 到它

openstack server ssh test-server -- -l cirros

(其中 test-server 是现有实例的名称,如 之前 所述)