在OpenStack中,通过使用命名空间(namespace),可以实现对不同项目(也称为租户)的网络进行隔离。每个项目的管理员都需要对其项目的网络进行规划和建设。然而,由于管理员习惯使用的网络地址范围可能会重叠,例如192.168.X.X,因此不同项目之间可能会出现对同一网段的重复使用
如果出现这种情况,那是如何实现 的呢,例如v1 he v2 再不同的VXLAN网络xnet1 和 vnet2,他们的网络接口没有直接分配ip地址,但是可以通过router实现三层通讯,没有gateway ip 此时route 是如何完成路由的?
答案就是重叠使用网络
即使没有为虚拟机分配IP地址,路由器仍然可以完成路由功能。这是因为路由器可以根据数据包的目标MAC地址和VLAN标记来进行转发,而不一定需要知道目标IP地址。因此,即使虚拟机没有分配IP地址,路由器也可以根据MAC地址来进行路由转发。
在OpenStack中,路由器可以通过将不同VXLAN网络的信息封装在命名空间(namespace)中来实现跨网络通信。这样做的目的是为了确保不同项目(或租户)之间的网络可以重叠使用,而不会发生冲突。通过使用命名空间,每个项目都可以在相同的IP地址范围内使用自己的网络,而不会相互干扰。
因此,虽然在理论上可以直接通过路由器进行不同VXLAN网络之间的通信,但使用命名空间可以更好地管理不同项目之间的网络,确保安全性和隔离性
[root@localhost ~(keystone_admin)]# nova list+--------------------------------------+------------+---------+------------+-------------+--------------------------+| ID | Name | Status | Task State | Power State | Networks |+--------------------------------------+------------+---------+------------+-------------+--------------------------+| 791556ab-6231-4370-8a81-972862da200f | cirros-v1 | SHUTOFF | - | Shutdown | vxlan1_vnet=172.16.10.11 || 6173f9bf-bbed-4d71-96d3-f7ae660dc21c | cirros-v2 | SHUTOFF | - | Shutdown | vxlan1_vnet=172.16.10.9 || ea42b670-c084-4e76-ae84-23d6617eb420 | cirros-v3 | SHUTOFF | - | Shutdown | vxlan2_vnet=172.16.11.4 |+--------------------------------------+------------+---------+------------+-------------+--------------------------+
查看网络设备
[]<target dev='tap2c798bf4-8e'/>[]<target dev='tap00515be6-9e'/>
查看tap设备的网卡信息
~(keystone_admin)]# ifconfig tap2c798bf4-8e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450inet6 fe80::fc16:3eff:feee:1305 prefixlen 64 scopeid 0x20<link>ether fe:16:3e:ee:13:05 txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 1 bytes 90 (90.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0~(keystone_admin)]# ifconfig tap00515be6-9e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450inet6 fe80::fc16:3eff:febf:c0eb prefixlen 64 scopeid 0x20<link>ether fe:16:3e:bf:c0:eb txqueuelen 1000 (Ethernet)RX packets 14 bytes 1368 (1.3 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 10 bytes 1382 (1.3 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
L3代理(L3 agent)通常会为每个路由器(router)创建一个命名空间(namespace)。在这个命名空间中,L3代理会同步路由器下的接口信息,并使用veth pair(虚拟以太网对)与TAP(虚拟网桥接口)相连,这样就能提供路由了。
具体步骤如下:
Namespace创建:当创建一个路由器时,L3代理会为该路由器创建一个命名空间,用于隔离路由器的网络环境。
接口信息同步:L3代理会将路由器下的接口信息同步到命名空间中。
Veth pair连接:L3代理会创建一个veth pair,其中一个端口连接到命名空间内部,另一个端口连接到宿主机的网络栈。
Gateway IP配置:L3代理会将路由器的网关IP配置在命名空间内的veth接口上。
查看路由(namespace)列表
[root@localhost ~(keystone_admin)]# neutron router-listneutron CLI is deprecated and will be removed in the future. Use openstack CLI instead.+--------------------------------------+--------------+----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+-------+| id | name | tenant_id | external_gateway_info | distributed | ha |+--------------------------------------+--------------+----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+-------+| 30bba1f4-96bb-459c-9760-dba01bde3a01 | router_10_11 | 26f0265d7ca347239ea13ed32279ff7a | {"network_id": "463adb80-e2f3-4a18-9629-cf966fc0b360", "enable_snat": true, "external_fixed_ips": [{"subnet_id": "00897e13-a522-4b8a-943e-7943b652af5a", "ip_address": "172.24.4.4"}]} | False | False || 341a7e57-463d-411b-af0a-8cddc56777d1 | router1 | e035103daab74f818fcb4a8a7dbcfda6 | {"network_id": "463adb80-e2f3-4a18-9629-cf966fc0b360", "enable_snat": true, "external_fixed_ips": [{"subnet_id": "00897e13-a522-4b8a-943e-7943b652af5a", "ip_address": "172.24.4.2"}]} | False | False |+--------------------------------------+--------------+----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+--------------+----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------
查看具体路由(namespace)的接口信息
[root@localhost ~(keystone_admin)]qrouter-30bba1f4-96bb-459c-9760-dba01bde3a01 (id: 5)qdhcp-53c25734-40ea-421e-8744-31d3e14819d0 (id: 4)qdhcp-e64a94b3-3256-4a3d-9833-cc3c9f421e70 (id: 3)qdhcp-d6c09c69-8bb0-476d-9c71-457251af87b9 (id: 1)qdhcp-fcf7d046-0937-43af-8b94-32cc1edb24e1 (id: 2)qrouter-341a7e57-463d-411b-af0a-8cddc56777d1 (id: 0)
id为5的路由(namespace)就是router_10_11的具体id,通过ip netns exec ID 可查看详细信息。
查看路由(namespaceID:qrouter-30bba1f4-96bb-459c-9760-dba01bde3a01)详细信息
~(keystone_admin)]# ip netns exec qrouter-30bba1f4-96bb-459c-9760-dba01bde3a01 ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 100000:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever33: qg-f86168a4-fc: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000fa:16:3e:b9:54:91 brd ff:ff:ff:ff:ff:ffinet 172.24.4.4/24 brd 172.24.4.255 scope global qg-f86168a4-fcvalid_lft forever preferred_lft foreverinet6 fe80::f816:3eff:feb9:5491/64 scope linkvalid_lft forever preferred_lft forever34: qr-03ede9be-8d: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000fa:16:3e:5f:04:7f brd ff:ff:ff:ff:ff:ffinet 172.16.10.1/24 brd 172.16.10.255 scope global qr-03ede9be-8dvalid_lft forever preferred_lft foreverinet6 fe80::f816:3eff:fe5f:47f/64 scope linkvalid_lft forever preferred_lft forever35: qr-3b2b1f99-dc: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000fa:16:3e:9a:3f:f7 brd ff:ff:ff:ff:ff:ffinet 172.16.11.1/24 brd 172.16.11.255 scope global qr-3b2b1f99-dcvalid_lft forever preferred_lft foreverinet6 fe80::f816:3eff:fe9a:3ff7/64 scope linkvalid_lft forever preferred_lft forever
从上面可以看到,OpenStack在默认情况下,创建一个网络时,如果您没有指定网关,系统会将该网络的第一个可用IP地址作为网关地址。对于路由器来说,它可以连接到多个网络,并在每个网络上有一个接口。
路由器有三个接口,分别对应着外部网关(33号接口)以及两个VXLAN网络(34号和35号接口)。假设您创建了一个网络,比如172.16.10.0/24(vxlan10),如果您没有为这个网络指定网关,OpenStack会自动将该网络的第一个可用IP地址,也就是172.16.10.1,作为默认网关地址。
这样配置的目的是为了方便网络通信的设置和管理。默认情况下,路由器的接口会自动关联到相应的网络,并且系统会自动为每个网络配置默认的网关地址,以便网络通信的顺利进行
1. qr-03ede9be-8d 上设置了 Gateway IP 172.16.10.1,与 root namespace 中的 tap03ede9be-8d 组成 veth pair。2. qr-3b2b1f99-dc 上设置了 Gateway IP 172.16.11.1,与 root namespace 中的 tap3b2b1f99-dc 组成 veth pair。这里将路由信息封装在namespace中,在外部理解可以直接把namespace当做是路由,并不需要管理员去管什么是namespace,项目管理员只需要配置好vxlan网络和路由就可以实现三层通信,但在openstack的管理员视角,却巧妙地解决了网络重么是namespace,项目管理员只需要配置好vxla
拓扑图如下
不使用namespace

使用namespace


添加博主
微信号|yfq940-
原文作者:步步运维步步坑;如有侵权,请联系管理员删除。