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 中添加,您负责使本地网络上的路由工作。
私有网络寻址¶
私有网络地址由 IPV4_ADDRS_SAFE_TO_USE 和 IPV6_ADDRS_SAFE_TO_USE 变量控制。这允许用户指定一个安全的内部 IP 变量,无论是否使用子网池,都将引用该变量。
对于 IPv4,FIXED_RANGE 和 SUBNETPOOL_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 是现有实例的名称,如 之前 所述,username 和 devstack-host 是您的 DevStack 主机的用户名和主机名)。
这也可以通过您的 ~/.ssh/config 文件进行配置,使其相当轻松。但是,它仅允许 SSH 访问。如果您想访问实例上的例如 Web 应用程序,您需要配置 SSH 隧道并使用 -L 选项转发选定的端口。例如,要转发 HTTP 流量
openstack server ssh test-server -- -l cirros -L 8080:username@devstack-host:80
(其中 test-server 是现有实例的名称,如 之前 所述,username 和 devstack-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
(其中 username 和 devstack-host 是您的 DevStack 主机的用户名和主机名)。
您现在应该能够创建一个实例并 SSH 到它
openstack server ssh test-server -- -l cirros
(其中 test-server 是现有实例的名称,如 之前 所述)