如果您托管的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”。 |
多实例实例方便理解不需要单独角色的新概念。 故障排除和配置已大大简化,这就是我们将在示例中使用的内容。 如果您有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主机将具有三个网络:
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
external1
EOF
cat > /tmp/external2.xml << EOF
external2
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=
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
$ 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
我们需要对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
完成这些配置步骤后,您将需要重新引导虚拟主机。 重新启动后,创建的网桥应如下所示:
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]*"
在创建虚拟实例之前,让我们在默认安全组中打开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覆盖网络抽象了基础物理网络,所以此广播域跨托管这些实例的计算节点扩展。
. ~/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
你刚才做了什么? 如果使用Horizon中的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