默认情况下,交换机的所有端口都处于VLAN 1 中,也就相当于没有配置 VLAN。该机制说明如下:
(图4)
PC A 发一个帧到交换机的 1 端口,其目的MAC地址为 PC B 的 MAC。交换机比较其目的 MAC 地址和它的内部 MAC Table,发现它不存在(此时表为空)。在决定泛洪之前,它把端口 1 和 PC A 的 MAC 地址存进它的 MAC Table。交换机将帧拷贝多份,分别从2和3端口发出。PC B 收到该帧以后,发现其目的 MAC 地址和他自己的 MAC 地址相同。它发出一个回复帧进入端口3。交换机将 PC B 的 MAC地址和端口3 存在它的 MAC 表中。因为该帧的目的地址为PC A 的 MAC 地址它已经在 MAC 表中,交换机直接将它转发到端口1,达到PC A。
配置了 VLAN 的交换机的该机制类似,只不过:
(1)MAC 表格中每一行有不同的 VLAN ID。做比较的时候,拿传入帧的目的 MAC 地址和 VLAN ID 和此表中的行数据相比较。如果都相同,则选择其 Ports 作为转发出口端口。
(图5)
(2)如果没有吻合的表项,则将此帧从所有有同样 VLAN ID 的 ports 和 Trunk ports 转发出去。
1.2.2 (ARP)原理
二层网络使用 MAC (media )地址作为硬件的唯一标识。基于 TCP/IP 协议的软件使用 ARP 来将 IP 地址转化为 MAC 地址。
1. 目的 IP 地址在同一网段的话
(图6)
该示例中,Host A 和 B 在同一个网段中。A 的 IP 地址是 10.0.0.99,B 的 IP 地址是 10.0.0.100。当 A 要和 B 通信时,A 需要知道 B 的 MAC 地址。该过程经过以下步骤:
(1)A 上的 IP 协议栈知道通过B 的 IP 地址可以直接到达 B。A 检查它的本地 ARP 缓存来看B 的 MAC 地址是否已经存在。
(2)如果A 没有发现B 的 MAC 地址,它发出一个 ARP 广播请求,来询问“10.0.0.100 的 MAC 地址是什么?”,该数据包:
SRC MAC: A 的 MAC
DST MAC:FF:FF:FF:FF:FF:FF
SRA IP: A 的 IP
DST IP: B 的 IP
(3)该网段中所有的电脑都将收到该包,并且会检查 DST IP 和自己的IP 是否相同。如果不同,则丢弃该包。Host B 发现其IP 地址和 DST IP 相同,它将 A 的 IP/MAP 地址加入到自己的ARP 缓存中。
(4)B 发出一个 ARP 回复消息
SRC MAC: B 的 MAC
DST MAC:A 的 MAC
SRA IP: B 的 IP
DST IP: A 的 IP
(5)交换机直接将该包交给 host A。A 收到后,将 B 的 MAC/IP 地址缓存到 ARP 缓存中。
(6)A 使用 B 的 MAC 作为目的 MAC 地址发出 IP 包。
2. 目的IP 地址不在同一个网段的话
(图7)
本例子中,A 的地址是10.0.0.99, B 的地址是192.168.0.99。 的 1 和 A 在同一个网段,其IP 地址为10.0.0.1; 2 和 B 在同一个网段,其IP地址为192.168.0.1。
A 使用下面的步骤来获取 的 1 的 MAC 地址。
(1)根据其路由表,A 上的 IP 协议知道需要通过它上面配置的 10.0.0.1 才能到达到 B。经过上面例子中的步骤,A 会得到 10.0.0.1 的 MAC 地址。
(2)当 A 收到 1 的 MAC 地址后,A 发出了给B 的数据包:
SRC MAC: A 的 MAC DST MAC:Router 的 interface 1 的 MAC 地址 SRA IP: A 的 IP DST IP: B 的 IP
(3)路由器的 收到该数据包后,根据其路由表,首先经过同样的ARP 过程,路由器根据 B 的 IP 地址通过 ARP 获得其 MAC 地址,然后将包发给它。
SRC MAC: Router interface 2 的 MAC DST MAC:B 的 MAC SRA IP: A 的 IP DST IP: B 的 IP
2. 使用 Open (OVS)+ VLAN 组网
基于 VLAN 模式的 同 一样,都必须使用物理的 VLAN 网络。
2.1 物理 VLAN 网络配置
本例子中,交换机上划分了三个 VLAN 区域:
管理网络,用于 节点之间的通信,假设 VLAN ID 范围为 50 – 99.数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。
(图8)
关于网段之间的路由:
2.2 配置 2.2.1 配置进行
控制节点上:
# vim /etc/neutron/plugins/ml2/ml2_conf.ini [ml2] type_drivers = flat,vlan tenant_network_types = vlan mechanism_drivers = openvswitch
[ml2_type_flat] flat_networks = external
[ml2_type_vlan] network_vlan_ranges = physnet1:100:300
网络节点上:
#为连接物理交换机的网卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用于数据网络,eth3 用于外部网络 ovs-vsctl add-br br-eth2 ovs-vsctl add-br br-ex ovs-vsctl add-port br-eth2 eth2 ovs-vsctl add-port br-ex eth3 # vim /etc/neutron/plugins/ml2/ml2_conf.ini [m12] type_drivers = flat,vlan tenant_network_types = vlan mechanism_drivers = openvswitch [ml2_type_flat] flat_networks = external
[ml2_type_vlan] network_vlan_ranges = physnet1:100:300,external:1000:1010 [ovs] bridge_mappings = physnet1:br-eth2,external:br-ex
计算节点上:
#为连接物理交换机的网卡 eth2 建立 OVS physical bridge
ovs-vsctl add-br br-eth2
ovs-vsctl add-port br-eth2 eth2
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[m12]
type_drivers = vlan
tenant_network_types = vlan
mechanism_drivers = openvswitch
[ml2_type_vlan]
network_vlan_ranges = physnet1:100:300
[ovs]
bridge_mappings = physnet1:br-eth2
注意:
然后重启相应的 服务。
2.2.2 配置生效过程
当 L2 Agent (OVS Agent 或者 Linux agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 。以 OVS Agent 为例,
(1)创建 brige(默认是 br-int);如果 = true 的话,创建 (默认是 br-tun)。
(2)根据 ,配置每一个 VLAN 和 Flat 网络使用的 对应的预先创建的 OVS 。
(3)所有虚机的 VIF 都是连接到 。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 。
(4)对于 GRE 类型的虚拟网络,使用 LSI ( )来区分隧道()内的租户网络流量( )。这个隧道的两端都是每个物理服务器上的 。使用 Patch port 来将 br-int 和 br-tun 连接起来。
(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。
(6)最后, L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 指定该 RPC 循环任务的执行间隔,默认为2秒。
2.3 创建虚拟网络和子网 2.3.1 创建命令
s1@controller:~$ neutron net-create net1 (或者 Admin 用户运行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同) Created a new network: +---------------------------+--------------------------------------+ | Field | Value | +---------------------------+--------------------------------------+ | admin_state_up | True | | id | dfc74f44-a9f2-4497-a53d-1723804a49a8 | | name | net1 | | provider:network_type | vlan | | provider:physical_network | physnet1 | | provider:segmentation_id | 101 | | router:external | False | | shared | False | | status | ACTIVE | | subnets | | | tenant_id | 74c8ada23a3449f888d9e19b76d13aab | +---------------------------+--------------------------------------+ s1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1
2.3.2 代码实现
做完以上的步骤之后,用户就可以在 上 boot 虚机了。
boot 虚机的过程中,Nova 依次会:
(1)调用 REST API 申请一个或者多个 port。 会根据数据库中的配置来进行分配。
(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。
(3)启动虚机。
L2 Agent 的循环任务每隔两秒会依次:
(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成所有变更端口的列表(包括添加的、更新的、删除的端口)。比如:
{'': set([u'-78a0-429e-85be-', u'-0768-4e57-870d-']), '': set([]), 'added': set([u'-78a0-429e-85be-', u'-0768-4e57-870d-'])}
(2)为每一个待处理端口,根据其 ID 从 DB 中取得其详细信息。比如:
{u'': {}, u'': True, u'': u'-ec2a-467a-8cf1-', u'': 4, u'': u':nova', u'': , u'': u'fa:16:3e:fd:ed:22', u'': u'-0768-4e57-870d-', u'': u'-0768-4e57-870d-', u'': [{u'': u'-12b3-462e-9afe-', u'': u'91.1.180.4'}], u'': u'vlan'}
(3)针对每一个增加或者变更的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “命令来设置 br-tun 或者 物理 的flow rules;并设置 db 中其状态为 up。
(4)针对每一个被删除的 port,设置 db 中其状态为 down。
2.4 虚拟网络
(1)一个计算节点上的网络实例
它反映的网络配置如下:
使用 Open 。一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。创建了两个 VLAN ,分别使用 VLAN ID 101 和 102。该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 1;虚机2 和 3 分别有一个网卡接入 2.
(图9)
在该计算节点上做的事情:
(2)再加上另一个连接到同一个物理交换机的服务器(加上 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):
(图10)
实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。
(3)连接到同一物理交换机的网络节点的情况
(图11)
(4)网络流向
原文出处:
发表回复