nova-network是Nova里面负责虚拟机网络的组件,后来OpenStack发展了一个功能更强大的项目Neutron,用来替代nova-network。但是Neutron过于复杂,还不是很成熟,在生产环境中容易出问题,所以,目前还是有许多生产环境选择部署nova-network。另外,nova-network也依然保留在Nova代码内,还没有被移除,只是这部分代码现在比较稳定,很少改动。本节从基本概念开始,重点介绍这部分内容。
1.关键概念
Nova中有fixed_ip和floating_ip概念。
(1)fixed_ip
这是内网中虚拟机所使用的内部IP地址,从虚拟机创建起到虚拟机终止为止,都需要一个固定的fixed_ip来对应这个虚拟机,一个虚拟机必须要有fixed_ip。集群的网络类型决定虚拟机获取fixed_ip的方式,具体使用何种方式是在系统中预先配置好的,nova-controller.conf有一个选项network_manager来指定具体的方式。
(2)floating_ip
这是外网的IP地址,可动态指派给虚拟机,也可随时收回。floating_ip是可选的(用户需要这台虚拟机可供外网访问时,才需要为其指派floating_ip)。flaoting_ip不是在虚拟机的虚拟网卡上,而是在nova-network的外围网络接口上分配。nova-network会根据用户配置指令做NAT,将用户内网的fixed_ip映射到外网的floating_ip,这样,用户访问floating_ip时,会通过nova-network重定向到具体的flixed_ip上。nova-network通过这种NAT机制控制虚拟机的内外网连通性。
在linux_net模块实现的floating_ip的绑定和解绑方法如下:
def bind_floating_ip(floating_ip, device): """Bind ip to public interface.""" _execute('ip', 'addr', 'add', str(floating_ip) + '/32', 'dev', device, run_as_root=True, check_exit_code=[0, 2, 254]) if FLAGS.send_arp_for_ha:_execute('arping', '-U', floating_ip, '-A', '-I', device, '-c', 1, run_as_root=True, check_exit_code=False)def unbind_floating_ip(floating_ip, device): """Unbind a public ip from public interface.""" _execute('ip', 'addr', 'del', str(floating_ip) + '/32', 'dev', device, run_as_root=True, check_exit_code=[0, 2, 254])
fixed_ip、floating_ip资源池都是由管理员事先配置好的,存放于Nova数据库的fixed_ip表和floating_ips表中。Daiblo版本中整个OpenStack集群只有一个floating_ips资源池。为便于系统管理员管理不同租户的floating_ips,从Essex版本开始引入多个floating_ips_pools的概念,其实就是对floating_ips地址段进行划分,从概念和数据库表属性上进行表征,不同的池属于不同的租户。
2.网络类型
目前,Nova支持3种类型的网络:Flat、Flat DHCP和VLAN。在一个云系统中,这3种网络可以同时存在。但用户不能为给定的项目选择网络类型,因此在一个给定的compute部署中,只能配置一种网络类型。
(1)Flat模式
Flat模式中,网络管理员需要设定一个子网。VM的IP地址需要从该子网中抓取,同时在发布实例时注入镜像中。每个实例从可用的地址资源池中获取一个fixed_ip。网络管理员必须在托管网络的网络控制器和托管实例的云控制器间配置Linux网桥(通常命名为br100)。系统的所有实例都要由管理员手动配置连接到该网桥上。compute在创建虚拟机过程中,会向nova-network发指令,索要IP地址,nova-compute收到nova-network返回的IP地址后,在虚拟机创建时注入该IP地址。
注意 配置注入目前仅支持Linux-style的系统,网络配置信息记录在/etc/network/interfaces中。
FlatManager是Flat网络的管理类,它不负责网桥和VLAN的创建工作。用户在创建网络时负责通过nova-manage来创建指定的网桥。需要在所有的compute host节点上创建网桥。为主机创建单个网络的命令如下:
nova-manage network create 192.168.0.0/24 1 256
目前Nova不支持由一个管理器创建多个网络,但可通过修改allocate_fixed_ip和get_network来获得新的网络逻辑。管理员可手动修改fixed_ip资源池包含的IP地址列表。
当flat_injected=True时,compute host将注入网络配置给VM。它通过修改/etc/network/interfaces实现,目前只支持基于Debian的系统。
该模式下,metadata转发由网关处理,发送给169.254.169.254:80的请求会被转发给API服务器。
FlatManager实现的函数有def_setup_network_on_host(self,context,network):
"""Sets up network on this host,设置内网的虚拟网络."""network['dhcp_server'] = self._get_dhcp_ip(context, network)self.l3driver.initialize_gateway(network)if not FLAGS.fake_network: dev = self.driver.get_dev(network) self.driver.update_dhcp(context, dev, network) if(FLAGS.use_ipv6):self.driver.update_ra(context, dev, network)gateway = utils.get_my_linklocal(dev)self.db.network_update(context, network['id'], {'gateway_v6': gateway})
Flat Networking使用一台网络适配器作为网桥,传输多节点间的网络通信。该设置可在主机的单个适配器或多个适配器上实现。该模式不需要具有打VLAN标签功能的交换机,通常用于概念证明。如果选择使用Flat networking模式,Nova其实是不管理网络的。相反,IP地址通过文件系统(或客户端代理)注入实例中。如果需要Metadata转发机制,则必须在网关上手动配置。nova.conf中的配置选项如下:
network_manager=nova.network.manager.FlatManager
注意 在Flat networking模式下,失败的flat_injection将使VM在启动时不能收到其IP信息。
Compute默认定义了一个名为br100的网桥设备(存储在Nova数据库中),网桥的名称是可以更改的。
在任意Flat Networking(Flat|FlatDHCP)模式下,nova-network主机负责转发私有网络中的通信。网络主机需要配置br100来与其他托管VM的节点进行会话。两种Flat模式中,VM的默认网关都是运行Nova-network的主机。
设置compute节点的外部IP地址到网桥上,并添加eth1到网桥的网络接口配置文件如下:
sudo brctl addbr br100#创建网桥br100sudo brctl addif br100 eth1 #添加设备到网桥br100sudo ip addr add 10.0.0.1/24 brd 10.0.0.255 dev br100 #设置br100管理的子网
下一步是重启网络,使用命令sudo/etc/init.d/networking重启。图2-9给出all-in-one的网络环境。
图2-9 Flat网络,all-in-one服务器配置
对存在多个compute节点,而仅有一个网络适配器的部署环境,可在做“冒烟测试”或概念证明时使用,图2-10表示此种环境的网络设置情况。
图2-10 Flat网络,一个接口,多个服务器
对存在多个compute节点,而有多个网络适配器的部署环境,能隔离admin和数据通信,图2-11表示此种环境的网络设置情况。
图2-11 Flat网络,多个接口,多个服务器
(2)Flat DHCP模式
虚拟机通过DHCP方式获取fixed_ip地址,虚拟机在启动时通过dhcpdiscover向DHCP服务器发起获取IP地址的请求。一个DHCP服务器侦听网桥br100(由管理员手动配置),收到DHCP请求后,分配指定子网中的一个fixed_ip响应给虚拟机。这种模式最为简单。FlatDHCPManager不会注入网络设置给guest,但管理网桥。
类似于Flat模式,所有instance挂接到一个单独的compute节点上。该模式下compute需要桥接到一个以太网设备上(默认是eth0),同时需要运行dnsmasq服务作为DHCP服务器来侦听网桥。实例通过dhcpdiscover获取其fixed_ip。
在两种Flat模式下,compute为每个项目&实例创建iptables/ebtables目录来隔离IP、MAC地址欺诈或ARP中毒。
实现的函数如下:
1)def init_host(self)
"""Do any initialization that needs to be run if this is astandalone service."""#将linux_net作为后端的3层驱动器self.l3driver.initializesuper(FlatDHCPManager, self).init_hostself.init_host_floating_ips
2)def_setup_network_on_host(self,context,network)
"""Sets up network on this host."""network['dhcp_server'] = self._get_dhcp_ip(context, network)self.l3driver.initialize_gateway(network)if not FLAGS.fake_network: dev = self.driver.get_dev(network) self.driver.update_dhcp(context, dev, network) if(FLAGS.use_ipv6): self.driver.update_ra(context, dev, network) gateway = utils.get_my_linklocal(dev) self.db.network_update(context, network['id'], {'gateway_v6': gateway})
3)def_teardown_network_on_host(self,context,network)
if not FLAGS.fake_network: network['dhcp_server'] = self._get_dhcp_ip(context, network) dev = self.driver.get_dev(network) self.driver.update_dhcp(context, dev, network)
4)def_get_network_by_id(self,context,network_id)
return NetworkManager._get_network_by_id(self, context.elevated, network_id)
5)def_get_network_dict(self,network)
"""Returns the dict representing necessary and meta network fields"""# get generic network fieldsnetwork_dict = super(FlatDHCPManager, self)._get_network_dict(network)# get flat dhcp specific fieldsif self.SHOULD_CREATE_BRIDGE:network_dict['should_create_bridge'] = self.SHOULD_CREATE_BRIDGEif network.get('bridge_interface'): network_dict['bridge_interface'] = network['bridge_interface']if network.get('multi_host'): network_dict['multi_host'] = network['multi_host']return network_dict
在Flat DHCP模式下,运行nova-network的host作为虚拟节点的网关。每个集群需要运行一个nova-network。在nova-compute节点的conf文件中设置network-host,告诉nova-compute host nova-network在哪运行,以完成nova-compute与nova-network间的通信。nova-network将对数据库进行跟踪,通过DHCP正确配置的VM实例。通过设置iptables规则允许VM与外网进行通信,同时连接一个指定的metadata服务器来检索云中的信息。
Flat DHCP模式下,nova-compute主机不需要得到VM网络的IP地址便能启动VM,因为网桥将VM和network host放置在同一个逻辑网络中。在启动一个VM时,VM发送一个DHCP包,在network host的DHCP服务器上响应并为其分配一个IP地址。
使用libvirt驱动器时,环境设置如图2-12所示。
图2-12 使用libvirt驱动器的Flat DHCP网络
在设置flat_interface时需特别小心。如果指定一个有IP地址的接口,将出错;如果该接口是SSH连接使用的接口,将不能解决该问题,除非有ipmi/console权限。在Flat DHCP模式下,--network_size等于整个固定IP的数量。如果网络过大,在初始化时将花费较长时间(需在数据库中创建所有IP记录)。
如果在你的主机上有一个没有IP的未使用的接口,则可告诉Flat DHCP桥接到该接口(在配置文件中设定falt_interface=?)。nova-network主机会自动为网桥添加网关IP。也可手动添加interface到br100上,配置如下:
dhcpbridge_flagfile=/etc/nova/nova.confdhcpbridge=/usr/bin/nova-dhcpbridgenetwork_manager=nova.network.manager.FlatDHCPManagerfixed_range=10.0.0.0/8flat_network_dhcp_start=10.0.0.2flat_network_bridge=br100flat_interface=eth2flat_injected=Falsepublic_interface=eth0
对于任意Flat网络(Flat、Flat DHCP),运行nova-network的主机负责转发私有网络的通信,作为VM的默认网关。该主机需要有一个桥接口,用于与其他托管VM的主机进行会话。
当VM发送通信给互联网时,首先发送到默认网关(运行nova-network的主机),如图2-13所示。
图2-13 单适配器主机,第一次路由
下一步,运行nova-network的主机转发通信到互联网,如图2-14所示。
注意 如果使用单个接口,则接口需要设置为混杂模式才能正确转发通信。该情况在具有两个接口的物理主机上是不会发生的。
图2-14 单适配器主机,第二次路由
(3)VLAN模式
VLAN是nova-network默认的网络模式,此模式中,Nova为每个项目创建一个VLAN和网桥。对于多节点部署,VLAN网络模式要求支持打VLAN标签(IEEE802.1Q)的交换机。项目有一个私有IP的范围,这些私有IP仅可从VLAN内部访问。在该模式下,每个项目有独立的VLAN、Linux网桥和子网。Vlan中子网的网络创建命令如下:
nova-manage network create 10.0.0.0/8 3 16#创建3个网络,范围从10.0.0.0开始
VlanManager试图解决Flat管理器存在的两个缺陷:
1)缺乏可扩展性(在整个OpenStack集群中,Flat管理器依赖于单一的L2广播域)。
2)缺少正确的租户隔离机制(所有租户共享单一的IP池)。
该方式比较复杂,但是虚拟机之间的隔离也最好。使用方式简述如下。一个项目配置一个VLAN,启动一个DHCP服务器,属于该项目的虚拟机启动时在DHCP服务器处分配一个带有VLAN标签的fixed_ip。这样,这些具有相同VLAN标签的fixed_ip之间可以互相连通,不同VLAN标签的fixed_ip之间相互隔离。为了能够在外围访问VLAN虚拟机,在Nova环境中需要单独设置一个VPN虚拟机(cloudpipe),并为用户生成一个访问该VPN的证书和密钥。该虚拟机提供VPN服务,外网用户先用VPN登录,才能访问VLAN中其他虚拟机。
子网由网络管理员指定,并在项目请求时分配。DHCP服务器为每个VLAN中的VM实例分发指定子网中的IP地址。属于同一项目的所有实例被桥接到相同的VLAN上。Nova通过用户请求创建Linux网桥和VLAN。
注意 在默认的compute环境中,一旦销毁一个VM,需要花费一段时间将IP地址从被销毁的VM上撤离下来,以便之后分配给其他新instance。
如果设置force_dhcp_release=True,则在销毁一个VM时,Compute服务会发送一个DHCP release包,则分配给VM的IP地址立即被释放。该配置项用于Flat DHCP和VLAN模式。运用此选项需要运行dhcp_release服务,这需确保在所有nova-compute的主机上都运行了该服务。服务路径是/usr/bin/dhcp_release。
vlanManager中比较重要的函数如下:
def create_networks(self,context,**kwargs):
"""基于参数创建网络"""# 校验num_networks + vlan_start is not > 4094, fixes lp708025if kwargs['num_networks'] + kwargs['vlan_start'] > 4094: raise ValueError(_('The sum between the number of networks and' ' the vlan start cannot be greater' ' than 4094'))# 校验 num networks and network size fits in fixed_netfixed_net = netaddr.IPNetwork(kwargs['cidr'])if len(fixed_net) < kwargs['num_networks'] * kwargs['network_size']: raise ValueError(_('The network range is not big enough to fit ' '%(num_networks)s. Network size is %(network_size)s') % kwargs)#调用NetworkManager中的create_networks实现网络的创建工作return NetworkManager.create_networks(self, context, vpn=True, **kwargs)
Nova可将不同项目的VM设置在不同的子网中,每个子网具有不同的VLAN标签,当用户具有很大的IP空间时是非常有用的(大空间被划分为很多小的子网)。划分子网的目的是控制广播的范围。对多租户环境下划分附加的隔离层也是非常有用的。
注意 在VLAN模式中,网络和子网常常交换使用。一般情况下,提及的IP地址范围指的都是子网。
运行VLAN模式比其他两种模式都要复杂,特别之处如下:
·必须启用IP转发。
·运行nova-network和nova-compute的主机必须加载8021q内核模块。
·网络交换机必须支持打VLAN标签功能。
·在compute环境中必须指明特定的VLAN标签用于打VLAN标签。
·需要从网络管理员处获得一些必要的信息,用于正确配置Nova(如:netmask、broadcast、gateway、ethernet设备、VLAN ID)。
·该模式是Nova默认的网络模式,也可使用network_manager=nova.network.manager.VlanManager指明。
由网络管理员创建的网桥必须挂接vlan_interface指明的接口,默认使用eth0。fixed_range是用于描述整个IP空间的CIDR(无类型域间选路,Classless Inter-Domain Routing)块,该IP地址空间会被划分为多个子网。
network_size指明每个网络中默认的IP地址数量,该选项在网络创建时能被重写。使用nova-manage network create命令创建网络。下面是一个创建网络的示例:
nova-manage network create --label=example-net --fixed_range_v4=172.16.169.0/24 --vlan=169 --bridge=br169 --project_id=a421ae28356b4cc3a25e1429a0b02e98
创建的网络example-net被分配给租户a421ae28356b4cc3a25e1429a0b02e98。子网172.16.169.0/24的VLAN tag是169(可以任意指定,最好与地址的第三位相同)。该命令还会在运行nova-network服务的主机上创建一个网桥接口设备,名为br169,该设备会出现在ifconfig命令的输出内容中。
每个网络都与一个租户相关联。可在网络创建时指定该关联关系(使用-project_id)。使用Keystone tenant-list命令获取已创建的租户列表及相应的ID号。
代替手动指定VLAN、桥和项目ID,用户可一次创建多个网络,同时将Compute服务自动与租户的网络相关联,同时自动生成VLAN ID和桥接口名。下面的命令即为创建100个网络(从172.16.100.0/24到172.16.199.0/24):
nova-manage network create --num_networks=100 --fixed_range_v4=172.16.100.0/24
nova-manage network create命令支持很多配置选项,下面是该命令的-help信息:
Usage: nova-manage network create <args> [options]Options: -h, --help #显示帮助信息 --label=<label> Label for network (ex: public) --fixed_range_v4=<x.x.x.x/yy>IPv4 subnet (ex: 10.0.0.0/8) --num_networks=<number> Number of networks to create --network_size=<number> Number of IPs per network --vlan=<vlan id>vlan id --vpn=VPN_START vpn start --fixed_range_v6=FIXED_RANGE_V6 IPv6 subnet (ex: fe80::/64 --gateway_v6=GATEWAY_V6 ipv6 gateway --bridge=<bridge> VIFs on this network are connected to this bridge --bridge_interface=<bridge interface> the bridge is connected to this interface --multi_host=<'T'|'F'> Multi host --dns1=<DNS Address> First DNS --dns2=<DNS Address> Second DNS --uuid=<network uuid> Network UUID --project_id=<project id> Project id --priority=<number> Network interface priority
nova-mange network create命令中的flag能用来重写nova.conf中的环境设置:
--network_size#重写网络大小--bridge_interface #vlan_interface 配置项
Root用户可查看已创建的网络的列表:
nova-manage network list
其他网络命令如下:
·nova-manage network modify
·nova-manage network delete
在网络被删除之前必须将其从项目上撤离下来。创建网络时,会自动触发数据库,更新可用的固定IP地址表。可通过如下命令查看固定IP地址与实际VM的关联情况:
nova-manage fix list
如果用户想通过VPN访问实例,则需要创建一个特定的VPN(命名为cloudpipe)实例,该实例后面会详细阐述。
为使节点支持打VLAN标签功能,root用户需安装VLAN包,并装载8021q内核模块。
# apt-get install vlan# modprobe 8021q #该模块位于/lib/modules/2.6.31-28-server/kernel/net目录下 #为使该模块在启动时被加载,需在/etc/modules下添加一行:8021q
下面给出一个在VLAN模式运行nova-network的nova.conf的例子:
network_manager=nova.network.manager.VlanManagervlan_interface=eth0fixed_range=172.16.0.0/12network_size=256
一些情况下,Network Manager在停止时并不能正确地拆卸bridges和VLAN。此时如果重启Network Manager将会出错,检查错误日志文件会发现bridge设备已近存在。如果出现这种情况,用户需要手动拆卸bridge和VLAN设备,也可手动终止所有dnsmasq进程,命令如下:
# stop nova-network# vconfig rem vlan169#移出Vlan169# ip link set br169 down #关闭网桥br169# brctl delbr br169 #删除网桥br100# killall dnsmasq# start nova-network
3.各种网络类型间的区别
在Flat Managers模式下,管理员操作network的工作流程如下:
1)创建一个具有很多固定IP的网络(典型的是16-bitnetmask或更少),由所有租户共享。
Nova-manager network create –fixed_range_v4=10.0.0.0/16 –label=public
2)创建租户。
3)一旦租户启动实例,就会从共享的IP资源池主攻获取一个空闲的IP地址。
因此,典型的IP分配给实例的模式如下。
租户1:
租户2:
从图中可以看出,租户1和租户2位于相同的网络(10.0.0.0)中。
在VLAN Manager模式下,管理员的工作流程如下:
1)创建一个新的租户,并注意其ID号。
2)为新租户创建一个专用的固定IP网络。
nova-manager network create –fixed_range_v4=10.0.0.0/24 –vlan=101-–project_id=tenantID
3)在实例产生之前,会自动从租户的私有IP池中分配一个IP地址。
对比FlatDHCPManager,VLAN为网络定义了两点:
·将一个网络与指定的租户关联(--project_id=<tenanted>)。这使得没有其他租户可以访问到该IP池。
·为该网络设置一个独立的VLAN(--vlan=102)。
一旦一个租户SPAWN一个新的VM,它会自动从该专用池中获取一个地址。也会被放置到一个专用的VLAN中,该VLAN由OpenStack自动创建和维护。因此VLAN模式下,是为不同的租户创建不同的VLAN。
租户1:
租户2:
由上可以看出不同租户的实例位于不同的IP池中。
4.使用nova-network管理网络
(1)nova-network工作实现
首先是nova-network的服务启动流程,如图2-15所示。
在Flat DHCP网络模式下,启动虚拟机后的网络请求流程如下:
1)请求MAC地址和fixed_ip地址,fixed_ip是直接读取db获得的。
nova.compute.manager.run_instancenova.compute.manager._run_instance(...)nova.compute.manager._allocate_networknetwork_info=nova.compute.manager.network_api.allocate_for_instance:注:#network_api=network.API=nova.network.api.APInw_info = rpc.call(..allocate_for_instance…)#处理为实例分配网络资源的方法nova.network.manager.allocate_for_instance:networks = self._get_networks_for_instanceself._allocate_mac_addresses self.add_virtual_interface self._add_virtual_interface utils.generate_mac_address self._allocate_fixed_ips self.allocate_fixed_ip address = self.db.fixed_ip_associate 或address = self.db.fixed_ip_associate_pool
图2-15 nova-network的服务启动流程
2)nova-network中DHCP服务器维护IP地址与MAC地址的映射,并返回网络信息。
·lease_fixed_ip(self,context,address)当IP被租用时,由dhcp-bridge调用,该函数主要是更新数据库的操作。
·add_lease(mac,ip_address)使用DHCP服务器实现IP地址与MAC地址的关联。
·DHCP服务器发送一个cast消息。
·DHCP服务器创建一个新的连接,连接到VM。
·nova-network打包网络信息,并发送rpc消息返回给nova-compute。
3)网络连接好以后,DHCP服务器会周期性地调用odd_lease(mac,ip_address)方法维护映射关系。
4)创建floating_ip,网络首先解析收到的rpc消息,然后依次调用以下函数来分配一个动态IP。
nova.network.api.allocate_floating_ipnova.network.manager.allocate_floating_ip floating_ip = self.db.floating_ip_allocate_addressnova.db.api.floating_ip_allocate_addressIMPL.floating_ip_allocate_address=nova.db.sqlalchemy.api.floating_ip_allocate_address
5)为实例关联一个动态IP。
Nova-network收到一个get_instance_nw_info的rpc消息,对其进行解析,从解析出来的信息中为_get_dhcp_ip抓取信息量,nova-network解析associate_floating_ip的rpc消息。
在nova-network上执行以下命令:
sudo ip addr add 10.46.169.213 dev eth0#为nova.network.linux_net.apply方法抓取信息量iptables#为nova.network.linux_net.apply方法抓取文件lock "iptables"sudo iptables-save -t filtersudo iptables-restoresudo iptables-save -t natsudo iptables-restore
(2)使能ping和SSH
用户使用euca-authorize或nova-secgroup-add-rule来使能对VM的访问。在此之前需要开通VM的ping和SSH能力。
注意 如果与nova-api交互的凭据被放置在/root/.bashrc,则只有Root用户可以执行该操作。相应地,如果凭据被放置在某个用户的.bashrc,则必须是该用户运行此命令。
使用Nova命令行工具:
$ nova secgroup-add-rule default icmp -1 -1 -s 0.0.0.0/0$ nova secgroup-add-rule default tcp 21-21--s 0.0.0.0/0
使用euca2ools:
$ euca-authorize -P icmp -t -1:-1 -s 0.0.0.0/0 default$ euca-authorize -P tcp -p 21--s 0.0.0.0/0 default
如果在使用nova-secgroup-add-rule命令后,仍不能ping活SSH到VM,则查看nova-network节点启动的dnsmasq的数量,运行一个实例对应两个dnsmasg进程。如果不是该情况,则指定以下命令:
# killall dnsmasq# service nova-network restart
(3)配置公有(动态)IP地址
1)私有和公有IP地址。
每个虚拟实例会被自动分配一个私有IP地址,而公有IP对实例是可选的。OpenStack使用动态IP来表示可动态分配给虚拟实例的公有IP。Nova使用NAT(Network Address Translation)来为虚拟实例指派动态IP。
如果计划使用此功能,则需在nova.conf中增加以下数据,用来指定nova-network服务绑定公有IP到那个接口。
public_interface=vlan100
如果改变了nova.conf文件,需要重启nova-network服务。
2)创建一个可用的动态IP地址列表。
Nova维护一个动态IP地址列表,用来为实例分配动态IP。Root用户使用nova-manage floating create命令添加地址给该列表。例如:
# nova-manage floating create 10.46.169.224/29
下面是应用与动态IP的nova-manage命令:
nova-manage floating list #列出池中的所有floating IP addressesnova-manage floating create [cidr] #创建一个特定的floating IPs(一个单独的地址或一个子网)nova-manage floating delete [cidr] #使用与创建命令相同的参数删除floating IP地址
3)为实例关联动态IP。
为实例关联一个动态IP需要以下两步:
·nova floating-ip-create:在产品那个可用的地址列表中分配一个动态IP地址。
·nova add-floating-ip:给一个运行中实例添加一个被分配的动态IP地址。
下面给出一个动态IP(68.99.26.170)的操作示例。
$ nova floating-ip-create+-----------------+-------------+----------+------+|Ip | Instance Id | Fixed Ip | Pool |+-----------------+-------------+----------+------+| 68.99.26.170 | None| None ||+-----------------+-------------+----------+------+$ nova add-floating-ip 11-68.99.26.170
如果实例不再需要某个公有IP地址,则从实例上移出该动态IP地址,并释放该地址。
$ nova remove-floating-ip 11-68.99.26.170$ nova floating-ip-delete 68.99.26.170
4)自动添加动态IP。
nova-Network可以在实例启动时自动为其分配和关联动态IP地址,管理员仅需增加下面一行到nova.conf中,并重启nova-network即可。
auto_assign_floating_ip=True
注意 如果设置了该选项,则在所有动态IP被使用完后,再执行Nova boot命令会失败。
(4)移出项目的网络
通过简单的删除网络操作,是不能移出一个已分配给项目的网络的。管理员需要使用一个scrub命令将项目从网络中释放。
$ nova-manage project scrub projectname
(5)实例使用multinic
Multi-nic特征允许用户为实例增加多个接口,使以下应用场景可用成为可能:
·SSL配置
·服务容错/HA
·带宽分配
·实例接入
3种网络模式中multinic的用法如图2-16~图2-18所示。
图2-16 multinic扁平网络管理器
图2-17 multinic扁平网络DHCP管理器
每个VIF数据有单独的网络,每个网络模型针对multinic用法都有自己的改变。
首先创建一个新网络,并将其与项目关联。
$ nova-manage network create --fixed_range_v4=20.20.0.0/24 --num_networks=1 --network_size=256 --label=test --project=$your-project
图2-18 multinic VLAN管理器
用户每次产生一个新实例时,将会从各自的DHCP服务器获得两个IP地址。
$ nova list+-----+------------+--------+----------------------------------------+| ID | Name | Status |Networks|+-----+------------+--------+----------------------------------------+| 124 | Server 124 | ACTIVE | network2=20.20.0.3; private=20.10.0.14 |+-----+------------+--------+----------------------------------------+
注意 需要保证实例上的第二个接口上电,否则实例的第二个IP地址将不可用。设置实例的接口的示例如下:
/etc/network/interfaces# The loopback network interfaceauto loiface lo inet loopbackauto eth0iface eth0 inet dhcpauto eth1iface eth1 inet dhcp
5.网络的故障诊断
(1)不能连接到动态IP
如果使用动态IP地址不能连接到实例,首先要确认默认安全组允许ICMP(ping)和SSH(端口22),这样才能连接到虚拟机。
$ nova secgroup-list-rules default#或euca-describe-groups+-------------+-----------+---------+-----------+--------------+| IP Protocol | From Port | To Port | IP Range | Source Group |+-------------+-----------+---------+-----------+--------------+| icmp| -1| -1| 0.0.0.0/0 ||| tcp | 21- | 21- | 0.0.0.0/0 ||+-------------+-----------+---------+-----------+--------------+
确保NAT规则已经被添加到了nova-network主机的iptables中,Root用户运行以下命令:
# iptables -L -nv -A nova-network-OUTPUT -d 68.99.26.170/31--j DNAT --to-destination 10.0.0.3# iptables -L -nv -t nat-A nova-network-PREROUTING -d 68.99.26.170/31--j DNAT --to-destination10.0.0.3-A nova-network-floating-snat -s 10.0.0.3/31--j SNAT --to-source 68.99.26.170
核对公有地址(例子中是68.99.26.170)是否已经被成功地添加到了公有接口,使用如下命令查看:
$ ip addr2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000link/ether xx:xx:xx:17:4b:c1-brd ff:ff:ff:ff:ff:ffinet 13.22.194.80/24 brd 13.22.194.255 scope global eth0inet 68.99.26.170/31-scope global eth0inet6 fe80::82b:2bf:fe1:4b2/64 scope linkvalid_lft forever preferred_lft forever
值得注意的是:VM使用SSH通过公有IP连接自己时,是连不通的,因为路由配置不允许这样操作。
用户可使用tcpdump来确认包是否被路由到compute主机上的入站接口上。如果报被传送到了compute主机但是连接失败的话,问题可能是包被反向路径过滤器丢弃。需要关闭入站接口的反向路径过滤器,如果入站接口是eth2,Root用户可进行如下操作:
# sysctl -w net.ipv4.conf.eth2.rp_filter=0
如果该方法解决了你的问题,这在/etc/sysctl.conf中增加下面一行,这样反向路径过滤器在下次重启compute主机时就不会被启用。
net.ipv4.conf.rp_filter=0
(2)防火墙不工作
为了帮助调试VM的网络问题,在/etc/nova/nova.conf中进行如下设置,不启用防火墙。
firewall_driver=nova.virt.firewall.NoopFirewallDriver
一旦网络问题被解决,就应该重新启用防火墙。