分享

neutron系列:使用 Open vSwitch + VLAN 组网(4)

fc013 发表于 2015-12-6 18:25:02 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 1 19345
本帖最后由 eying 于 2016-1-13 16:52 编辑

问题导读:

1.怎样配置Neutron ?
2.怎样创建虚拟网络和子网?
3.Neutron 的虚拟网络分类有哪些?




2. 使用 Open vSwitch (OVS)+ VLAN 组网
Neutron 基于 VLAN 模式的 tenant network 同 provider network 一样,都必须使用物理的 VLAN 网络。

2.1 物理 VLAN 网络配置
本例子中,交换机上划分了三个 VLAN 区域:

  • 管理网络,用于 OpenStack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.
  • 数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。
  • 外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。

openstack-icehouse-vlan.png

(图8)

关于网段之间的路由:
  • 如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。
  • 如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。

2.2 Neutron 配置


2.2.1 配置进行

控制节点上:

[mw_shl_code=bash,true]# 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[/mw_shl_code]

网络节点上:

[mw_shl_code=bash,true]#为连接物理交换机的网卡 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[/mw_shl_code]

计算节点上:

[mw_shl_code=bash,true]#为连接物理交换机的网卡 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 [/mw_shl_code]

注意:

  • network_vlan_ranges 中的 VLAN ID 必须和物理交换机上的 VLAN ID 区间一致。
  • bridge_mappings 中所指定的 bridge 需要和在个节点上手工创建的 OVS bridge 一致。

然后重启相应的 Neutron 服务。

2.2.2 配置生效过程
当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,

(1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。
(2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。
(3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。
(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。
(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。
(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。

2.3 创建虚拟网络和子网


2.3.1 创建命令

[mw_shl_code=bash,true]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[/mw_shl_code]

2.3.2 Neutron 代码实现
做完以上的步骤之后,用户就可以在 subnet 上 boot 虚机了。

boot 虚机的过程中,Nova 依次会:

(1)调用 Neutron REST API 申请一个或者多个 port。Neutron 会根据数据库中的配置来进行分配。
(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。
(3)启动虚机。

Neutron L2 Agent 的循环任务每隔两秒会依次:

(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成所有变更端口的列表(包括添加的、更新的、删除的端口)。比如:

{'current': set([u'04646b21-78a0-429e-85be-3167042b77be', u'592740b0-0768-4e57-870d-6495e6c22135']), 'removed': set([]), 'added': set([u'04646b21-78a0-429e-85be-3167042b77be', u'592740b0-0768-4e57-870d-6495e6c22135'])}

(2)为每一个待处理端口,根据其 ID 从 DB 中取得其详细信息。比如:

{u'profile': {}, u'admin_state_up': True, u'network_id': u'e2022937-ec2a-467a-8cf1-f642a3f777b6', u'segmentation_id': 4, u'device_owner': u'compute:nova', u'physical_network': phynet1, u'mac_address': u'fa:16:3e:fd:ed:22', u'device': u'592740b0-0768-4e57-870d-6495e6c22135', u'port_id': u'592740b0-0768-4e57-870d-6495e6c22135', u'fixed_ips': [{u'subnet_id': u'13888749-12b3-462e-9afe-c527bd0a297e', u'ip_address': u'91.1.180.4'}], u'network_type': u'vlan'}

(3)针对每一个增加或者变更的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “ 命令来设置 br-tun 或者 物理 bridge 的 flow rules;并设置 db 中其状态为 up。

(4)针对每一个被删除的 port,设置 db 中其状态为 down。

2.4 Neutron 虚拟网络

(1)一个计算节点上的网络实例

它反映的网络配置如下:

  • Neutron 使用 Open vSiwtch。
  • 一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。
  • 创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。
  • 该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 network 1;虚机2 和 3 分别有一个网卡接入 network 2.

071404395024896.jpg

(图9)

Neutron 在该计算节点上做的事情:

  • 创建了 OVS Integration bridge br-int。它的四个 Access 端口中,两个打上了内部 Tag 1,连接接入 network 1 的两个网卡;另两个端口的 VLAN Tag 为 2。
  • 创建了一对 patch port,连接 br-int 和 br-eth1。
  • 设置 br-int 中的 flow rules。对从 access ports 进入的数据帧,加上相应的 VLAN Tag,转发到 patch port;从 patch port 进入的数据帧,将 VLAN ID 101 修改为 1, 102 修改为 2,再转发到相应的 Access ports。
  • 设置 br-eth1 中的 flow rules。从 patch port 进入的数据帧,将内部 VLAN ID 1 修改为 101,内部 VLAN ID 2 修改为 102,再从 eth1 端口发出。对从 eth1 进入的数据帧做相反的处理。

(2)再加上另一个连接到同一个物理交换机的服务器(加上 neutron 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):

071420571112097.jpg
(图10)

Neutron 实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。

(3)连接到同一物理交换机的网络节点的情况

071429144864712.jpg

(4)网络流向

  • 不同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 物理交换机 进行,不需要做到网络节点。如图10 所示。
  • 相同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 br-int 进行。

071439328775724.jpg



  • 对其他虚机之间数据交换情形,都算作跨子网的数据流向,都需要经过网络节点中的 Router 进行 IP 包的路由。(也可以直接使用连接物理交换机的物理路由器)。

071450070644511.jpg



相关内容:


neutron系列:Neutron 所实现的虚拟化网络(1)


neutron系列:Neutron 所实现的虚拟化网络(2)

neutron系列:使用 Open vSwitch + VLAN 组网(3)

neutron系列:使用 Open vSwitch + VLAN 组网(4)

Neutron系列 : 使用Open vSwitch + GRE/VxLAN 组网 (5)

Neutron系列 : 使用Open vSwitch + GRE/VxLAN 组网(6)

Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(7)

Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(8)

Neutron系列 : Neutron 是如何向 Nova 虚机分配固定IP地址的(9)

Neutron系列 : Neutron 是如何向 Nova 虚机分配固定IP地址的(10)

Neutron 系列 (11): Neutron 是如何实现负载均衡器虚拟化的【基础篇】

Neutron 系列 (12): Neutron 是如何实现负载均衡器虚拟化的【提高篇】

Neutron 系列 (13): Neutron 是如何实现虚机防火墙的 【上】

Neutron 系列 (14): Neutron 是如何实现虚机防火墙的 【下】

Neutron 系列 (15): OpenStack 是如何实现 Neutron 网络 和 Nova虚机 防火墙的

Neutron 系列(16):虚拟专用网(VPN)虚拟化

Neutron 系列 (17): Neutron 分布式虚拟路由【上】

Neutron 系列 (18): Neutron 分布式虚拟路由【下】

Neutron系列(19):Neutron L3 Agent HA 之 虚拟路由冗余协议(VRRP)【上】

Neutron系列(20):Neutron L3 Agent HA 之 虚拟路由冗余协议(VRRP)【下】

Neutron系列(21):OpenStack 高可用和灾备方案 [OpenStack HA and DR]【上】

Neutron系列(22):OpenStack 高可用和灾备方案 [OpenStack HA and DR]【下】







已有(1)人评论

跳转到指定楼层
lmlm1234 发表于 2015-12-7 11:49:42
neutron系列:使用 Open vSwitch + VLAN 组网(4)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条