Quantum中的L3模型实战

Quantum中的L3模型实战

 

 本博客欢迎转发,但请保留原作者(@孔令贤HW)信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!

截止到OpenStack Folsom版,Quantum中的对象模型有以下几个:Network Subnet Port Router FloatingIP。前三个在我之前的博客已有所分析,今天来看下RouterFloatingIP

以官方文档中给出的一个quantum部署示例为例:
Quantum中的L3模型实战_第1张图片
 
这个图是用户视角的虚拟机网络部署。每个租户可以创建自己的router,并把自己的private networkrouter关联。同时,可以把router与一个external network关联,在这个external network上创建公网IP池(即创建subnetsubnet里的IP是公网IP)。更进一步,可以创建floatingIP并将其与虚拟机的port绑定,这样就可以从公网访问虚拟机。

下面使用quantum命令行来从无到有完成上述的网络模型。注意,实际执行命令时,将尖括号内的内容替换成实际内容,我都是以管理员角色执行的命令,实际执行时,可以根据需要在命令参数中添加--tenant-id

1. 创建network
为租户A创建网络TenantA_PrivateNet

quantum net-create --tenant-id <tenantA_ID> TenantA_PrivateNet --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 1024
(我的ovs_quantum_plugin.ini中有如下配置:tenant_network_type=vlannetwork_vlan_ranges = physnet1:1:4094
为租户C创建网络TenantC_PrivateNet1TenantC_PrivateNet2
quantum net-create --tenant-id <tenantC_ID> TenantC_PrivateNet1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 1025
quantum net-create --tenant-id <tenantC_ID> TenantC_PrivateNet2 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 1026

创建外部网络External_Net
quantum net-create External_Net --router:external=True

2. 为网络添加subnet
在租户A的网络上添加subnet

quantum subnet-create --tenant-id <tenantA_ID> TenantA_PrivateNet 10.0.0.0/24
在租户C的网络上分别添加subnet
quantum subnet-create --tenant-id <tenantC_ID> TenantC_PrivateNet1 10.0.0.0/24
quantum subnet-create --tenant-id <tenantC_ID> TenantC_PrivateNet2 10.0.1.0/24

(
注意设置配置项allow_overlapping_ips=true)
在外部网络添加subnet

quantum subnet-create External_Net --gateway 30.0.0.1 30.0.0.0/22 --enable_dhcp=False

3. 指定网络创建虚拟机
虚拟机的创建不属于本篇范畴,略去。假设:
租户ATenantA_PrivateNet网络上创建两个虚拟机A_VM1A_VM2,这样,在Quantum上就对应的创建了两个portA_Port1A_Port2.
同样的,租户C创建虚拟机:C_VM1, C_VM2, C_VM3, C_VM4,对应的portC_Port1, C_Port2, C_Port3, C_Port4

4. 创建router
为租户A创建路由RouterA

quantum router-create --tenant-id <tenantA_ID> RouterA
为租户C创建路由RouterC
quantum router-create --tenant-id <tenantC_ID> RouterC
router
创建完后,其实什么也没做,只在数据库添加了一条记录。

5. 将租户ACrouter与外部网络关联
quantum router-gateway-set RouterA External_Net
quantum router-gateway-set RouterC External_Net

上述命令,其实是在External_Net上面创建了两个Portport的属性中device_owner=network:router_gatewaydevice_id=router_id。在创建Port的同时,分别分配了公网IP(因为外部网络的子网是公网IP)。

6. 将租户AC的虚拟机绑定到各自的router
quantum router-interface-add RouterA <A_Subnet_ID>
quantum router-interface-add RouterC <C_Subnet1_ID>
quantum router-interface-add RouterC <C_Subnet2_ID>

上述命令,其实是在各自subnet所对应的network内创建portport的属性中device_owner=network:router_interfacedevice_id=router_idfixed_ip={'ip_address': subnet['gateway_ip'], 'subnet_id': subnet['id']}
需要注意的是,在同一个Router内,IP地址是不能重复的。

7. 给虚拟机关联公网IP
首先创建四个floatingIP

quantum floatingip-create External_Net
quantum floatingip-create External_Net
quantum floatingip-create External_Net
quantum floatingip-create External_Net

上述命令执行后,其实是在External_Net分配了四个portport的属性中device_owner=network:floatingip
然后关联floatingIP和虚拟机port

quantum floatingip-associate <floatingip1-ID> <A_Port1_ID>
quantum floatingip-associate <floatingip2-ID> <A_Port2_ID>
quantum floatingip-associate <floatingip3-ID> <C_Port1_ID>
quantum floatingip-associate <floatingip4-ID> <C_Port2_ID>

至此,完成了上述的网络模型。

当然,逻辑上的网络模型只是为了方便应用,其实并不能说明什么,底层的实现才是关键。Quantum的安装部署中,有一个l3 agent进程(可以是一个或多个),这个进程脚本其实就是个死循环,不停的调用QuantumAPI获取routerfloatingIP的信息,然后通过底层的网络命令实现上层的模型(主要还是iptable命令)。这样,在大规模部署时,如果系统中存在多个routerfloatingIP,将会对l3 agent造成较大的负载,虽然可以通过增加循环间隔的方式缓解,但这样又会造成信息的延迟生效。所以,需要寻求两外的方式来满足规模部署的需求。

 

本博客欢迎转发,但请保留原作者(@孔令贤HW)信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!

你可能感兴趣的:(openstack,router,quantum,floatingIP)