如何删除 OpenStack Nova 僵尸实例

前天强制重启一台 OpenStack Nova 控制结点以后发现虚拟机消失,但是 euca-describe-instances 命令显示 instances 仍然是 running 的状态,使用 euca-terminate-instances 终止命令仍然无效,暂时把这样的 instance 称作“僵尸实例(zombie instance)”:

# virsh list
 Id Name                 State
----------------------------------

# euca-describe-instances 
RESERVATION	r-bkl83j20	bangcloud	default
INSTANCE	i-0000001d	ami-00000002	172.16.39.121	172.16.39.121	running	vpsee (vpseecloud, node00)	0			2011-11-10T12:45:12Z	nova	aki-00000001	ami-00000000
RESERVATION	r-j335q6ny	bangcloud	default
INSTANCE	i-0000001e	ami-00000002	172.16.39.122	172.16.39.122	running	vpsee (vpseecloud, node00)	0			2011-11-10T12:54:27Z	nova	aki-00000001	ami-00000000

# euca-terminate-instances i-0000001d
# euca-terminate-instances i-0000001e

删除 OpenStack Nova Volume 时遇到的 error_deleting 问题 这篇文章提到的解决办法一样,直接操作数据库来删除这2条僵尸实例的记录。登录 mysql,使用 nova 数据库,找出要删除 instance 的 id,然后删除:

# mysql -u root -p
Enter password:

mysql> use nova;

mysql> select * from instances;

mysql> delete from instances where id = '29';
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`nova`.`virtual_interfaces`, CONSTRAINT `virtual_interfaces_ibfk_1` FOREIGN KEY (`instance_id`) REFERENCES `instances` (`id`))

MySQL 删除 id 为 29 的 instance 时触发外键限制错误,简单的办法是暂时关闭外键检查,等删除后再打开:

mysql> SET FOREIGN_KEY_CHECKS=0;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from instances where id = '29';
Query OK, 1 row affected (0.04 sec)

mysql> delete from instances where id = '30';
Query OK, 1 row affected (0.04 sec)

mysql> SET FOREIGN_KEY_CHECKS=1;
Query OK, 0 rows affected (0.00 sec)

删除 instance 29 和 30后再用 euca-describe-instances 命令验证一下:

# euca-describe-instances

评论 (8 Comments)

  1. 很是详细!高手!

  2. 嗯.我也碰到过这种情况.也是去数据库中删除的。我想问一下大神你知道在FlatDHCP模式下compute节点有没有dnsmasq进程?
    我之前做过成功的FlatDHCP模式的多节点部署,后来我把nova升级到最新的E1版,发现的问题是在cloud controller上的节点启动后可以ping和ssh,而在compute节点上的instance不能够ping和ssh。后来我用vncviewer查看,发现了compute节点上的instance是没有分配到ip地址,而cloud controller上的instance都有分配到内网的10.0.0.0/28内的地址。
    我怀疑是dnsmasq的问题。因为我重启过compute节点之后ps -f|grep dnsmasq,发现是存在dnsmasq进程的,但这个进程监听的地址不是10.0.0.1开始的,所以我就把这个进程删掉了。
    但是这样做仍然不行..我也不知道是什么问题。

  3. 去virtual_interfaces表里把相对应的实例的记录删掉,然后在instances表里删除记录。如果只删除instances的记录。virtual_interfaces里会留下记录,万一以后生成了同样的id号的实例,不知道会不会有问题。

  4. @livemoon
    id 号是递增的,不会生成同样的 id 号,一般不会有问题。不过你说的很对,也应该把相互依赖的关系记录清理掉。

  5. juno: 跑instance的节点是应该有dnsmasq进程的,如果你启用了mutil_host的话,默认是监听本机br100的一个自动add的地址,至于这个地址是多少,你需要用ip addr看一下

  6. 多谢了,这个我之前在cactus没有记录下来,太悲剧了。
    这个我明白br100的网桥的自动创建,我的网桥是没有错的。
    之前在c版本的时候也是一样的创建方式,FlatDHCP是在计算节点上自动创建br100网桥的,而在我的部署中也是这样的。
    但我就是奇怪这个不能注入IP的原因..究竟新的版本修改了什么参数之类的吗?真搞不明白..现在还是四处问。好像其他人就没有这种情况

  7. @vpsee

    1、在控制节点上可以,计算节点上不可以ping和ssh控制节点上启动的instance;
    2、控制节点和计算节点上都不可以ping和ssh计算节点上的instance,是什么原因呢?
    第二个计算节点上的instance是在控制节点上显示为running,实际情况也不知道,现在关键是第一个情况。只给建立了10.0.0.0/24的一个网络,没有执行floating IP的操作,不知道是不是这里的原因?

  8. 參考來源:http://6.ptmc.org/316
    Remove failing VMs in OpenStack

    Occasionally OpenStack VMs fail to spawn or fail to terminate and cannot be removed from the VM list. Deleting the VM using the command line or web interface has no effect, they are stuck in the “spawning” or “deleting” state. To get rid of these zombie entries I remove them from the database using the following bash script (pass the machine UUID as parameter):

    #!/bin/bash
    mysql -uroot -ppassword << EOF
    use nova;
    DELETE a FROM nova.security_group_instance_association AS a INNER JOIN nova.instances AS b ON a.instance_id=b.id where b.uuid='$1';
    DELETE FROM nova.instance_info_caches WHERE instance_id='$1';
    DELETE FROM nova.instances WHERE uuid='$1';
    EOF

发表评论