在配置多网卡过程中,发现将多个网络配置在一个网桥上会出现网络不可用的现象,
例如在创建好以下两个网络之后:
nova network-create demo-net-1 --bridge br100 --multi-host T --fixed-range-v4 10.0.0.1/24
nova network-create demo-net-2 --bridge br100 --multi-host T --fixed-range-v4 10.1.0.1/24
在这种情况下创建好网络之后启动VM,VM会获得网络,但是对应的VM不能获取到IP,也不能上网
经过测试,只要将多个网络分别创建在不同的网卡上,这些网络就可以正常使用
由于OpenStack Dashboard在启动VM的时候,会默认将对应项目创建的所有网络都分配给虚拟机,因此不利于我们进行多网卡分配的测试,在这边建议使用命令形式或者是http请求的形式
接下来展示一下nova-network在FlatDHCP模型下给VM分配多网卡步骤:
- 步骤一:创建一个cirros镜像
-
glance image-create --name cirros-mirror --file { cirros-path } --disk-format raw --container-format bare --visibility public --progress
//这边属性visibility如果设置成private,那么其余的项目比如demo项目下的用户则无法使用该镜像
- 步骤二:
-
- 检查nova-network服务是否正常
- 检查nova net-list下所有的网络是否清除(如果是第一次做本测试,最好清空掉以前创建的网络)
- 检查所有nova-network节点上的/etc/nova/nova.conf配置文件
-
-
[DEFAULT]
dhcpbridge_flagfile=/etc/nova/nova.conf
dhcpbridge=/usr/bin/nova-dhcpbridge
logdir=/var/log/nova
state_path=/var/lib/nova
lock_path=/var/lock/nova
force_dhcp_release = True
libvirt_use_virtio_for_bridges=True
verbose = True
ec2_private_dns_show_ip=True
api_paste_config=/etc/nova/api-paste.ini
enabled_apis=ec2,osapi_compute,metadata
libvirt_inject_password=true
inject_key=true
inject_partition=-1
inject_password=true
#openstack 从H版本默认不再支持文件注入,推荐使用ConfigDrive或metadata服务。如果要继续使用, 需要配置inject_key=true,inject_partition,inject_password=true ,Config Drive的目的是,当nova实例启动后,可以mount一个元数据的文件系统,方便交换数据。
vnc_enabled = True
network_size = 254
send_arp_for_ha = True
share_dhcp_address = True
network_api_class = nova.network.api.API
public_interface = br0
flat_interface = eth1
network_manager = nova.network.manager.FlatDHCPManager
flat_network_bridge =
firewall_driver = nova.virt.libvirt.firewall.IptablesFirewallDriver
allow_same_net_traffic = False
multi_host = True
flat_injected = True
my_ip = 192.168.10.137
security_group_api = nova
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = 192.168.10.137
#network_manager = nova.network.manager.VlanManager
#firewall_driver = nova.virt.libvirt.firewall.IptablesFirewallDriver
#network_size = 254
#allow_same_net_traffic = False
#multi_host = True
#send_arp_for_ha = True
#share_dhcp_address = True
#force_dhcp_release = True
#vlan_interface = eth1
#vlan_start = 100
#public_interface = br0 -
#VLAN网络模型配置
auth_strategy = keystone
novncproxy_base_url = http://192.168.10.139:6080/vnc_auto.html
rpc_backend = rabbit
-
-
- 检查所有nova-network节点上的网桥是否清空,如果还存在如下现象建议使用ifconfig br100 down; brctl delbr br100清除。
- 步骤三: 使用nova network-create 创建两个网络net-1、net-2
- 步骤四:使用nova boot创建实例
-
nova --debug boot cirros-server-instance-2 --flavor 1 --image cirros-server --security-groups default --nic net-id=99c57696-ecce-4bfb-b3cc-dc13ce0d68ae
//net-id为所创建的net-1的id,也可以选择net-2的id,这个需要根据用户选择
//--debug是为了监控每次执行命令的时候是否报出异常信息等等,同时也可以看到调用了哪些http接口,这个参数对于所有的nova命令都适用
创建好之后,可以到dashboard看到如下显示,对应的网络IP已经分配给了VM
在通过控制台可以看到对应的hostname就是VM的名称,说明这个VM再启动的时候是以非常快的速度进行了cloud-init的程序执行,同时因为cloud-init需要网络支持,所以可以知道这时候网络是访问到外网了,此时登录也可以看到ip是分配成功的
- 步骤五:这个时候就需要通过手动为用户添加一个新的网络(当然可以添加同一个网络,会分配一个不同的IP)执行一下命令:
-
nova --debug add-fixed-ip 07ad9058-dfe8-4150-9cf7-d30594584aff f9ff28cd-57e0-4c8a-b8f9-9dac3ad8a2f1
//绿色的注释是对应的instance-id,红色的注释是想要添加给VM的网络id
- 步骤六:
这个时候,进入到VM中,通过修改/etc/network/interfaces文件,添加一个网卡的dhcp配置,这样之后,重启VM,会发现,这个网络虽然在OpenStack层面已经分配给VM 了,但是VM却不能使用!!!为什么呢?
这是因为,这个时候对应的VM的xml文件是没有配置上对应的网卡的,我们可以到这个VM对应的计算节点通过virsh edit来查看,只有一个网卡存在。
- 步骤七:
由于现在对应配置好的网卡虽然在OpenStack层面是分配成功了,但是却没有分配到真实的网络上面,这个时候其实主要可以通过两种方式来解决,一种是通过手动修改对应虚机的xml文件(这显然是行不通的,不允许绕过OpenStack做),另一种就是通过修改metadata的方式。
通过查阅,暂时提供的一种方式就是通过硬重启。事实上,在reboot一个instance的时候,这个instance的libvirt.xml(只考虑kvm环境)会重新从数据库中生成。
nova reboot --hard cirros-server-instance-2
问题:
由于cirros镜像本身的原因,硬重启之后会卡在cloud-init程序中,这不是OpenStack层面的原因,如果想要比较快速的测试,可以使用 ubuntu-trusty的镜像来实现。
通过硬重启生效的方式比较奇怪,但是为了网络生效感觉确实需要一定的干预,就算是直接通过元数据的修改生效,也感觉需要重启一次生效