几句话说清楚openstack的网络问题

     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: 
        bridge_mappings=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会被加到这个integration bridge,
            所以tap interface之间的通信也就自然实现了。 而provider对应的br-ex又
            会被patch port连接到这个br-int,所以虚机和外界通信的通道也建立起
            来了(这个通道是为那些create了直接attach到provider network的port的
            虚机准备的)。

    因为 br-ex是直接连到物理网络的,所以对应不同节点上的instance如果要
            使用到这个br-ex对应的provider网络,都需要手动建立br-ex ovs,并绑定物
            理端口。

            那不同节点上的instance直接如果都attach到同一个neutron create的internal
            network上,彼此之间又是如何通信的呢?显然需要各个节点上的br-int能
            够互联。这个互联是通过vxlan对应的gre tunnel实现的。这个只需要
            在neutron里面配置tunnel的end ip就行了:
            /etc/neutron/plugins/ml2/openvswitch_agent.ini:
            local_ip=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=extent 
         就可以。在neutron中创建provider网络的时候接可以指定vlan id了。上面
         的extnet后面也可以跟一个vlan range,但是 不跟表示所有的。

         在使用vlan的provider的时候,涉及到ovs 的openflow, 它的作用就是在
            从internal network   的instance tap interface到外部网络的时候,给对应的
            流打上正确的vlan标签。因为内部网络的vlan是自动划分的,和外部vlan
            不能划等号但是有对应关系(就是create instance的时候哪个网口连到哪
            个外部网络决定的对应关系),所以ovs上的openflow的规则就实现这个
            内部vlan到外部vlan的转换。

            在创建虚机的时候会指定security group,它最终体现为host上的一系
            列iptables的rules. Iptables -L可以看到。如果你只是实验网络不关心安全
            又担心这些规则有问题限制了一些通信,可以简单的iptables -F临时清空。

猜你喜欢

转载自blog.51cto.com/11772130/2132883