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

2023-05-16

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

在本文中,我们将解释这些属性指示的四种网络类型以及如何配置它们,并简要解释一些典型的用例。 其中一些练习适用于租户,而其他练习仅适用于管理员。 给出了在KVM托管的Red Hat或RDO多合一 OpenStack实例上完成该练习的示例。 这已经在Red Hat OpenStack Platform 8、9、10以及RDO Mitaka和Newton上进行了测试。

四种类型的解释

下表概述了我们要创建的网络类型及其名称。

router-external 共享 网络类型 在这个练习中的名字 描述
false vxlan private1-demo 典型的租户网络,仅可由租户成员使用。 通常为叠加层(vxlan,gre)。
false 真正 vxlan admin1共用 可以由多个租户与RBAC共享使用权。 通常为叠加层(vxlan,gre)。
true 平面 外部1 典型的外部网络,范围是所有租户。 只能由管理员创建。 租户连接其路由器以进行外部访问。 通常为“扁平”或“ VLAN”网络。
true 真正 平面 外部2共享 范围是所有租户。 只能由管理员创建。 租户可以直接连接到它。 通常称为“提供者”网络,为“扁平”或“ VLAN”。

逻辑网络拓扑

OpenStack多合一构建

多实例实例方便理解不需要单独角色的新概念。 故障排除和配置已大大简化,这就是我们将在示例中使用的内容。 如果您有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安装创建的“公共”和“私有”网络(及其子网)以及“ router1”。

KVM主机配置

此练习的KVM主机将具有三个网络:

Linux bridge name KVM网络名称, VM nic 目的
virbr0 默认值eth0 直接访问OpenStack虚拟主机。
virbr1 外部1,eth1 通过SNAT或浮动IP对实例进行外部访问。
virbr2 外部2,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

现在,将VNIC添加到每个外部网络的OpenStack多合一实例中。 从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多合一配置

我们需要对packstack交付的Neutron配置进行一些更改,以删除单个Linux网桥“ br-ex”,并重新添加新的网桥br-ex和br-ex2以及将连接到其上的扁平网络:



   
   
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

请注意,使用“扁平”网络时,您要如何称呼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

中子网络,子网和路由器

最后,我们准备好开始业务并创建我们一直在谈论的网络。 以下一系列命令将创建网络,子网,路由器,安全组规则,实例和浮动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网络。 其源地址将为其浮动IP地址的源地址“ SNAT ed”。 “ SNATing”发生在路由器名称空间中。 但是,如果该实例没有浮动IP,则它仍将具有external1网络访问权限。 在这种情况下,路由器会将源地址SNAT为其自己的公用IP地址。

入站访问:此实例通过其浮动IP地址为外界所知,router1-demo将响应该实例的ARP请求。 该IP是路由器名称空间中的本地IP地址的DNAT 。

注意:要查看这些NATing规则将其从路由器名称空间中转储出来:



   
   
. ~/keystonerc_demo
ip netns exec qrouter-$(neutron router-show router1-demo -c id -f value) iptables -S -t nat

租户网络访问:此实例与private1-demo网络上的任何其他实例在同一广播域中。 因为vxlan覆盖网络抽象了基础物理网络,所以此广播域跨托管这些实例的计算节点扩展。

从Horizo​​n控制台查看网络拓扑



   
   
. ~/keystonerc_admin
echo $OS_AUTH_URL
echo $OS_USERNAME
echo $OS_PASSWORD

将浏览器指向上面的URL。 从〜/ keystonerc_admin使用OS_USERNAME和OS_PASSWORD登录。 从“项目”选项卡中选择“演示”项目(您需要首先将admin添加为演示项目的成员)。 现在选择“网络/网络拓扑”。 在这里,您将看到我们创建的网络; 请务必尝试两个视图-拓扑和图形。 当我们试图了解我们在做什么时,请将此视图摆在您面前。

共享租户网络

可以使用“ --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

现在,通过演示项目在共享租户网络上创建一个实例:



   
   
. ~/keystonerc_demo
nova boot --flavor m1.tiny --image cirros --nic\
 net-id=$(neutron net-show admin1-shared -c id -f value) demo02-admin1-shared

你刚才做了什么? 如果使用Horizo​​n中的instance / console选项登录到这些实例中的任何一个,则即使它们位于不同的项目中,也会注意到它们位于同一子网中。 这种类型的网络对于在项目之间共享实例很有用。 这样做的唯一其他选择是使用浮动IP。 默认情况下,任何租户都可以查看并加入共享网络(admin1共享)。 请注意,除非您添加路由器并将网关设置为external1,否则无法从该网络访问外部网络。

共享的外部网络

在共享的外部网络上,租户可以将其实例直接连接到外部网络,并获得自动分配的浮动IP地址。 我们将使用上面已经创建的external2共享网络。



   
   
. ~/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共享上的实例可以访问元数据服务,则可以在/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)系列文章的一部分。

翻译自: https://opensource.com/article/17/4/openstack-neutron-networks

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您必须了解的4种OpenStack Neutron网络类型 的相关文章

随机推荐