neutron
-
-
- 网络驱动
-
- [Linux Bridge](#Linux Bridge)
- [OVS(Open vSwitch)](#OVS(Open vSwitch))
- 配置OVS为openstack网络驱动
- [OVN(Open Virtual Network)](#OVN(Open Virtual Network))
- 配置OVN为openstack网络驱动
- 物理网络
- 租户网络
- 实例测试
- 网络走向(访问外网)
- 网络走向(实例通信)
-
OpenStack 网络服务 (neutron) 提供了一个 API,允许用户在云中设置和定义网络连接和寻址。网络服务的项目代号是 neutron。OpenStack 网络负责创建和管理虚拟网络基础设施,包括由 OpenStack Compute 服务 (nova) 管理的设备的网络、交换机、子网和路由器。还可以使用防火墙或虚拟专用网络 (VPN) 等高级服务
Neutron 的架构由多个核心组件组成,各司其职,协同工作:
(1)Neutron Server
- 提供 RESTful API,供用户和管理员进行网络相关的操作,例如创建网络、子网、路由等。
- 将用户请求转发给后端的插件或服务进行具体实现。
(2)插件(Plugins)
Neutron 的灵活性依赖于插件机制,可以根据不同的底层网络技术选择不同的插件。
- 核心插件(Core Plugin):负责实现虚拟网络和子网的创建和管理。
- 服务插件(Service Plugin):支持额外的网络服务,如负载均衡(LBaaS)、防火墙(FWaaS)、虚拟专用网络(VPNaaS)等。
(3)代理(Agents)
Neutron 的代理运行在每个计算节点和网络节点上,用于实现具体的网络功能:
- DHCP Agent:管理 DHCP 服务,为虚拟机分配 IP 地址。
- L3 Agent:处理路由和 NAT 服务,实现外部网络连接。
- Open vSwitch(OVS)Agent 或 Linux Bridge Agent:负责虚拟交换机的配置和流量转发。
- Metadata Agent:为虚拟机提供元数据服务。
在 OpenStack Neutron 中,有提供商网络(Provider Network) 和 自助服务网络(Self-Service Network)两种不同的网络配置模式,分别适用于不同的使用场景和需求。它们的主要区别在于网络连接方式和实现的功能。
提供商网络(Provider Network):提供商网络直接映射到物理网络,通常由云管理员预先配置。用户(租户)可以将虚拟机连接到提供商网络,直接访问外部网络。
特点
- 简单高效:流量直接从虚拟机发送到物理网络,无需中间路由。
不支持 NAT:虚拟机需要使用物理网络中的 IP 地址。
租户隔离有限:租户网络间可能共享相同的物理网络。
典型场景
- 用于小型或简单部署,网络隔离需求较低。
适合服务提供商或公共云场景,提供直接的外网连接。
网络走向
- [虚拟机] -> [提供商网络] -> [物理网络] -> [外部网络/互联网]
自助服务网络(Self-Service Network):自助服务网络是租户可以自由创建和管理的虚拟网络,提供高级网络功能,如路由、NAT 和多租户隔离。
特点
- 完全隔离:每个租户的网络相互独立。
支持 NAT:租户网络可以通过路由器访问外部网络。
灵活性高:租户可以创建自己的网络、子网和路由器。
典型场景
- 用于复杂的多租户部署,网络隔离需求较高。
适合企业私有云或混合云场景,需要提供高级网络服务。
网络走向
- [虚拟机] -> [租户网络] -> [路由器/NAT] -> [外部网络/互联网]
两者的核心区别在于,自助服务网络可以完全虚拟化,自定义所有的网络信息提供给实例使用,而提供商网络则需要受限于所映射到的物理网络
网络驱动
在 OpenStack Neutron 中,网络驱动(Network Driver) 是指负责与底层网络基础设施交互的插件或模块。这些驱动抽象了底层网络设备的差异,为 Neutron 提供统一的网络管理接口,允许使用多种网络技术(如 VLAN、VXLAN、GRE)和第三方网络设备,如LInux Bridge,Open vSwitch以及OVN等,本文着重使用OVS和OVN为网络驱动
Linux Bridge
Linux Bridge是Linux内核自带的一种虚拟网络桥接技术,用于将多个网络设备(如网卡和虚拟网卡)连接在一起,形成一个逻辑上的二层网络交换机。在openstack中Linux 桥接机制驱动程序仅使用 Linux 桥接器和veth对作为互连设备。第 2 层代理管理每个计算节点和任何其他提供第 3 层(路由)、DHCP、元数据或其他网络服务的节点上的 Linux 桥接器
-
优点
简单易用:配置和管理相对简单,适合小规模部署。
稳定性高:作为Linux内核的一部分,稳定性和兼容性有保障。
开销低:对系统资源消耗较小。
-
缺点
功能有限:不支持复杂的网络功能。
扩展性差:不适合大规模数据中心的需求。
工作原理
Linux Bridge通过创建虚拟网桥(Bridge)将多个网络设备连接在一起。数据包在进入网桥后,根据MAC地址表进行转发。如果目的MAC地址在表中,则直接转发;如果不在,则进行广播。Linux Bridge主要工作在二层(数据链路层),不涉及三层(网络层)的路由功能。
OVS(Open vSwitch)
OVS是一种高性能的多层虚拟交换机,用于在虚拟环境中提供网络连接。它支持标准的管理接口和协议,如NetFlow、sFlow、IPFIX、RSTP和LACP,适用于各种网络虚拟化方案。
-
优点
高性能:OVS优化了虚拟网络环境中的数据包处理流程,性能优异。
可扩展性:支持大规模的网络拓扑,适合大规模数据中心。
功能丰富:支持多种网络协议和高级网络功能,如QoS(服务质量)、ACL(访问控制列表)等。
广泛应用:被许多虚拟化平台和云环境广泛采用。
-
缺点
复杂性高:配置和管理相对复杂,需要一定的学习成本。
调试难度大:由于功能强大,问题排查和调试较为复杂。
工作原理
OVS使用流表(Flow Table)来管理网络数据包的转发。数据包进入OVS后,首先匹配流表项,如果匹配成功,则按照流表项的指示进行处理;如果没有匹配到,则会发送到控制平面进行进一步处理。OVS还支持分布式网络控制,可以通过控制器(如OpenDaylight)集中管理网络策略。
配置OVS为openstack网络驱动
安装相关软件包
bash
apt install -y neutron-server neutron-plugin-ml2 neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent neutron-openvswitch-agent
部分配置示例如下:详细配置参考博文
bridge_mappings将物理网络的接口(Physical_NAME)和OVS网桥(OVS_NAME)进行映射
bash
cat > /etc/neutron/plugins/ml2/openvswitch_agent.ini << eof
[DEFAULT]
[agent]
l2_population = True
tunnel_types = vxlan
prevent_arp_spoofing = True
[dhcp]
[network_log]
[ovs]
local_ip = $HOST_IP
bridge_mappings = $Physical_NAME:$OVS_NAME
[securitygroup]
eof
在L3和dhcp代理中指定接口驱动为OVS
bash
cat > /etc/neutron/l3_agent.ini << eof
[DEFAULT]
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
external_network_bridge =
[agent]
[network_log]
[ovs]
eof
bash
cat > /etc/neutron/dhcp_agent.ini << eof
[DEFAULT]
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True
[agent]
[ovs]
eof
启动所有neutron组件
bash
# 提供neutron服务
service neutron-server restart
# 提供ovs服务
service neutron-openvswitch-agent restart
# 提供地址动态服务
service neutron-dhcp-agent restart
# 提供元数据服务
service neutron-metadata-agent restart
# 提供三层网络服务
service neutron-l3-agent restart
查看所有网络代理
bash
root@controller:~# openstack network agent list
+---------------------+--------------------+------------+-------------------+-------+-------+-----------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+---------------------+--------------------+------------+-------------------+-------+-------+-----------------------+
| 6634d908-9f70-4d5a- | Metadata agent | controller | None | :-) | UP | neutron-metadata- |
| aeaa-2db98b55a510 | | | | | | agent |
| 7e77e98a-4ba0-40a4- | Open vSwitch agent | controller | None | :-) | UP | neutron-openvswitch- |
| 8f7c-8f7c8b833666 | | | | | | agent |
| caa6995a-cc15-4c2f- | L3 agent | controller | nova | :-) | UP | neutron-l3-agent |
| 85ab-e64e05d0771e | | | | | | |
| f69c784e-b1ba-47e6- | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent |
| a203-379e5744153a | | | | | | |
+---------------------+--------------------+------------+-------------------+-------+-------+-----------------------+
OVN(Open Virtual Network)
OVN是由OVS社区开发的一个网络虚拟化项目,旨在为虚拟网络提供高级网络功能和集中化管理。它建立在OVS之上,提供了额外的控制平面来管理和配置虚拟网络。
-
优点
高级功能:支持VXLAN、分布式路由、防火墙等高级网络功能。
集中化管理:通过控制平面集中管理网络策略,简化大规模部署。
动态扩展:适应动态变化的云环境,支持自动化网络配置。
-
缺点
依赖性强:依赖于OVS,要求较高的系统资源和配置。
学习曲线陡峭:需要掌握OVS和OVN的配置和管理,学习成本较高。
工作原理
OVN通过中央控制器和多个本地节点来实现网络虚拟化。中央控制器负责管理全局网络策略和配置,本地节点负责具体的数据包转发和处理。OVN使用OVS作为数据平面,通过OVN Southbound和Northbound数据库与控制器通信,实现网络配置的同步和下发
配置OVN为openstack网络驱动
配置配置信息如下:详细文档可参考博文
bash
apt install -y neutron-server neutron-plugin-ml2 python3-neutronclient ovn-central openvswitch-switch
配置网络服务器组件。网络服务将 OVN 实现为 ML2 驱动程序,并且需要配置Geneve网络, Geneve ID 范围和最大报头大小(1:65536)。
bash
cat > /etc/neutron/plugins/ml2/ml2_conf.ini << eof
[DEFAULT]
[ml2]
type_drivers = flat,vlan,vxlan,gre,geneve
tenant_network_types = geneve
mechanism_drivers = ovn
extension_drivers = port_security
overlay_ip_version = 4
[ml2_type_flat]
flat_networks = $Physical_NAME
[ml2_type_geneve]
vni_ranges = $MinGeneveID:$MaxGeneveID
max_header_size = 38
[ml2_type_gre]
[ml2_type_vlan]
[ml2_type_vxlan]
[ovs_driver]
[securitygroup]
enable_ipset = true
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
[sriov_driver]
[ovn]
ovn_nb_connection = tcp:$HOST_IP:6641
ovn_sb_connection = tcp:$HOST_IP:6642
ovn_l3_scheduler = leastloaded
ovn_metadata_enabled = True
eof
重启网络服务
bash
systemctl restart openvswitch-switch
systemctl restart ovn-central ovn-northd
查看代理如下:openstack的所有网络代理服务都由OVN进行统一管理
bash
root@controller:~# openstack network agent list
+---------------------+---------------------+------------+-------------------+-------+-------+-----------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+---------------------+---------------------+------------+-------------------+-------+-------+-----------------------+
| d1acca20-0865-4ec8- | OVN Controller | controller | | :-) | UP | ovn-controller |
| 8160-139b2229683d | agent | | | | | |
| 0317c15d-8da7-562e- | OVN Metadata agent | controller | | :-) | UP | neutron-ovn-metadata- |
| b9f6-b82b2184ab9b | | | | | | agent |
+---------------------+---------------------+------------+-------------------+-------+-------+-----------------------+
物理网络
物理网络(Provider Network): 这些网络通常由管理员创建,用于提供外部网络连接。常用的网络类型包括 flat 和 vlan(需要配合物理交换机处于同一vlan即可通信外网)。也可以理解为提供商网络
flat
Flat 网络是一种简单的网络配置类型,在这种配置中,所有虚拟机实例共享一个物理网络,不进行任何网络隔离或 VLAN 标记。所有的流量都在同一个二层广播域内传输。
-
优点
简单易用:配置和管理简单,不需要复杂的网络配置。
兼容性好:与现有的物理网络基础设施兼容性较好。
低开销:没有额外的网络标记和隔离开销。
-
缺点
缺乏隔离:所有虚拟机实例共享同一个广播域,缺乏网络隔离,安全性较低。
可扩展性差:由于没有网络隔离,广播域较大,网络性能和可扩展性受到限制。
冲突风险:多个租户共享同一个网络,IP 地址冲突风险增加。
工作原理
在 Flat 网络中,Neutron 不会对流量进行任何标记或隔离。所有虚拟机实例直接连接到物理网络,使用同一个网络范围内的 IP 地址。这种配置适用于小规模和对网络隔离要求不高的环境。
vlan
VLAN(Virtual Local Area Network)网络通过在物理网络上划分多个逻辑网络,实现网络隔离和分段。每个 VLAN 使用一个唯一的 VLAN ID 来标识,确保不同 VLAN 之间的流量隔离。
-
优点
网络隔离:通过 VLAN ID 实现网络隔离,提高安全性。
可扩展性好:支持多达 4096 个 VLAN ID,适合大规模部署。
性能较好:物理网络设备通常对 VLAN 有硬件加速支持,性能较好。
-
缺点
配置复杂:需要在物理交换机和 OpenStack 中进行 VLAN 配置,增加了管理复杂性。
依赖物理网络设备:需要物理交换机支持 VLAN,并进行相应配置。
资源消耗:每个 VLAN 需要独立的广播域,可能增加广播流量。
工作原理
在 VLAN 网络中,Neutron 使用 VLAN ID 对流量进行标记,不同 VLAN 的流量在物理网络上通过 VLAN 标签进行隔离。物理交换机配置为允许这些 VLAN ID 的流量通过,并根据 VLAN ID 进行转发和隔离。
租户网络
租户网络(Tenant Network): 这些网络通常由用户创建,用于隔离不同租户的流量。常用的隧道类型包括 vxlan, gre, 和 geneve。也可以理解为自助服务网络
VXLAN
是一种网络虚拟化技术,用于在大规模云计算环境中构建虚拟私有网络(VPN)和覆盖网络(Overlay Network)。VXLAN 的主要目的是扩展 VLAN 的数量限制和跨物理网络的 VLAN 通信限制,以实现更大规模的虚拟化和网络隔离。以下是关于 VXLAN 的主要特点、工作原理和应用场景的介绍:
主要特点
- 扩展性:VXLAN 可以扩展到数百万个虚拟网络标识(VNI),远远超过传统 VLAN 的数量限制。
- 隔离性:VXLAN 提供逻辑隔离,允许在同一物理网络上创建多个虚拟网络,实现不同用户或应用之间的隔离。
- 跨网络通信:VXLAN 可以在不同物理网络之间建立虚拟隧道,实现跨网络的 VLAN 通信,扩展了 VLAN 的范围。
- 软件定义网络(SDN)支持:VXLAN 与 SDN 技术结合使用,可以通过 SDN 控制器进行动态网络管理和流量控制。
工作原理
- VXLAN 标识符(VNI):每个 VXLAN 网络有一个唯一的 VNI 作为标识符,用于区分不同的虚拟网络。
- VTEP(VXLAN Tunnel Endpoint):VTEP 是 VXLAN 的边界设备,负责在物理网络和虚拟网络之间转发 VXLAN 数据包。
- UDP 封装:VXLAN 使用 UDP 封装数据包,将虚拟网络的数据包打包成 UDP 包,在物理网络上传输。
- VXLAN Header:在 UDP 包中添加 VXLAN 头部,包含 VNI 和其他控制信息,用于标识和识别虚拟网络。
应用场景
云计算环境:VXLAN 在大规模云计算环境中广泛应用,用于构建多租户虚拟网络和覆盖网络,提供网络隔离和灵活性。
数据中心网络:VXLAN 可以帮助构建高度可扩展和灵活的数据中心网络,支持动态迁移和负载均衡。
软件定义网络(SDN):VXLAN 结合 SDN 技术,可以实现网络的编程化管理和自动化配置。
跨数据中心连接:通过 VXLAN 虚拟隧道,可以实现跨数据中心的 VLAN 通信和连接。
总体而言,VXLAN 是一种高度灵活、可扩展的网络虚拟化技术,适用于大规模云计算环境和软件定义网络场景,为构建安全、高效的虚拟网络提供了重要的技术支持。
GRE
GRE 是一种隧道协议,用于在不同的网络之间传输数据包。它通过封装二层数据包,并在三层网络上传输,不进行加密。
-
优点
简单易用:配置和管理相对简单,适用于跨多个网络的隧道传输。
广泛支持:被许多网络设备和操作系统支持,适用性广泛。
-
缺点
性能开销:封装和解封装数据包会增加处理开销,影响性能。
安全性低:GRE 本身不提供加密,数据包在传输过程中可能被拦截。
工作原理
GRE 隧道通过在原始数据包外部增加一个 GRE 头部,并在三层网络上传输。数据包到达目的地后,GRE 头部被移除,恢复原始数据包并进行处理。GRE 隧道端点负责封装和解封装数据包。
Geneve
Geneve 是一种新兴的网络虚拟化封装协议,设计目的是结合 VXLAN 和 GRE 的优点,并提供更大的灵活性和扩展性。它支持可扩展的头部字段,适应未来的发展需求。
-
优点
高灵活性:支持可扩展的头部字段,可以根据需求增加新的功能。
兼容性好:设计时考虑了与现有网络虚拟化协议的兼容性。
未来适应性:能够适应未来网络虚拟化技术的发展需求。
-
缺点
实现复杂:由于其灵活性和扩展性,实现和配置相对复杂。
支持有限:作为新兴技术,尚未得到广泛支持。
工作原理
Geneve 通过封装二层数据包,并在三层网络上传输。Geneve 头部包含了基本的封装信息和可选的扩展字段,允许更灵活的功能扩展。Geneve 隧道端点负责封装和解封装数据包。
三者比较:
配置所有网络示例
实验环境:Ubuntu2404-ovs网络-openstackC版为例
powershell
vim /etc/neutron/plugins/ml2/ml2_conf.ini
开启所有网络类型的支持
powershell
[DEFAULT]
[ml2]
type_drivers = flat,vlan,vxlan,gre,geneve #所有网络支持的类型
tenant_network_types = gre #租户网络类型,注意下面对应的类型参数要开启,下面配置全开。可配置多个类型
mechanism_drivers = openvswitch,l2population
extension_drivers = port_security
[ml2_type_flat]
flat_networks = provider #provider为用于和物理网络进行映射的标志,可自定义名称
[ml2_type_geneve]
vni_ranges = 1:1000
max_header_size = 38
[ml2_type_gre]
tunnel_id_ranges = 1:1000
[ml2_type_vlan]
network_vlan_ranges = provider:100:200 #vlan网络的网段
[ml2_type_vxlan]
vni_ranges = 1:1000
[ovs_driver]
[securitygroup]
enable_ipset = true
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
[sriov_driver]
powershell
vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
指定具体的租户网络类型
powershell
[DEFAULT]
[agent]
l2_population = True
tunnel_types = vxlan #配置租户网络类型,可配置多个类型
prevent_arp_spoofing = True
[dhcp]
[network_log]
[ovs]
local_ip = 192.168.200.195
bridge_mappings = provider:br-ens34
[securitygroup]
此时在界面的项目(租户)中创建的网络默认为vxlan,段id会随机分配
而在管理员界面则可以创建指定的网络类型,例如Flat物理网络
子网信息要与物理网卡相对应:
- 子网地址为实际映射的物理网卡接口,本实验中对应ens34网卡,net模式
- 网关对应net模式的网关,本文为:192.168.200.2
分配地址池,dns信息等
创建vlan网络
与Flat网络一样的配置方式,但需要注意的是,vlan网络需要用于实际的路由器或者交换机中
创建GRE网络
该网络和vxlan一样,可完全自定义
创建Geneve网络
实例测试
创建一台实例,使用vxlan网络模式,注意租户网络现在只能用vxlan,在配置文件中指定tunnel_types = vxlan,配置实现实例能访问外网以及远程连接
此时创建的实例只能ping自身网关
如果需要上网和本地远程连接,则需要绑定浮动IP(类似于公有云的公网IP)
- 创建路由,接口绑定到Flat网络上
- 此时创建的虚拟路由可以进行ping通,使用Flat网络的分配的地址作为外部网关
- 增加内部接口到虚拟路由中
- 此时实例即可实现上网
- 将实例绑定浮动IP
- 配置安全组策略,放通ssh规则
- 此时实例即可实现远程访问
连接接口
创建的实例可以增加接口,也就是网卡,点击创建快照旁边的下拉框,点击连接接口,可以指定网卡,以及具体的网段
- 还可以分离接口
指定IP创建实例
正常创建实例获取的IP都是随机分配的,本实验通过指定IP地址来创建实例
- 创建端口,并指定IP10.0.0.10
- 创建实例 ,并在网络接口中指定该端口
- 实例创建成功
- 控制台查看实例IP为:10.0.0.10
网络走向(访问外网)
本实验中采用ovs网络驱动,整个网络涉及到的组件如下:
- br-int:OVS集成网桥
- br-en34:OVS外部网桥
- tap设备:Linux本身的虚拟网络接口
- qr-xxx:路由器命名空间中的接口
- qg-xxx:路由器命名空间连接外网的接口
- ens34:宿主机的第二张网卡,使用VMware的net模式,可访问外网
当实例发出访问外网请求后,数据包走向如下:总共可为三个阶段,实例到OVS网桥,OVS网桥到ens34网卡,最终实现上网,拓扑图如下:
【实例内部】 → tap设备 →【 br-int → qr-xxx → 路由器命名空间 → qg-xxx → br-ens34】 → 【物理网卡 ens34】→ 外网
具体过程:
- 数据包从虚拟机内部发出,经过libvirt创建的tap设备(成对出现,用于两个设备之间的通信)
这个时候实例和OVS网桥之间是使用tap设备来进行一个连接的!
- 首先查看实例的网卡eth0,对应的mac地址为fe:16:3e:ae:f9:ae,这个就是tap设备
- 此时查看宿主机的tap设备对应的mac地址也为fe:16:3e:ae:f9:ae,且绑定的网桥为ovs-system
TAP 设备绑定到 ovs-system 是因为它已经被添加到 Open vSwitch 的某个具体网桥中,而 ovs-system 是内核中管理这些网桥的顶层接口。在 Linux 网络体系中,所有与 OVS 相关的网络接口都会在 ovs-system 中标记为"主设备"
bash
root@controller:~# ip link show tap7836cb8a-5b
18: tap7836cb8a-5b: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master ovs-system state UNKNOWN mode DEFAULT group default qlen 1000
link/ether fe:16:3e:ae:f9:ae brd ff:ff:ff:ff:ff:ff
现在所查看到的是实例上的设备和绑定在OVS网桥上的设备,他俩共享一个mac地址,以确保网络流量的透明性和一致性
- 通过OVS网桥的br-int设备
- 查看ovs网桥信息:此时可以查看到在br-int下面有一个接口设备为tap7836cb8a-5b,正是和实例相对应的
bash
root@controller:~# ovs-vsctl show
dd8f26a9-0d62-489e-a1a1-58dc758803fa
---------------------
Bridge br-int
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
datapath_type: system
---------------------
Port tap7836cb8a-5b
tag: 1
Interface tap7836cb8a-5b
Port qg-84fa952b-fe
tag: 2
Interface qg-84fa952b-fe
type: internal
----------------
ovs_version: "3.3.0"
- 网桥完整信息如下:
bash
root@controller:~# ovs-vsctl show
dd8f26a9-0d62-489e-a1a1-58dc758803fa
Manager "ptcp:6640:127.0.0.1"
is_connected: true
Bridge br-tun
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
datapath_type: system
Port br-tun
Interface br-tun
type: internal
Port patch-int
Interface patch-int
type: patch
options: {peer=patch-tun}
Bridge br-int
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
datapath_type: system
Port int-br-ens34
Interface int-br-ens34
type: patch
options: {peer=phy-br-ens34}
Port br-int
Interface br-int
type: internal
Port qr-30c38dbf-71
tag: 1
Interface qr-30c38dbf-71
type: internal
Port tapaa121f58-71
tag: 2
Interface tapaa121f58-71
type: internal
Port patch-tun
Interface patch-tun
type: patch
options: {peer=patch-int}
Port tapac1f73ba-9b
tag: 1
Interface tapac1f73ba-9b
type: internal
Port tap7836cb8a-5b
tag: 1
Interface tap7836cb8a-5b
Port qg-84fa952b-fe
tag: 2
Interface qg-84fa952b-fe
type: internal
Bridge br-ens34
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
datapath_type: system
Port br-ens34
Interface br-ens34
type: internal
Port ens34
Interface ens34
Port phy-br-ens34
Interface phy-br-ens34
type: patch
options: {peer=int-br-ens34}
ovs_version: "3.3.0"
- 进入路由器命名空间的qr接口
- 此时进入到路由器阶段,tap设备的网络是10.0.0.10,它通过路由器上绑定网关10.0.0.2进入到路由器,再由192.168.200.233出去,进行了一个NAT转换
- 该路由器实质上一个独立的网络命名空间。该命名空间中会包含路由器相关的网络接口和路由规则,以实现网络隔离和功能。可以在宿主机上查看
bash
root@controller:~# ip netns list
qdhcp-46e0e1f0-a005-48bc-b897-55b9ae59cea6 (id: 0)
qdhcp-6f1a1754-be1d-4978-9ba9-bc4efd82955f (id: 1)
qrouter-5be3bfc2-a1d7-4158-900a-13c8c20361c6 (id: 3)
root@controller:~# ip netns exec qrouter-5be3bfc2-a1d7-4158-900a-13c8c20361c6 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
14: qg-84fa952b-fe: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether fa:16:3e:21:d0:3a brd ff:ff:ff:ff:ff:ff
inet 192.168.200.233/24 brd 192.168.200.255 scope global qg-84fa952b-fe
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe21:d03a/64 scope link
valid_lft forever preferred_lft forever
15: qr-30c38dbf-71: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether fa:16:3e:50:95:02 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/24 brd 10.0.0.255 scope global qr-30c38dbf-71
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe50:9502/64 scope link
valid_lft forever preferred_lft forever
- 而对应两个接口实质上也是成对的虚拟网络设备,存放在br-int网桥上
bash
Port qr-30c38dbf-71
tag: 1
Interface qr-30c38dbf-71
type: internal
Port qg-84fa952b-fe
tag: 2
Interface qg-84fa952b-fe
type: internal
- qg接口由发往外部网桥br-ens34
- qg接口存在于br-int网桥上,此时就需要br-int网桥将网络数据发送给br-ens34网桥,而ovs网桥之间通过patch接口实现
bash
Bridge br-int
Port int-br-ens34
Interface int-br-ens34
type: patch
options: {peer=phy-br-ens34}
bash
Bridge br-ens34
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
datapath_type: system
Port br-ens34
Interface br-ens34
type: internal
Port ens34
Interface ens34
Port phy-br-ens34
Interface phy-br-ens34
type: patch
options: {peer=int-br-ens34}
- 最终通过物理网卡发往外网
- 宿主机ens34接口信息如下:该网卡绑定在ovs的br-ens34网桥。当网络数据从br-int网桥发到br-ens34网桥后,br-ens34网桥从接口phy-br-ens34发送到宿主机的ens34上,此时就能从ens34访问外部网络
bash
root@controller:~# ip a
--------
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UP group default qlen 1000
link/ether 00:0c:29:64:d5:3f brd ff:ff:ff:ff:ff:ff
altname enp2s2
inet6 fe80::20c:29ff:fe64:d53f/64 scope link
valid_lft forever preferred_lft forever
网络走向(实例通信)
实例之间的通信则相对好理解一些:每个实例上面都有个一个tap设备,然后对应的另一个设备都在ovs网桥br-int,网桥就相当于一个中转站,使得网络可以通信
【实例A】---> 【br-int】---->【实例B】
【实例B】---> 【br-int】---->【实例A】
- 创建两台实例,对应的网卡信息如下
- 查看宿主机tap设备,mac信息可对应
bash
root@controller:~# ip a
----------------------
18: tap7836cb8a-5b: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master ovs-system state UNKNOWN group default qlen 1000
link/ether fe:16:3e:ae:f9:ae brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc16:3eff:feae:f9ae/64 scope link
valid_lft forever preferred_lft forever
19: tap127a75da-32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master ovs-system state UNKNOWN group default qlen 1000
link/ether fe:16:3e:f7:75:f2 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc16:3eff:fef7:75f2/64 scope link
valid_lft forever preferred_lft forever
- 查看ovs网桥br-int信息
bash
root@controller:~# ovs-vsctl show
----------------
Bridge br-int
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
datapath_type: system
Port int-br-ens34
Interface int-br-ens34
type: patch
options: {peer=phy-br-ens34}
----------------------------
Port tap127a75da-32 #对应实例B信息
tag: 1
Interface tap127a75da-32
Port tap7836cb8a-5b
tag: 1
Interface tap7836cb8a-5b #对应实例A信息
Port qg-84fa952b-fe
tag: 2
Interface qg-84fa952b-fe
type: internal
---------------------
总的来说br-int网桥将各个实例给桥接起来,tap设备则是连接网桥的网线,从而达到各个实例相互通信,而访问外网则是将当前网桥与外部网桥br-ens34(该网桥上有连接访问外网的接口)进行连接,不同网桥的连接使用patch接口。最后通过外部网桥的接口访问外网