openstack网络概念术语比较多,从网络所处的位置来讲可以分为两类:
一个是openstack各个物理节点(host)的物理网卡之间的互联网络。
一个是openstack 里面的虚拟网络世界(neutron),互联用户(tenant)的虚机,这时候用到的术语一般是provider network(external network,public network), tenant network(private network,internal network)意思都差不多。两者都是neutron create的网络,但是provider network创建的时候需要指定provider physical network(关联到host上的物理网络),从而这部分网络是直接可以和外界联系的。Private network则是虚机instance直接连接的网络,这个网络保证虚机之间的通信,如果要和外部通信,通常经过一个router连接到provider network segment上。
Provider physical network是事先在neutron plugin的配置文件里指定的:
/etc/neutron/plugins/ml2/openvswitch_agent.ini:
bridgemappings=extnet:br-ex
比如这里就指定一个可以在neutron create network时候使用的provider phy network名叫extnet,它被mapping到host上的一个br-ex open virtual switch。 这个br-ex需要自己手动创建, openstack不会帮助创建。创建的办法可以是使用ovs-vsctl命令创建,这种是not persistent的,也可以直接写ifcfg-br-ex文件来创建persistent的。这个br-ex需要手动添加host的物理网口,才能真正和外界的物理网络联系起来。方法也是用命令add port或者创建 ifcfg-eth*文件来实现。
一个instance通常挂在private network上,当然也可以增加一个网口直接挂在provider network上,分配provider network的ip地址。
不管provider 还是internal network, 创建的时候都默认开启dhcp 功能,创建instance的时候就可以自动获取该网段的ip.
Instance创建的时候,在compute host上会对应每一个instance的网口创建一个tap interface, 那么这个tap interface之间以及和外部provider network 之间是如何联系起来的?很关键的一个是openstack创建的br-int 这个integration bridge. 每个tap interface会经过一个linux bridge连接到这个integration bridge, 所以tap interface之间的通信也就自然实现了。 而provider对应的br-ex又会被patch port连接到这个br-int,所以虚机和外界通信的通道也建立起 来了(这个通道是为那些create了直接attach到provider network的interface的虚机准备的)。
因为 br-ex是直接连到物理网络的,所以对应不同节点上的instance如果要使用到这个br-ex对应的provider网络,都需要手动建立br-ex ovs,并绑定物理端口。
那不同节点上的instance之间如果都attach到同一个neutron create的internal network上,彼此之间又是如何通信的呢?显然需要各个节点上的br-int能够互联。这个互联是通过vxlan对应的gre tunnel实现的。这个只需要在neutron里面配置tunnel的ip就行了:
/etc/neutron/plugins/ml2/openvswitch_agent.ini:
localip=10.10.10.4 (示例中10.10.10.4是本节点的eth的ip)
在创建了虚机之后就会发现ovs-vsctl show出来有一个bridge br-tun并且生成了tunnel。这个br-tun把不同的compute host联系起来,而它自身又被patch到br-int,自然就把不同host上的虚机给打通了。
另外provider network经常提到vlan 的概念,其实就是br-ex绑定的物理网口上支持vlan, 从而也可以一个网口创建多个外部网络。 neutron配置文件加上:
/etc/neutron/plugins/ml2/ml2_conf.ini:
network_vlan_ranges=extnet
就可以。在neutron中创建provider网络的时候接可以指定vlan id了。上面的extnet后面也可以跟一个vlan range,如果不跟就是表示所有的vlan。
在使用vlan的provider的时候,涉及到ovs 的openflow, 它的作用就是在从internal network 的vm tap interface到外部网络的时候,给对应的流打上正确的vlan标签。因为内部网络的vlan是自动划分的,和外部vlan不能划等号但是有对应关系(就是create vm的时候哪个网口连到哪个外部网络决定的对应关系),所以ovs上的openflow的规则就实现这个内部vlan到外部vlan的转换。
在创建虚机的时候会指定security group,它最终体现为host上的一系列iptables的rules. Iptables -L可以看到。如果你只是实验网络不关心安全又担心这些规则有问题限制了一些通信,可以简单的iptables -F临时清空。