OpenStackd搭建07-network

显示全文:

添加网络组件:

openstack网络架构(nova-network/neutron)

openstack网络体系中,网络技术没有创新,但用到的技术点非常庞杂,包括bridge、vlan、gre、vxlan、ovs、openflow、sdn、iptables等,当然这里不会做具体技术介绍,概述技术,主要将其与openstack的结合点做详细分析。

nova-network网络架构:
nova-network

在nova-network中,其网络模型包括flat、 flatdhcp、vlan,用到的技术主要有bridge、vlan,
我这里采用的是flatdhcp。 这种模式,能够自动给vm分发ip地址,能够实现vm访问外网。结构简单,但是稳定性比较好。

优点:结构简单,稳定

缺点:所有租户都在一个水平面上,租户之间没有隔离,由于所有租户都在一个子网内,当大规模部署后,其广播风暴将会是不小的负面因素。因为只是先做个测试,还没有考虑这么多。

相比于neutron网络,虽说没有neutron那么多的功能插件,仅有bridge,但是其稳定性已得到大多数用户的验证,对于小规模的私有云(1千台虚机的规模),nova-network是可以考虑的,目前线上部署的环境也是nova-network。

简单的介绍一下neutron:

neutron网络架构:
neutron

neutron网络体系相比于nova-network要复杂的多,用到的技术点也非常庞杂,在介绍网络架构之前,有必要概述下gre、vxlan、ovs、openflow、sdn技术点。
上面阐述过,vlan技术存在vlan id个数限制4094,公有云租户肯定不止4094,二层技术,只能部署在一个局域网内,无法实现跨机房部署。为了突破这俩个限制,增加了gre和vxlan隧道技术.

OpenStack 网络
openstack网络允许创建和附加第三方网络插件,插件可以实现适应不同的网络设备和软件,使用的openstack部署和架构更加的灵活。

neutron-server: 接受api请求,并选择适当的网络插件做出响应

openstack网络插件和代理创建和删除端口,创建网络和子网和提供ip地址。这些插件与代理不同,取决于使用的特定的云供应商和技术。openstack网络插件和代理,是由思科的虚拟、物理switches、 NEC OpenFlow products, Open vSwitch, Linux bridging, Ryu Network Operating System, and the VMware NSX product.
通用代理 L3 (layer 3), DHCP (dynamic host IP addressing), 和 一个 plug-in agent.

消息队列大多数用于在 neutron-server于多种客户端之间传递信息,也作为一个数据库存储网络插件的状态。openstack网络与openstack计算提供的实例连接相互作用。

网络概念

openstack neutron在openstack环境中,管理所有虚拟网络及访问物理网络结构接入层方面(PNI)

openstack neutron能使网络租户创建网络拓扑,包括服务例如 firewalls, load balancers, and virtual private networks (VPNs).

openstack网络包括networks,子网,和路由对象的抽象,每个抽象路由功能模仿物理理由:网络包括子网,路由器连接不同子网及网络之间

每个路由器连接到网络,和网卡连接到子网。子网可以访问连接到相同路由的机器的其它子网
任何的设置,至少有一个外网。不像其他网络,这个外网不止是虚拟的定义网络,相反它可以通过外部网络访问openstack。对于openstack的外部网卡,外部的物理网络都是可以访问的,在这个网络中,dhcp是被禁用的。
除了外部网络,任何网络都有一个或多个内部网络,这些软件定义的网络直接连接到虚拟机。在任何给定网络的虚拟机,或则在子网中连接相同的路由,可以直接访问VMs 连接的网络。

对于外部网络访问实例,实例访问外部网络,路由在网络之间是必须的。每个路由器连接到网络和网卡连接到子网,像物理路由器,子网访问其它子网的机器需要连接相同的路由,实例能访问外部网络通过路由。

此外,可以分配外网ip地址,对于内部网络的接口。凡是连接子网的,统称为接口。你可以给连接虚拟机端口分配ip地址。这样外部网络实体可以访问虚拟机。
openstack网络也支持安全组,管理员能够自定防火墙规则在安全组中,一个实例可以属于一个或多个安全组实例,网络在安全组中设置的规则,阻止或则允许端口、端口的范围或则虚拟机流量类型。

每个插件,网络的使用都有自己的概念。而操作虚拟网络结构和openstack环境不是至关重要的,理解这些概念帮助你创建网络。所有的网络设备使用一个核心插件和安全组插件。此外 Firewall-as-a-Service (FWaaS) 和 Load-Balancer-as-a-Service (LBaaS) plug-ins 插件都是可以利用的

下面进行网络组件的安装:

1,在控制节点上配置legacy network;控制节点上需要修改的东西很少,只需要将网络模式改为nova-network就好了。

  • 1),修改配置文件:/etc/nova/nova.conf
[DEFAULT]
...
network_api_class = nova.network.api.API
security_group_api = nova
选择nova-network这种网络模式。
  • 2),重启compute服务。
# service nova-api restart
# service nova-scheduler restart
# service nova-conductor restart

2,配置compute节点:(可以配置多个计算节点,我这里仅配置了一个)。

  • 1),安装legacy networking的组件:

apt-get install nova-network nova-api-metadata

  • 2),修改/etc/nova/nova.conf的配置文件。
[DEFAULT]
...
network_api_class = nova.network.api.API
security_group_api = nova
firewall_driver = nova.virt.libvirt.firewall.IptablesFirewallDriver
network_manager = nova.network.manager.FlatDHCPManager
network_size = 254
allow_same_net_traffic = False
multi_host = True
send_arp_for_ha = True
share_dhcp_address = True
force_dhcp_release = True
flat_network_bridge = br100
flat_interface = INTERFACE_NAME
public_interface = INTERFACE_NAME

注释:flat_interface 是eth1,管理接口
public_interface是eth0,访问外网的接口。(网络这方面根据实际情况而定,例如服务器两个接口都是连接的内网,其中eth0连接的内网可以通过nat实现上网,而eth1不能,并且你划定的flatdhcp地址池就是eth0所在的网段,那么你的flat_interface和public_interface都应该是eth0,我们做决定的时候一定要切合实际情况来决定)。

  • 3),重启服务:
#service nova-network restart
#service nova-api-metadata restart

按照官网文档来做,会发现有时候重启nova-network服务的时候,无法正常启动。
需要创建一个软连接,将/usr/bin/nova-dhcpbridge这个二进制文件链接到/usr/local/bin/dhcpbridge下

#ln -s /usr/bin/nova-dhcpbridge 。

创建实例化网络:(在控制节点上)。

1),设置环境变量:

$ source admin-openrc.sh

2),创建网络:

$ nova network-create demo-net --bridge br100 --multi-host T \
--fixed-range-v4 NETWORK_CIDR

例如: nova network-create demo-net --bridge br100 --multi-host T   --fixed-range-v4 192.168.3.32/27

可以使用命令查看

root@controller:~# nova net-list
+--------------------------------------+---------+-----------------+
| ID                                   | Label   | CIDR            |
+--------------------------------------+---------+-----------------+
| 6aecec82-5d87-4b77-8fb8-0d7dd687e091 | lan-net | 192.168.3.32/27 |
+--------------------------------------+---------+-----------------+

问题:
注意这里需要根据你选择的网络模式修改配置文件。选择network_api_class
。并且重启所有nova服务。特别要注意nova的服务是否正常开启。如果报错:ERROR (ClientException): The server has either erred or is incapable of performing the requested operation. (HTTP 500) (Request-ID: req-f2c74d47-6f4a-467b-9f5c-c1f2261e6696)
则是因为nova.conf文件内容有错,或者是服务有的没有开启,可以使用nova service-list 来查看,并且可以通过同步nova到数据库中来查看nova.conf 文件是否有错。

到这里为止,目前的openstack环境已经包含了创建一个基本实例所要用到的所有组件,可以创建一个instance(即vm)来测试,也可以继续添加其他模块。我又接着添加了dashboard即horizon提供可视化界面来管理创建实例。
同时我还修改了/etc/sysctl.conf这个配置文件,实现地址转发。(不知道有没有这个必要,待验证)。

1. Edit the /etc/sysctl.conf file to contain the following parameters:
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0

2. Implement the changes:
# sysctl -p

验证网络服务:

当我们创建完最基本的网络服务之后,一定要检查以下几项内容:

首先,确保产生一个桥接接口br100,这个br100桥接接口只有在compute节点上有实例在运行的时候才会产生,如果没有实例运行,ifconfig是看不到br100的。所有使用openstack创建的vm都会通过这个br100作为桥接接口,作为通往internet的出口。
可以看到br100的ip地址是我们所分配ip地址段的网关,当我们使用openstack创建一个实例的时候,实例的默认网关就会指向br100.

root@compute1:~# ifconfig 
br100     Link encap:Ethernet  HWaddr c8:1f:66:bc:73:c2  
          inet addr:192.168.3.33  Bcast:192.168.3.63  Mask:255.255.255.224
          inet6 addr: fe80::984c:dfff:fe9d:6575/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2233483 errors:0 dropped:25 overruns:0 frame:0
          TX packets:1272014 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:518104430 (518.1 MB)  TX bytes:481296191 (481.2 MB)

其次,必须保证br100是桥接在你物理网卡的flat_interface上,例如我线上flat_interface和public_interface都是em1.
可以通过brctl这条命令查看:

root@compute1:~# brctl show
bridge name     bridge id               STP enabled     interfaces
br100           8000.c81f66bc73c2       no              em1
                                                        vnet0
                                                        vnet1
                                                        vnet2
                                                        vnet3
                                                        vnet4
                                                        vnet5
                                                        vnet6
                                                        vnet7
                                                        vnet8
virbr0          8000.000000000000       yes

然后,查看当前路由的默认网关,必须是你能够访问外网的网关,并且出口肯定是br100,不然一定会出错。

root@compute1:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.3.254   0.0.0.0         UG    0      0        0 br100
10.0.0.0        *               255.255.255.0   U     0      0        0 em2
192.168.3.0     *               255.255.255.0   U     0      0        0 br100
192.168.3.32    *               255.255.255.224 U     0      0        0 br100
192.168.122.0   *               255.255.255.0   U     0      0        0 virbr0

最后,查看一下dnsmasq服务是否正常启动。

root@compute1:~# ps aux | grep dnsmasq
libvirt+  1842  0.0  0.0  28212  2312 ?        S    Jul18   0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf
nobody    1855  0.0  0.0  28208  2488 ?        S    Jul18   0:01 /usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= --pid-file=/var/lib
/nova/networks/nova-br100.pid --dhcp-optsfile=/var/lib/nova/networks/nova-br100.opts --listen-address=192.168.3.33 --except-interface=lo --dhcp-range=set:lan-net,192.168.3.34,static,255.255.255.224,86400s --dhcp-lease-max=32 --dhcp-hostsfile=/var/lib/nova/networks/nova-br100.conf --dhcp-script=/usr/local/bin/nova-dhcpbridge --no-hosts --leasefile-ro --domain=novalocal --addn-hosts=/var/lib/nova/networks/nova-br100.hostsroot      1856  0.0  0.0  28208  1888 ?        S    Jul18   0:00 /usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= --pid-file=/var/lib
/nova/networks/nova-br100.pid --dhcp-optsfile=/var/lib/nova/networks/nova-br100.opts --listen-address=192.168.3.33 --except-interface=lo --dhcp-range=set:lan-net,192.168.3.34,static,255.255.255.224,86400s --dhcp-lease-max=32 --dhcp-hostsfile=/var/lib/nova/networks/nova-br100.conf --dhcp-script=/usr/local/bin/nova-dhcpbridge --no-hosts --leasefile-ro --domain=novalocal --addn-hosts=/var/lib/nova/networks/nova-br100.hostsroot      1976  0.0  0.0  10468  2264 pts/18   S+   14:07   0:00 grep --color=auto dnsmasq

可以看到监听的网段,详细的dhcp信息。之前有把openstack进行过整体迁移,例如网络从192.168.0.0/24迁移到192.168.3.0/24网段。迁移完后发现dnsmasq监听的地址还是在192.168.0.0这个网段,dhcp获得地址也都不正确。解决方法是:重启dnsmasq服务。

等一切服务安装完成之后,compute节点上每创建一个实例,就会生成一个vnet接口,

vnet0     Link encap:Ethernet  HWaddr fe:16:3e:ae:c7:70  
          inet6 addr: fe80::fc16:3eff:feae:c770/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:280562 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1535062 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:57656002 (57.6 MB)  TX bytes:660459406 (660.4 MB)

vnet1     Link encap:Ethernet  HWaddr fe:16:3e:03:11:29  
          inet6 addr: fe80::fc16:3eff:fe03:1129/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:107176 errors:0 dropped:0 overruns:0 frame:0
          TX packets:700957 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:22395464 (22.3 MB)  TX bytes:256144937 (256.1 MB)