在multi-host特性(https://wiki.openstack.org/wiki/Neutron/L3_High_Availability_VRRP)未进入社区前的拓扑设计, 直接上图,
Some important configurations
/etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types = flat,vlan,vxlan
mechanism_drivers = openvswitch
[ml2_type_vlan]
network_vlan_ranges = physnet1:1000:2999
[ml2_type_flat]
flat_networks = *
[ml2_type_vxlan]
vni_ranges = 1000:2000
vxlan_group = 239.1.1.1
/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
[OVS]
integration_bridge = br-int
bridge_mappings = physnet1:br-phy
tunnel_id_ranges = 1000:2000
enable_tunneling = True
tunnel_bridge = br-tun
local_ip = 9.123.136.115
[agent]
tunnel_types = vxlan
vxlan_udp_port = 8472
/etc/neutron/l3_agent.ini
use_namespaces = True
auth_url = http://9.123.136.113:5000/v2.0/
external_network_bridge = br-phy
20140401更新, 同事曾问到的三个问题:
1, 虚机网络与外部网络同子网使用外部dhcp服务器的问题, 前提是人工先将这些IP规划好
2, 能否跨三层路由器创建openstack环境的问题, 使用遂道的gre是可以的. flat, vlan因为一二层不通是不可以的, vxlan如果禁用广播的话理论上应该也是可行的
3, openstack生成的虚机上再创建分布式openstack环境的问题, 如果使用的是flat的话理论上不会有任何问题, 因为它们的二层都是通的. 若用的是gre或才vxlan, 参考上述第2条, 若使用vlan会造成二层不通,从虚机出来的vlan流量会在物理机中被drop掉,当然,在同一样物理机没事。
20140806更新,若允许一个l3-agent能处理多个公网段的话,
1, 需要在l3-agent.ini中将gateway_external_network_id与external_network_bridge设置成空
gateway_external_network_id =
external_network_bridge =
2, /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
bridge_mappings = physnet1:br-eth0,physnet2:br-eth1
3, 创建两个router(l3-agent的_process_routers会周期性处理这两个router关联的网关),各关联一个外部网络
neutron net-create ext_net_1 -- --router:external=True --provider:network_type flat --provider:physical_network physnet1
neutron subnet-create --allocation-pool start=192.168.100.102,end=192.168.100.126 --gateway 192.168.100.1 ext_net_1 192.168.100.100/24 --enable_dhcp=False
neutron router-interface-add $ROUTER_ID_1 $SUBNET_ID_1
neutron router-gateway-set $ROUTER_ID_1 $EXT_NET_ID_1
neutron net-create ext_net_2 -- --router:external=True --provider:network_type flat --provider:physical_network physnet2
neutron subnet-create --allocation-pool start=192.168.101.102,end=192.168.101.126 --gateway 192.168.101.1 ext_net_2 192.168.100.101/24 --enable_dhcp=False
neutron router-interface-add $ROUTER_ID_2 $SUBNET_ID_2
neutron router-gateway-set $ROUTER_ID_2 $EXT_NET_ID_2
4, ovs-l2-agent会读出bridge_mappings配置调用setup_physical_bridges方法,在事先就存在的两个外部桥br-eth0与br-eth1上与br-int通过peer设备连起来.
然后ovs-l2-agent会周期性将bridge-mappings参数汇报给DB.
5, ovs-ml2-mechanism-driver会从DB中取出bridge-mapping参数通过创建网络时指定的--provider:physical_network将相应的vlan ID取出来判断是否是vlan然后做binding不同的信息传回给nova
6, 这里使用的是ml2 plugin, 所以tenant_network_types = flat,vlan,vxlan可以同时支持多种类型。如果是grizzly版本仍然使用老的ovs plugin的话只能用tenant_network_type = gre支持一种类型的,并且它还有一个bug不支持flat因为如下代码, ml2 plugin不存在这个问题:
ovs_neutron_plugin.py
self.tenant_network_type = cfg.CONF.OVS.tenant_network_type
if self.tenant_network_type not in [svc_constants.TYPE_LOCAL,
svc_constants.TYPE_VLAN,
svc_constants.TYPE_GRE,
svc_constants.TYPE_VXLAN,
svc_constants.TYPE_NONE]: