Quantum中的L3模型实战
截止到OpenStack Folsom版,Quantum中的对象模型有以下几个:Network, Subnet, Port, Router, FloatingIP。前三个在我之前的博客已有所分析,今天来看下Router和FloatingIP。
以官方文档中给出的一个quantum部署示例为例:
这个图是用户视角的虚拟机网络部署。每个租户可以创建自己的router,并把自己的private network与router关联。同时,可以把router与一个external network关联,在这个external network上创建公网IP池(即创建subnet,subnet里的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=vlan;network_vlan_ranges = physnet1:1:4094)
为租户C创建网络TenantC_PrivateNet1和TenantC_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. 指定网络创建虚拟机
虚拟机的创建不属于本篇范畴,略去。假设:
租户A在TenantA_PrivateNet网络上创建两个虚拟机A_VM1和A_VM2,这样,在Quantum上就对应的创建了两个port,A_Port1和A_Port2.
同样的,租户C创建虚拟机:C_VM1, C_VM2, C_VM3, C_VM4,对应的port:C_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. 将租户A和C的router与外部网络关联
quantum router-gateway-set RouterA External_Net
quantum router-gateway-set RouterC External_Net
上述命令,其实是在External_Net上面创建了两个Port,port的属性中device_owner=network:router_gateway,device_id=router_id。在创建Port的同时,分别分配了公网IP(因为外部网络的子网是公网IP)。
6. 将租户A和C的虚拟机绑定到各自的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内创建port,port的属性中device_owner=network:router_interface,device_id=router_id,fixed_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分配了四个port,port的属性中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获取router和floatingIP的信息,然后通过底层的网络命令实现上层的模型(主要还是iptable命令)。这样,在大规模部署时,如果系统中存在多个router和floatingIP,将会对l3 agent造成较大的负载,虽然可以通过增加循环间隔的方式缓解,但这样又会造成信息的延迟生效。所以,需要寻求两外的方式来满足规模部署的需求。
转载声明:本博客文章欢迎转载,但在转载的同时,请注明文章的来源出处,否则将追究责任。