4 种您必须了解的 OpenStack Neutron 网络类型

4 种您必须了解的 Neutron 网络类型
439 位读者喜欢这篇文章。
What's new in OpenStack in 2016: A look at the Newton release

Opensource.com

如果您的 OpenStack 托管虚拟实例需要网络连接,您将需要创建一个网络。网络有多种类型,为了做出正确的选择,您至少需要了解两个非常重要的网络属性:“router:external”和“shared”。除非您了解这些属性及其组合的含义,否则很难做出最佳的网络选择。

在本文中,我们将解释这些属性决定的四种网络类型,以及如何配置它们,并简要解释一些典型的用例。其中一些练习适用于租户,另一些则仅适用于管理员。给出的示例可在 KVM 托管的 Red HatRDO 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”。

逻辑网络拓扑

pasted_image_0.png

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) 系列文章的一部分。

标签
User profile image.
Chris Fields 是 Red Hat 北美地区的云成功架构师。他拥有在一家大型零售商担任职务期间操作 OpenStack 的经验,现在帮助客户采用并掌握 Red Hat OpenStack Platform。Chris 还一直在帮助改进 OpenStack 网络合作伙伴的认证流程。

评论已关闭。

© . All rights reserved.