Openstack 创建虚拟机多IP Bug

创建虚拟机
# nova boot –image e5599ed9-261d-4ce1-b992-72cc3fa689c0 –flavor 1 –nic net-id=4e6a4b1a-7dfb-40a2-8a6c-ff8b824f38cf test03

查看虚拟机却发现有2个IP
# nova list
+————————————–+——–+——–+————+————-+—————————–+
| ID | Name | Status | Task State | Power State | Networks |
+————————————–+——–+——–+————+————-+—————————–+
| 1cfb7191-849f-42ac-80df-4d568dbc2826 | test03 | ACTIVE | – | Running | private=10.0.0.7, 10.0.0.14 |
+————————————–+——–+——–+————+————-+—————————–+

尝试了多次之后,发现一个特点,这些虚拟机都是在同一个计算节点上ocata02上(我这里ocata02和ocata01节点,ocata01还是控制网络节点)
我这里ocata01节点是8CPU+16GB内存,ocata02节点4CPU+8GB内存,理论上我创建的虚拟机应该首先是在ocata01上,而不是在ocata02上。
那么这里可以推测:虚拟机创建首先调度的是ocata01,但是在ocata01上失败了,又重调度到ocata02,成功了。但每次调度都会请求分配IP,所以分配了2次。(这里应该存在bug,而且我在J版、M版、还有这次的O版都遇到了,唉,一个大Bug几年几版都不修复)


验证下自己的推测,分别在ocata01和ocata02上创建虚拟机看看
# nova boot –image e5599ed9-261d-4ce1-b992-72cc3fa689c0 –flavor 1 –nic net-id=4e6a4b1a-7dfb-40a2-8a6c-ff8b824f38cf –availability-zone nova:ocata01 test-ocata01
# nova boot –image e5599ed9-261d-4ce1-b992-72cc3fa689c0 –flavor 1 –nic net-id=4e6a4b1a-7dfb-40a2-8a6c-ff8b824f38cf –availability-zone nova:ocata02 test-ocata02
# nova list
+————————————–+————–+——–+————+————-+—————————–+
| ID | Name | Status | Task State | Power State | Networks |
+————————————–+————–+——–+————+————-+—————————–+
| 6a117b01-897d-44c9-ac05-a6f2a6406c92 | test-ocata01 | ERROR | – | NOSTATE | |
| 3ada201e-8bf5-41f9-9f63-99f07af0168a | test-ocata02 | ACTIVE | – | Running | private=10.0.0.15 |
| 1cfb7191-849f-42ac-80df-4d568dbc2826 | test03 | ACTIVE | – | Running | private=10.0.0.7, 10.0.0.14 |
+————————————–+————–+——–+————+————-+—————————–+
这里发生了一个有趣的现象:
1,在ocata01上创建的虚拟机报错了,没成功
2,在ocata02上创建的虚拟机成功了,而且只有1个ip,这是正常的
到这里可以证明我的推理是正确的。当然还的继续通过日志来看。

首先,在nova-api中确实发现test03即1cfb7191-849f-42ac-80df-4d568dbc2826这个虚拟机先在ocata01上创建网络,然后又在ocata02上创建网络,中间相差约10秒。
2017-07-13 11:37:56.984 5990 INFO nova.api.openstack.compute.server_external_events [req-dc9a785f-3f26-4daa-a0f2-78594ba6ce24 2f62e1dd069045128b2431d874c53cfe 4c6b442053284f12be85eda6c1ff
de4d – default default] Creating event network-changed:None for instance 1cfb7191-849f-42ac-80df-4d568dbc2826 on ocata01
….
2017-07-13 11:38:06.745 5984 INFO nova.api.openstack.compute.server_external_events [req-8c355dcd-9089-42b3-9b1e-f7c3fc9bade0 2f62e1dd069045128b2431d874c53cfe 4c6b442053284f12be85ed
a6c1ffde4d – default default] Creating event network-vif-plugged:68947fa9-db4b-4bec-b8d2-8e46ac3ea84c for instance 1cfb7191-849f-42ac-80df-4d568dbc2826 on ocata02


其次,为什么ocata01上创建不成功呢?在ocata01的nova-compte日志中,发现老多报错了
ERROR nova.virt.libvirt.guest [req-42e5aeb6-2720-4f8f-9b64-edafb0d4e4dc e42425d992e94131995130770984e6fb 52e0821dd4b04982949831684bf252e6 – – -] Error launchi
ng a defined domain with XML: <domain type=’qemu’>

ERROR nova.virt.libvirt.driver [req-42e5aeb6-2720-4f8f-9b64-edafb0d4e4dc e42425d992e94131995130770984e6fb 52e0821dd4b04982949831684bf252e6 – – -] [instance: 1
cfb7191-849f-42ac-80df-4d568dbc2826] Failed to start libvirt guest

ERROR nova.compute.manager [req-42e5aeb6-2720-4f8f-9b64-edafb0d4e4dc e42425d992e94131995130770984e6fb 52e0821dd4b04982949831684bf252e6 – – -] [instance: 1cfb7
191-849f-42ac-80df-4d568dbc2826] Instance failed to spawn

ERROR nova.compute.manager [instance: 1cfb7191-849f-42ac-80df-4d568dbc2826] libvirtError: internal error: qemu unexpectedly closed the monitor: 2017-07-13T03:
37:58.023029Z qemu-kvm: cannot set up guest memory ‘pc.ram’: Cannot allocate memory

ERROR nova.compute.manager [req-c3dc6ca6-c344-4fc8-8619-a3f94679c4e8 – – – – -] Error updating resources for node ocata01.

ERROR nova.compute.manager MessagingTimeout: Timed out waiting for a reply to message ID 368d8e188e7a481b8177c094e078e373


结合nova-api日志和nova-compte日志更加可以肯定我的推测了。

bug,我是没能力解决,也懒的google了,几年后的版本还存在这个问题,那么应该也不会搜出什么东西来。所以只能把ocata01的病治好,或者以后每次都创建指定到ocata02上(- -!)还是治疗ocata01为上策。

查看下libvirtd状态,大量的下面两行错误:
# systemctl status libvirtd
internal error: process exited while connecting to monitor: 2017-07-13T03:37:36.016833Z qemu-kvm: cannot set up guest memory ‘pc.ram…ocate memory
Unable to read from monitor: Connection reset by peer

既然日志很多条目都剑指libvirt,那么直接重启libvirt和nova-compute看看
# systemctl restart libvirtd
# systemctl restart openstack-nova-compute.service
再次在ocata01上创建虚拟机依旧不行!!

再回头看看上面的日志:qemu-kvm: cannot set up guest memory ‘pc.ram’: Cannot allocate memory

不能分配内存?赶紧看下ocata01上的内存:
[root@ocata01 ~(keystone_admin)]# free -m
total used free shared buff/cache available
Mem: 15886 14759 210 617 916 226
Swap: 0 0 0
ocata01节点还剩下210M的内存,而且是禁用swap的。而我的falvor需求的内存是512M。既然不满足内存需求,怎么还会调度到ocata01呢?

再看下ocata01上的nova的内存超分情况:
# grep ram_allocation_ratio /etc/nova/nova.conf
ram_allocation_ratio=1.5
因为这个1.5倍的超分比,所以nova调度的时候会认为ocata01任然有资源可用,但是实际却不行,这里也看出了超分的恶果

禁用超分
# sed -i ‘s/ram_allocation_ratio=1.5/ram_allocation_ratio=1/g’ /etc/nova/nova.conf
# systemctl restart openstack-nova-api

再次创建虚拟机,不指定节点
# nova boot –image e5599ed9-261d-4ce1-b992-72cc3fa689c0 –flavor 1 –nic net-id=4e6a4b1a-7dfb-40a2-8a6c-ff8b824f38cf test02

确认下已经正常,问题解决。
# nova list
+————————————–+—————+——–+————+————-+—————————–+
| ID | Name | Status | Task State | Power State | Networks |
+————————————–+—————+——–+————+————-+—————————–+
| 6a117b01-897d-44c9-ac05-a6f2a6406c92 | test-ocata01 | ERROR | – | NOSTATE | |
| 3ada201e-8bf5-41f9-9f63-99f07af0168a | test-ocata02 | ACTIVE | – | Running | private=10.0.0.15 |
| 59591ab8-fe54-4244-8a2e-80141012d644 | test02 | ACTIVE | – | Running | private=10.0.0.8 |
| 1cfb7191-849f-42ac-80df-4d568dbc2826 | test03 | ACTIVE | – | Running | private=10.0.0.7, 10.0.0.14 |
+————————————–+—————+——–+————+————-+—————————–+

后话:上面也算是临时办法,更实际的处理办法其实就是给ocata01加内存。

当然,最彻底的办法还是希望openstack修复了那个万恶的bug,即在发现ocata01上调度创建失败,重新调度去ocata02的时候,要把在ocata01上分配的那个port给清理掉啊。或者就是发现ocata01上调度分配的port没问题的话,那么调度到ocata02的时候就别再分配port啊。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值