如果您的 OpenStack 托管虚拟实例需要网络连接,您将需要创建一个网络。网络有多种类型,为了做出正确的选择,您至少需要了解两个非常重要的网络属性:“router:external”和“shared”。除非您了解这些属性及其组合的含义,否则很难做出最佳的网络选择。
在本文中,我们将解释这些属性决定的四种网络类型,以及如何配置它们,并简要解释一些典型的用例。其中一些练习适用于租户,另一些则仅适用于管理员。给出的示例可在 KVM 托管的 Red Hat 或 RDO all-in-one OpenStack 实例上完成本练习。这已在 Red Hat OpenStack Platform 8、9、10 以及 RDO Mitaka 和 Newton 上进行了测试。
四种类型的解释
下表概述了我们将要创建的网络类型及其名称。
router-external | shared | 网络类型 | 本练习中的名称 | 描述 |
false | false | vxlan | private1-demo | 典型的租户网络,仅供租户成员使用。通常是覆盖网络 (vxlan, gre)。 |
false | true | vxlan | admin1-shared | 可以由多个租户共享,并通过 RBAC 控制谁可以使用它。通常是覆盖网络 (vxlan, gre)。 |
true | false | flat | external1 | 典型的外部网络,范围是所有租户。只能由管理员创建。租户连接他们的路由器以进行外部访问。通常是“flat”或“vlan”网络。 |
true | true | flat | external2-shared | 范围是所有租户。只能由管理员创建。租户可以直接连接到它。通常被称为“provider”网络,是“flat”或“vlan”。 |
逻辑网络拓扑
OpenStack all-in-one 构建
all-in-one 实例非常方便理解不需要单独角色的新概念。故障排除和配置大大简化,这正是我们将用于示例的内容。如果您有 Red Hat 订阅,您可以按照这些说明进行操作。您还可以注册 60 天的 Red Hat OpenStack Platform 评估版。
对于 RDO 实例,请转到 此处 获取快速安装指南,并确保在 此页面 上启用其他存储库。
当您的 packstack 构建完成后,以 root 用户身份登录并运行以下命令以验证您的 OpenStack 部署是否正常工作
. ./keystonerc_admin
openstack catalog list
neutron agent-list
nova service-list
nova boot --flavor m1.tiny --image cirros --nic net-name=private admin01
在您确定 OpenStack 的运行状况后,删除您刚刚创建的虚拟实例,以及 packstack 安装创建的“Public”和“Private”网络(及其子网)和“router1”。
KVM 主机配置
本练习的 KVM 主机将具有三个网络
Linux 网桥名称 | KVM 网络名称,VM 网卡 | 用途 |
virbr0 | default, eth0 | 直接访问 OpenStack 虚拟主机。 |
virbr1 | external1, eth1 | 实例的外部访问,可以通过 SNAT 或浮动 IP。 |
virbr2 | external2, eth2 | 直接外部访问。 |
您的 KVM 主机可能已经带有 eth0 上的默认网络以及网桥 virbr0。我们将定义然后创建其他两个外部网络。请务必以 root 用户身份执行此操作
cat > /tmp/external1.xml << EOF
<network>
<name>external1</name>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<mac address='52:54:00:73:a0:8e'/>
<ip address='172.16.0.1' netmask='255.255.255.192'>
</ip>
</network>
EOF
cat > /tmp/external2.xml << EOF
<network>
<name>external2</name>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr2' stp='on' delay='0'/>
<mac address='52:54:00:61:98:8c'/>
<ip address='172.16.0.65' netmask='255.255.255.192'>
</ip>
</network>
EOF
现在创建这些网络并启动它们
virsh net-define /tmp/external1.xml; virsh net-define /tmp/external2.xml
virsh net-autostart external1; virsh net-autostart external2
virsh net-start external1; virsh net-start external2
现在为每个外部网络向 OpenStack all-in-one 实例添加一个 VNIC。从 KVM 主机执行此操作
dom=<your Red Hat Enterprise Linux or RDO instance name from ‘virsh list’>
virsh attach-interface --domain $dom --type network --source external1 --model virtio --config --live
virsh attach-interface --domain $dom --type network --source external2 --model virtio --config --live
验证 KVM 主机
$ virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
external1 active yes yes
external2 active yes yes
$ brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400ce5983 yes virbr0-nic
virbr1 8000.52540073a08e yes virbr1-nic
virbr2 8000.52540061988c yes virbr2-nic
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.0.0 0.0.0.0 255.255.255.192 U 0 0 0 virbr1
172.16.0.64 0.0.0.0 255.255.255.192 U 0 0 0 virbr2
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
OpenStack all-in-one 配置
我们需要对 packstack 交付的 Neutron 配置进行一些更改,以删除单个 Linux 网桥“br-ex”,并重新添加新的网桥 br-ex 和 br-ex2 以及我们将它们附加到的 flat 网络
yum install crudini -y
crudini --set /etc/neutron/l3_agent.ini DEFAULT external_network_bridge #blank this
crudini --set /etc/neutron/l3_agent.ini DEFAULT gateway_external_network_id #blank this
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 type_drivers vxlan,flat
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 network_vlan_ranges physnet1,physnet2
crudini --set /etc/neutron/plugins/ml2/openvswitch_agent.ini ovs bridge_mappings physnet1:br-ex,physnet2:br-ex2
请注意,当使用“flat”网络时,您可以自行决定如何命名 network_vlan_ranges。当您创建外部网络时,这些将是“--provider:physical_network”名称。外部网桥名称 (br-ex*) 也是您的选择。
现在为 Open vSwitch 创建接口配置
cat > /etc/sysconfig/network-scripts/ifcfg-br-ex << EOF
DEVICE=br-ex
ONBOOT=yes
HOTPLUG=no
NM_CONTROLLED=no
PEERDNS=no
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
IPADDR=172.16.0.1
NETMASK=255.255.255.192
EOF
cat > /etc/sysconfig/network-scripts/ifcfg-eth1 << EOF
DEVICE=eth1
ONBOOT=yes
HOTPLUG=no
NM_CONTROLLED=no
PEERDNS=no
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=br-ex
BOOTPROTO=none
EOF
cat > /etc/sysconfig/network-scripts/ifcfg-br-ex2 << EOF
DEVICE=br-ex2
ONBOOT=yes
HOTPLUG=no
NM_CONTROLLED=no
PEERDNS=no
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
IPADDR=172.16.0.65
NETMASK=255.255.255.192
EOF
cat > /etc/sysconfig/network-scripts/ifcfg-eth2 << EOF
DEVICE=eth2
ONBOOT=yes
HOTPLUG=no
NM_CONTROLLED=no
PEERDNS=no
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=br-ex2
BOOTPROTO=none
EOF
验证 Open vSwitch 外部网桥
完成这些配置步骤后,您将需要重新启动您的虚拟主机。重新启动后,创建的网桥应如下所示
ovs-vsctl list-ports br-ex
eth1
phy-br-ex
ovs-vsctl list-ports br-ex2
eth2
phy-br-ex2
Neutron 网络、子网和路由器
最后,我们准备好开始处理并创建我们一直在谈论的网络。以下一系列命令将创建网络、子网、路由器、安全组规则、实例和浮动 IP。完成此操作后,您将拥有四种不同类型的网络以供使用。
外部网络
以下系列创建我们的外部网络。请注意,这两个网络都使用“router:external=true”,并且它们都是“network_type=flat”,但每个网络都在不同的 physical_network 上,并且第二个网络具有“--shared”属性
. ~/keystonerc_admin
neutron net-create external1 --router:external=True --provider:network_type=flat --provider:physical_network=physnet1
neutron subnet-create --name external1-subnet --disable-dhcp external1 172.16.0.0/26 --allocation-pool start=172.16.0.2,end=172.16.0.62
neutron net-create external2-shared --shared --router:external=True --provider:network_type=flat --provider:physical_network=physnet2
neutron subnet-create external2-shared --name external2-shared-subnet --allocation-pool\
start=172.16.0.66,end=172.16.0.126 --gateway 172.16.0.65 172.16.0.64/26
租户网络和路由器
租户网络是您可以创建自己的私有 rfc 1918 地址空间的地方。租户可以配置网络、子网和路由器的任意组合,以满足他们的需求。他们可以定义自己的广播域,并确定哪些实例可以通过 浮动 IP 地址 从外部访问。
以下命令创建一个私有或“租户”网络和子网。它还创建一个路由器以将其附加到外部网络 external1。请注意,我们正在切换到“demo”项目以进行这些网络操作
. ~/keystonerc_demo
neutron net-create private1-demo
neutron subnet-create private1-demo 10.0.1.0/24 --name private1-demo-subnet
请注意,此网络是使用以下默认设置创建的
neutron net-show -c 'router:external' -c shared private1-demo
+-----------------+-------+
| Field | Value |
+-----------------+-------+
| router:external | False |
| shared | False |
+-----------------+-------+
neutron router-create router1-demo
neutron router-gateway-set router1-demo external1
neutron router-interface-add router1-demo private1-demo-subnet
路由器网关应该是可 ping 通的。执行此命令并 ping 它返回的网关 IP
neutron router-list -c external_gateway_info | grep -o "172.16.0.[0-9]*"
安全组规则、虚拟实例和浮动 IP
在创建虚拟实例之前,让我们在默认安全组中打开 ICMP 和 SSH 端口,以便我们能够连接到它们
. ~/keystonerc_demo
neutron security-group-rule-create --direction ingress \
--ethertype IPv4 --protocol tcp --port-range-min 22 \
--port-range-max 22 default
neutron security-group-rule-create --direction ingress \
--ethertype IPv4 --protocol icmp default
nova boot --flavor m1.tiny --image cirros --nic\
net-id=$(neutron net-show private1-demo -c id -f value) demo01-private1
nova floating-ip-create external1
nova floating-ip-associate demo01-private1 $(neutron floatingip-list -c floating_ip_address -f value)
nova list #the floating IP should be pingable and you should be able to ssh to this instance through it.
您刚刚做了什么? 您在私有租户网络上创建了外部网络和一个实例,具有以下特性
出站访问:此实例可以通过其路由器 (router1-demo) 访问 external1 网络。其源地址将被“SNATed”到其浮动 IP 地址。该“SNATing”发生在路由器命名空间中。但是,如果此实例没有浮动 IP,它仍然具有 external1 网络访问权限。在这种情况下,路由器会将源地址 SNAT 为其自身的公共 IP 地址。
入站访问:此实例通过其浮动 IP 地址为外界所知,router1-demo 将响应其 ARP 请求。该 IP 地址是 DNAT'ed 到路由器命名空间中的本地 IP 地址。
注意:要查看这些 NATing 规则,请从路由器命名空间转储它们
. ~/keystonerc_demo
ip netns exec qrouter-$(neutron router-show router1-demo -c id -f value) iptables -S -t nat
租户网络访问:此实例与 private1-demo 网络上的任何其他实例位于同一广播域中。由于 vxlan 覆盖网络抽象了底层物理网络,因此该广播域扩展到托管这些实例的计算节点。
从 Horizon 控制台查看网络拓扑
. ~/keystonerc_admin
echo $OS_AUTH_URL
echo $OS_USERNAME
echo $OS_PASSWORD
将您的浏览器指向上面的 URL。使用 ~/keystonerc_admin 中的 OS_USERNAME 和 OS_PASSWORD 登录。从“项目”选项卡中选择“demo”项目(您需要先将管理员添加为 demo 项目的成员)。现在选择“网络/网络拓扑”。在这里您将看到我们创建的网络;务必尝试两种视图 - 拓扑和图形。在我们尝试理解我们正在做什么时,请将此视图放在您面前。
共享租户网络
可以使用“--shared”属性创建租户网络,该属性允许其他租户将其自己的实例附加到该网络。默认情况下,只有管理员租户可以创建共享租户网络,但其他租户可以通过 RBAC 来实现。请参阅网络的基于角色的访问控制。当两个或多个项目中的实例受益于位于同一广播域中时,这种类型的网络可能很有用,从而绕过使用浮动 IP 地址进行共享的需求。
. ~/keystonerc_admin
nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0 #allow icmp through default security group
nova secgroup-add-rule default tcp 22 22 0.0.0.0/0 #allow ssh through default security group
neutron net-create --shared --router:external=false admin1-shared
neutron subnet-create admin1-shared 10.0.9.0/24 --name admin1-shared-subnet
现在从 admin 项目在共享租户网络上创建一个实例
nova boot --flavor m1.tiny --image cirros --nic\
net-id=$(neutron net-show admin1-shared -c id -f value) admin01-admin1-shared
现在从 demo 项目在共享租户网络上创建一个实例
. ~/keystonerc_demo
nova boot --flavor m1.tiny --image cirros --nic\
net-id=$(neutron net-show admin1-shared -c id -f value) demo02-admin1-shared
您刚刚做了什么? 如果您使用 Horizon 中的实例/控制台选项登录到这些实例中的任何一个,您会注意到它们位于同一子网上,即使它们位于不同的项目中。这种类型的网络对于在项目之间共享实例可能很有用;这样做的唯一其他选择是使用浮动 IP。默认情况下,任何租户都可以看到并加入共享网络 (admin1-shared)。请注意,除非您添加路由器并将网关设置为 external1,否则此网络无法进行外部网络访问。
共享外部网络
在共享的外部网络上,租户可以直接将其实例连接到外部网络并自动分配一个浮动 IP 地址。我们将使用上面已经创建的 external2-shared 网络。
. ~/keystonerc_demo
nova boot --flavor m1.tiny --image cirros --nic net-name=external2-shared demo03-external2-shared
nova console-log demo03-external2-shared
您可能会从控制台日志输出中注意到该实例未能联系元数据服务
checking http://169.254.169.254/2009-04-04/instance-id
failed 1/20: up 3.03. request failed
failed 2/20: up 8.09. request failed
failed 3/20: up 11.09. request failed
etc…
您可能可以 ping 通该实例,但如果您希望 external2-shared 上的实例能够访问元数据服务,则在 /etc/neutron/dhcp_agent.ini 中设置
crudini --set /etc/neutron/dhcp_agent.ini DEFAULT enable_isolated_metadata True
systemctl restart neutron-dhcp-agent
这是必要的,因为您没有通过路由器连接到此网络,而通常元数据服务访问来自路由器。现在重新启动实例并再次检查控制台日志
nova reboot demo03-external2-shared
nova console-log dem03-external2-shared
现在您应该在日志中看到这个
checking http://169.254.169.254/2009-04-04/instance-id
successful after 1/20 tries: up 2.04. iid=i-000000ef
我们刚刚做了什么? 通过在此共享的外部网络上创建一个实例,您绕过了使用路由器进行外部访问的需求。此外,您默认获得相当于浮动 IP 的地址。最后,广播域是外部子网。因此,无论租户如何,此子网上的任何实例都在同一广播域中,这与我们之前看到的共享租户网络的特性相同。如果租户仅通过其私有网络上的浮动 IP 访问实例,那么他们可能更适合使用共享的外部网络。
为正确的工作使用正确的网络属性
通过了解这四种类型的网络的特性,您将很好地开始利用 Neutron 的灵活性。例如,浮动 IP 可能会成为稀缺的 IPv4 资源。作为一种变通方法,您可以依靠 NAT,或使用共享私有网络来避免一些麻烦。通过了解您的用例,您将能够为您自己和/或您的客户选择正确的网络类型。
本文最初发布在 Red Hat 博客 上,作为 Red Hat 技术客户经理 (TAM) 系列文章的一部分。
评论已关闭。