DevStack 网络 #
DevStack 体验的一个重要部分是默认为创建的来宾提供网络连接。这可能不是您特定测试环境的最佳选择,因此本文档尽力解释发生了什么。
默认值 #
如果您不指定任何配置,您将获得以下内容:
- neutron(包括带有 openvswitch 的 l3)
- 每个 openstack 项目的私有项目网络
- 浮动 IP 范围为 172.24.4.0/24,网关为 172.24.4.1
- 演示项目在从 10.0.0.0/22 范围分配的子网上配置了固定 IP
- 由 neutron 控制的所有网络的接口
br-ex
(不连接到任何物理接口)。 - 根据主机的 resolv.conf 为访客提供 DNS 解析
- 允许创建的访客路由出去的 IP masq 规则
这将创建一个与单个主机隔离的环境。访客可以访问外部网络以获取软件包更新。Tempest 测试将在此环境中进行。
笔记
默认情况下,所有 OpenStack 环境都有安全组规则,阻止所有发往客户的入站数据包。如果您希望能够 ssh/ping 您创建的客户,则应运行以下命令。
ubuntu@openstack-vm:~$ openstack security group list
+--------------------------------------+---------+------------------------+----------------------------------+------+
| ID | Name | Description | Project | Tags |
+--------------------------------------+---------+------------------------+----------------------------------+------+
| 109ac0cd-daf6-481c-9594-867dbbdb129b | default | Default security group | 14278ce7bc604abd91e85b82e78ea45e | [] |
| 73b1a108-a0db-49a3-973f-dc91c030d4dd | default | Default security group | 6175cac8870541d1973a0f1010981180 | [] |
| 75e4b266-40bf-4bd8-a7d5-b2f0b0d6e84d | default | Default security group | a942dd11388440a6b8b9922fb405ad55 | [] |
| 9f07480a-fded-4172-852b-c997653324dc | t1 | | 6175cac8870541d1973a0f1010981180 | [] |
+--------------------------------------+---------+------------------------+----------------------------------+------+
ubuntu@openstack-vm:~$
你可以使用以下命令删除指定的安全组:
openstack security group delete 109ac0cd-daf6-481c-9594-867dbbdb129b
openstack security group delete 75e4b266-40bf-4bd8-a7d5-b2f0b0d6e84d
确保该安全组没有被任何实例使用,否则删除可能会失败。如果安全组被实例使用,你需要先将其从实例中移除,或者选择一个新的安全组。
如果你遇到问题,随时告诉我!
openstack security group rule create --proto icmp --dst-port 0 default
openstack security group rule create --proto tcp --dst-port 22 default
openstack security group rule create --proto icmp --dst-port 0 73b1a108-a0db-49a3-973f-dc91c030d4dd
openstack security group rule create --proto tcp --dst-port 22 73b1a108-a0db-49a3-973f-dc91c030d4dd
openstack security group rule create --proto icmp --dst-port 0 9f07480a-fded-4172-852b-c997653324dc
openstack security group rule create --proto icmp --dst-port 22 9f07480a-fded-4172-852b-c997653324dc
本地可访问的访客 #
如果您想让您的客人可以从网络上的其他机器访问,我们必须连接br-ex
到物理接口。
专用客户机界面 #
如果您的 devstack 服务器上有 2 个或更多接口,您可以分配一个接口给 neutron 进行全面管理。这不应该 与您用于 ssh 进入 devstack 服务器本身的接口相同。
这是通过设置PUBLIC_INTERFACE
属性来完成的。
[[local|localrc]]
PUBLIC_INTERFACE=eth1
这会将来自您的客户机的所有第 2 层流量放到主网络上。在此模式下运行时,ip masq 规则不会添加到您的 devstack 中,您负责确保本地网络上的路由工作。
共享客户机接口 #
警告
这不是推荐的配置。由于 OVS 和桥接之间的相互作用,如果您在启用网络的情况下重新启动设备,则可能会丢失系统的网络连接。
如果您需要访客在网络上可访问,但只有 1 个接口(使用 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_USE
私有网络地址由和变量控制IPV6_ADDRS_SAFE_TO_USE
。这允许用户指定一个要使用的安全内部 IP 变量,无论是否使用子网池,都会引用该变量。
对于IPv4,FIXED_RANGE
和SUBNETPOOL_PREFIX_V4
将直接默认为的值IPV4_ADDRS_SAFE_TO_USE
。
对于 IPv6,FIXED_RANGE_V6
将默认为 的值的前 /64 IPV6_ADDRS_SAFE_TO_USE
。如果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
网络创建一个浮动 IP(默认值:)public
,然后将此浮动 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 访问实例 #
您还可以从其他主机通过 SSH 连接到 DevStack 主机上创建的实例。如果您正在现有云上的 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 工具
$PUBLIC_NETWORK_NAME
您可以使用代理或 VPN 工具为由 (默认值:public
) 定义的网络浮动 IP 地址范围($FLOATING_RANGE
默认值:172.24.4.0/24
) 启用隧道。有许多此类工具可用于执行此操作。例如,我们可以使用一个名为shuttle的实用实用程序。要使用 启用隧道shuttle
,首先确保您已允许 SSH 和 HTTP(S) 流量到您的 DevStack 主机。允许 HTTP(S) 流量是必要的,这样您就可以远程使用 OpenStack API。如何执行此操作取决于您的 DevStack 主机的运行位置。完成后,sshuttle
在您的本地主机上安装:
sudo apt-get install sshuttle || yum install sshuttle
最后,sshuttle
使用浮动 IP 地址范围在本地主机上启动。例如,假设您使用 的默认值 $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
是现有实例的名称, 如前所述)
你可以使用 openstack server start
命令来启动一个已经存在的虚拟机实例。
根据你提供的实例列表,虚拟机名称为 t2
,它的状态是 SHUTOFF
。你可以通过以下命令来启动它:
openstack server start t2
如果你想启动多个实例,可以用空格分隔多个实例名称或 ID。例如:
openstack server start t2 another_instance
另外,如果你想查看实例启动状态,可以使用:
openstack server show t2
如果有任何问题或需要进一步的帮助,随时告诉我!
要在外部连接 OpenStack 创建的实例,需要完成几个网络配置步骤:
- 确保安全组配置正确:
# 创建安全组规则,允许 SSH 访问(如果是 Linux 实例)
openstack security group rule create --protocol tcp --dst-port 22:22 --remote-ip 0.0.0.0/0 default
# 如果是 Windows 实例,需要开放 RDP 端口
openstack security group rule create --protocol tcp --dst-port 3389:3389 --remote-ip 0.0.0.0/0 default
- 分配浮动 IP:
# 创建浮动 IP
openstack floating ip create external-network
# 将浮动 IP 绑定到实例
openstack server add floating ip INSTANCE_NAME FLOATING_IP
- 检查网络配置:
# 查看实例的网络详情
openstack server show INSTANCE_NAME
# 查看网络列表
openstack network list
# 查看子网列表
openstack subnet list
主要配置步骤:
- 网络配置:
- 确保有外部网络(external network)
- 创建路由器连接内部网络和外部网络
- 配置正确的 CIDR 和网关
- 路由器配置:
# 创建路由器
openstack router create ROUTER_NAME
# 设置路由器的外部网关
openstack router set ROUTER_NAME --external-gateway external-network
# 将路由器连接到内部网络
openstack router add subnet ROUTER_NAME INTERNAL_SUBNET
- 验证连接:
# Linux 实例
ssh -i private_key.pem user@FLOATING_IP
# Windows 实例
# 使用远程桌面连接 FLOATING_IP
常见问题检查:
- 确保安全组规则正确配置
- 验证网络拓扑是否正确
- 检查路由器配置
- 确认浮动 IP 是否正确绑定
- 检查实例的网络接口配置
如果仍然无法连接:
- 检查实例内部的网络配置
- 验证防火墙规则
- 查看 OpenStack 网络服务日志
- 确认 IP 转发是否启用
- 检查 DNS 配置
浮动IP(Floating IP)可以理解为公网IP,它允许OpenStack内部的实例能够被外网访问。让我用一个简单的类比来解释:
想象一个小区(OpenStack环境):
- 内部网络(Private IP)就像小区内部的房间号,只能在小区内部使用
- 浮动IP(Floating IP)就像小区的对外门牌号,外部人员可以通过这个找到你
具体工作原理:
- 默认情况下,OpenStack实例只有内部IP:
实例A: 192.168.1.10 (内部IP,只能在OpenStack内部访问)
- 分配浮动IP后:
实例A:
- 内部IP: 192.168.1.10
- 浮动IP: 203.0.113.101 (可以从外网访问)
配置步骤:
- 创建浮动IP:
# 从外部网络池中创建一个浮动IP
openstack floating ip create external-network
- 查看可用的浮动IP:
openstack floating ip list
- 分配给实例:
# 方式1:通过命令行
openstack server add floating ip 实例名称 浮动IP地址
# 方式2:通过Web界面
# Instances -> Actions -> Associate Floating IP
使用场景:
- 需要从外网SSH连接到实例
- 实例需要提供对外服务(如网站)
- 实例需要访问外网资源
注意事项:
- 浮动IP是有限资源,用完后需要及时释放
- 一个实例可以有多个浮动IP
- 浮动IP可以在实例之间迁移
- 需要配置正确的安全组规则才能访问