【openstack】【nova】nova 删除云主机流程及代码分析

Nova组件详解 一、Nova组件概述 Nova 负责管理 Openstack 中云主机实例的创建、删除、启动、停止等,位于 Openstack 架构的中心,其他服务和组件对它提供支持。 计算节点通过Nova Computer进行虚拟机创建,通过libvirt调用kvm创建虚拟机,nova之间通信通过rabbitMQ队列进行通信。 1、作用 Nova是OpenStack最核心的服务模块,负责管理和维护云计算环境... 阅读详情
正常情况下删除云主机的操作,主要采用如下两个方式:
1. is_local_delete = True 采用local_delete()
2. is_local_delete = False 采用compute_rpcapi.terminate_instance()
云主机在如下的状态下vm_statesvm_states.SHELVED, vm_states.SHELVED_OFFLOADED下,会采用其他方式。

当发生如下两种常见场景时,会采用上述的删除流程:
1)nova-compute已经down了一段时间,nova_api检测服务状态时(nova service-list),发现nova-compute已经down(但该节点的所有云主机进程还在)
2)nova api 检测服务状态时(nova service-list),发现nova-compute正常(但nova_compute服务可能正常,也可能down)。
检测方式:nova-compute每隔10s向数据库写入一次更新时间,nova-api检测时会根据该更新时间来作判断。当超过service_down_time=60s,则会认为nova-compute服务已经down

两种删除场景,会出现如下问题(后端都采用ceph存储):
第一种场景:当云主机是从cinder volume创建时,删除该云主机会存在系统盘残留。
原因:系统盘对应的rbd image被加锁

第二种场景:当nova_api检测时,发现compute是正常的,但是实际已经down了。
此时,删除云主机,会一直处于deleting状态,直达nova_compute正常时,才会正常删除

注释:ceph创建rbd时默认是不加锁的,只有当被使用时,才会对其加锁。第一种场景时,系统盘创建后会被attach到云主机,因此会被加锁。
正常情况下,硬盘挂载到云主机时,是不会加锁的,直到在云主机内将其mount

代码重点分析(liberty):
nova/compute/api.py
def _delete_instance(self, context, instance):
    self._delete(context, instance, 'delete', self._do_delete,
                 task_state=task_states.DELETING)
#####cb=self._do_delete(),instance_attrs= task_states.DELETING
def _delete(self, context, instance, delete_type, cb, **instance_attrs):
    if instance.disable_terminate:
        LOG.info(_LI('instance termination disabled'),
                 instance=instance)
        return
    bdms = objects.BlockDeviceMappingList.get_by_instance_uuid(
            context, instance.uuid)
    project_id, user_id = quotas_obj.ids_from_instance(context, instance)

    # At these states an instance has a snapshot associate.
    if instance.vm_state in (vm_states.SHELVED,
                             vm_states.SHELVED_OFFLOADED):
        snapshot_id = instance.system_metadata.get('shelved_image_id')
        LOG.info(_LI("Working on deleting snapshot %s "
                     "from shelved instance..."),
                 snapshot_id, instance=instance)
        try:
            self.image_api.delete(context, snapshot_id)
        except (exception.ImageNotFound,
                exception.ImageNotAuthorized) as exc:
            LOG.warning(_LW("Failed to delete snapshot "
                            "from shelved instance (%s)."),
                        exc.format_message(), instance=instance)
        except Exception:
            LOG.exception(_LE("Something wrong happened when trying to "
                              "delete snapshot from shelved instance."),
                          instance=instance)


    original_task_state = instance.task_state
    quotas = None
    try:
        # NOTE(maoy): no expected_task_state needs to be set
        instance.update(instance_attrs)
        instance.progress = 0

        instance.save()//写入数据库

        # NOTE(comstud): If we delete the instance locally, we'll
        # commit the reservations here.  Otherwise, the manager side
        # will commit or rollback the reservations based on success.
        quotas = self._create_reservations(context,
                                           instance,
                                           original_task_state,
                                           project_id, user_id)
        //配额管理
        if self.cell_type == 'api':
            # NOTE(comstud): If we're in the API cell, we need to
            # skip all remaining logic and just call the callback,
            # which will cause a cast to the child cell.  Also,
            # commit reservations here early until we have a better
            # way to deal with quotas with cells.
            cb(context, instance, bdms, reservations=None)
            quotas.commit()
            return
        shelved_offloaded = (instance.vm_state
                             == vm_states.SHELVED_OFFLOADED)
        if not instance.host and not shelved_offloaded:
            try:
                compute_utils.notify_about_instance_usage(
                        self.notifier, context, instance,
                        "%s.start" % delete_type)
                instance.destroy()
                compute_utils.notify_about_instance_usage(
                        self.notifier, context, instance,
                        "%s.end" % delete_type,
                        system_metadata=instance.system_metadata)
                quotas.commit()
                return
            except exception.ObjectActionError:
                instance.refresh()

        if instance.vm_state == vm_states.RESIZED:
            self._confirm_resize_on_deleting(context, instance)

        is_local_delete = True
        try:
            if not shelved_offloaded:
                service = objects.Service.get_by_compute_host(
                    context.elevated(), instance.host)
                is_local_delete = not self.servicegroup_api.service_is_up(
                    service)//检查服务状态
            if not is_local_delete:
                if original_task_state in (task_states.DELETING,
                                              task_states.SOFT_DELETING):
                    LOG.info(_LI('Instance is already in deleting state, '
                                 'ignoring this request'),
                             instance=instance)
                    quotas.rollback()
                    return
                self._record_action_start(context, instance,
                                          instance_actions.DELETE)

                # NOTE(snikitin): If instance's vm_state is 'soft-delete',
                # we should not count reservations here, because instance
                # in soft-delete vm_state have already had quotas
                # decremented. More details:
                # https://bugs.launchpad.net/nova/+bug/1333145
                if instance.vm_state == vm_states.SOFT_DELETED:
                    quotas.rollback()

                cb(context, instance, bdms,
                   reservations=quotas.reservations)//对应第二场景,具体方法:def _do_delete():
        except exception.ComputeHostNotFound:
            pass

        if is_local_delete:
            # If instance is in shelved_offloaded state or compute node
            # isn't up, delete instance from db and clean bdms info and
            # network info
            self._local_delete(context, instance, bdms, delete_type, cb)//对应第一种场景方法
            quotas.commit()


    except exception.InstanceNotFound:
        # NOTE(comstud): Race condition. Instance already gone.
        if quotas:
            quotas.rollback()
    except Exception:
        with excutils.save_and_reraise_exception():
            if quotas:
                quotas.rollback()
# 场景二:
 def _do_delete(self, context, instance, bdms, reservations=None,
                   local=False):
        if local:
            instance.vm_state = vm_states.DELETED
            instance.task_state = None
            instance.terminated_at = timeutils.utcnow()
            instance.save()
        else:
            self.compute_rpcapi.terminate_instance(context, instance, bdms,
                                                   reservations=reservations,
                                                   delete_type='delete')
##通过消息队列将请求转发到对应节点,然后调用driver(libvirt)删除云主机。


# 场景一:
    def _local_delete(self, context, instance, bdms, delete_type, cb):
        if instance.vm_state == vm_states.SHELVED_OFFLOADED:
            LOG.info(_LI("instance is in SHELVED_OFFLOADED state, cleanup"
                         " the instance's info from database."),
                     instance=instance)
        else:
            LOG.warning(_LW("instance's host %s is down, deleting from "
                            "database"), instance.host, instance=instance)
        if instance.info_cache is not None:
            instance.info_cache.delete()
        else:
            # NOTE(yoshimatsu): Avoid AttributeError if instance.info_cache
            # is None. When the root cause that instance.info_cache becomes
            # None is fixed, the log level should be reconsidered.
            LOG.warning(_LW("Info cache for instance could not be found. "
                            "Ignore."), instance=instance)
        compute_utils.notify_about_instance_usage(
            self.notifier, context, instance, "%s.start" % delete_type)

        elevated = context.elevated()
        if self.cell_type != 'api':
            # NOTE(liusheng): In nova-network multi_host scenario,deleting
            # network info of the instance may need instance['host'] as
            # destination host of RPC call. If instance in SHELVED_OFFLOADED
            # state, instance['host'] is None, here, use shelved_host as host
            # to deallocate network info and reset instance['host'] after that.
            # Here we shouldn't use instance.save(), because this will mislead
            # user who may think the instance's host has been changed, and
            # actually, the instance.host is always None.
            orig_host = instance.host
            try:
                if instance.vm_state == vm_states.SHELVED_OFFLOADED:
                    sysmeta = getattr(instance,
                                      obj_base.get_attrname('system_metadata'))
                    instance.host = sysmeta.get('shelved_host')
                self.network_api.deallocate_for_instance(elevated,
                                                         instance)
            finally:
                instance.host = orig_host

        # cleanup volumes
        for bdm in bdms:
            if bdm.is_volume:
                # NOTE(vish): We don't have access to correct volume
                #             connector info, so just pass a fake
                #             connector. This can be improved when we
                #             expose get_volume_connector to rpc.
                connector = {'ip': '127.0.0.1', 'initiator': 'iqn.fake'}
                try:
                    self.volume_api.terminate_connection(context,
                                                         bdm.volume_id,
                                                         connector)
                    self.volume_api.detach(elevated, bdm.volume_id)
                    if bdm.delete_on_termination:
                        self.volume_api.delete(context, bdm.volume_id)//删除系统盘,这里无法删除
                except Exception as exc:
                    err_str = _LW("Ignoring volume cleanup failure due to %s")
                    LOG.warn(err_str % exc, instance=instance)
            bdm.destroy()
        cb(context, instance, bdms, local=True)
        sys_meta = instance.system_metadata
        instance.destroy()
        compute_utils.notify_about_instance_usage(
            self.notifier, context, instance, "%s.end" % delete_type,
            system_metadata=sys_meta)
具体可以在删除的代码中解除锁定break_lock:
cinder/volume/drivers/rbd.py
    def delete_volume(self, volume):
        """Deletes a logical volume."""
        # NOTE(dosaboy): this was broken by commit cbe1d5f. Ensure names are
        #                utf-8 otherwise librbd will barf.
        volume_name = utils.convert_str(volume['name'])
       .......
  .......
            def _try_remove_volume(client, volume_name):
                with RBDVolumeProxy(self, volume_name) as volume:
                    locker_info = volume.list_lockers()
                    if locker_info:
                        LOG.debug(_("Unlock the rbd volume %s firstly."), volume_name)
                        locker_client, locker_cookie, locker_address = locker_info["lockers"][0]
                        volume.break_lock(client=locker_client, cookie=locker_cookie)
                self.RBDProxy().remove(client.ioctx, volume_name)

注释:虽然可以删除系统盘,但是当computer服务up后,相关的qemu-kvm进程会存在,但是nova-compute服务会周期性运行任务去cleanup此类instances。

之后会分析nova相关的定时任务

OpenStack之云主机管理 virsh是由Libvirt软件包提供的管理工具,它提供了对云主机的一系列管理功能,如对云主机的启动、删除、控制、监控等。云主机管理是OpenStack云计算平台的核心功能,通常,云主机的管理包括创建、删除、查询等。挂起时将云主机当前状态存放到磁盘中,并停用云主机。通过对云主机进项拍摄快照可以获得一个镜像,而这个镜像可以用来还原云主机或者创建新的云主机。利用前面获得的网络、实例类型、镜像的信息,创建名为“VM_host”的云主机。如果已存在的云主机出现了故障,可以通过重建操作还原云主机。 阅读详情

相关推荐

最全openstack部署教程

目前为止所用到的端口罗列在下面,可以供大家查询# 远程访问服务# 时间同步服务# 数据库服务# 消息队列服务# 分布式内存服务# 站点服务# 镜像服务# 计算服务# 网络服务# 存储服务# 编排服务对于OpenStack的食用就到此处了,还有计费,数据库啥的有时间的话我会在补上去的吧~~~

一枚小白的分享,不喜勿喷~ 1万+

openstack的使用——3. Nova服务的基本使用

本文基于 OpenStack All-in-One 环境,完整演示云主机全生命周期管理:自定义 Flavor、配置 VLAN 网络与子网、创建安全组并放行流量、上传 CirrOS 镜像、启动虚拟机,并实现在线 Resize 扩容。涵盖从资源规划到实例运维的关键操作,适用于 OpenStack 计算服务的实战学习与部署参考。

qq_40567491的博客 764

云平台OpenStack(先电) dashboard :nova(计算)服务

概述 计算服务(Nova) 表示云平台的工作负载的核心。如果有些云服务的工作中不包括计算,那么 它们充其量只 代表静态存储 ,所有动态活 动都会涉及一 些计算元素。OpenStackCompute 这个名称指的是一个特定的项目,该项目也被称为 Nova,OpenStack 的其他组件依托 Nova,与 Nova 协同工作,组成了整个 OpenStack 云平台。 功能 Nova,是 OpenStack 计算的弹性控制器。Nova 可以说是整个云平台最重要的组件,其 功能 包括 运行虚拟机实例,管理网络以及通

polar_night_down的博客 1377

Openstack删除虚拟机失败,状态变成ERROR,如何完成正常删除

在openstack平台批量删除了几台云主机,但删除过程因为消息队列故障导致cinder volume服务异常,有两台主机状态变为ERROR,无法正常删除。使用nova reset-state --active xxxx(uuid)将主机状态重置为active。cinder reset-state "卷ID"将卷状态重置为available状态。有时候实例删除成功,但挂载的磁盘可能会删不掉,状态一直为deleting。使用命令cinder delete "卷ID"将卷删除。

yujiajia111的专栏 857

OpenStack手动分布式部署Nova【Queens版】_openstack queen

nova组件是用来建虚拟机的(功能:负责响应虚拟机创建请求、调度、销毁云主机)(1).nova api service------安装在controller节点:接受和相应客户端发送的请求,nova-api负责接收和响应终端用户由管虚拟机和云硬盘的请求。就是说我想在openstack中创建个虚拟机(创建虚拟机最终在nova中完成),我发出的请求就被nova-api接收并发送到nova中去,然后在进行下一步具体操作,nova-api是整个nova的入口。

2401_84182073的博客 1080

机器学习-02 模型的评估与选择

2.1 误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异成为:误差(error)。定义: 在训练集上的误差称为训练误差(training error)或经验误差(empirical error)。 在测试集上的误差称为测试误差(test error)。 学习器在所有新样本上的误差称为泛化误差(generalization error)。 显然,我们希望得到的是在新样本上表现得很好的学习器,即泛化误差小的学习器。因此,我们应该让学习器尽可能地从训练集中学出普适性的“一般特征”,这

一个小白 1703

OpenStack运维篇:Nova组件概述及命令详解

OpenStack Nova是OpenStack的核心计算服务,负责云环境中计算资源的管理和维护。它通过虚拟化驱动与底层Hypervisor交互,实现虚拟机实例的生命周期管理。Nova最初由NASA贡献,经过多个版本迭代,已发展为OpenStack最成熟的项目之一。其架构包含Nova-Compute、Nova-API等模块,并与Keystone、Glance等服务集成。运维操作包括通过openstack命令创建flavor类型,定义云主机的资源配置(如内存、磁盘、CPU等)。

qq_62935472的博客 1340

大众奥迪诊断不求人:手把手解析SAE J2819(CAN TP2.0)协议报文与连接流程

本文深入解析大众奥迪车型诊断核心标准SAE J2819(CAN TP2.0)协议,详细拆解连接建立流程与报文控制字段。通过实战案例展示通道设置、参数协商等关键步骤,提供诊断设备配置建议和常见故障排查技巧,帮助工程师掌握汽车诊断通信协议的精髓。

weixin_30421809的博客 396

【OpenStack】源码级深入了解删除虚拟机操作

首先看一下虚拟机有多少种状态:(/nova/compute/vmstates.py) 1 ACTIVE = 'active' # VM is running 2 BUILDING = 'building' # VM only exists in DB 3 PAUSED = 'paused' 4 SUSPENDED = 'suspended' # VM is suspend...

weixin_34101229的博客 452

FUMA实战:5分钟搞定GWAS数据中的Independent SNPs和Lead SNPs筛选

本文详细介绍了如何使用FUMA平台快速筛选GWAS数据中的Independent SNPs和Lead SNPs。通过解析核心概念、分步实战演示和结果解读,帮助研究人员在5分钟内从海量显著关联位点中提炼出独立且具代表性的遗传信号,为后续功能注释和基因定位奠定高效基础。

weixin_29201859的博客 425

CentOS7 内核升级

可在http://ftp.sjtu.edu.cn/sites/elrepo.org/linux/kernel/el7/x86_64/RPMS选择对应架构平台不受影响的内核版本文件下载,然后离线安装,也可通过yum下载包后进行安装。通过 #uname -sr ,可以看到当前的内核版本 Linux 3.10.0-1160.el7.x86_64。首先找台能访问互联网的机器,通过联网的机器进行内核包下载。lt:longterm的缩写:长期维护版;ml:mainline的缩写:最新稳定版;

Jian Sun_的博客 601

openstack 常用命令回顾及总结

openstack 常用命令

流金岁月的专栏 9483

Linux云计算-Openstack

允许本机访问数据库。操作系统虚拟化,允许操作系统内核拥有彼此隔离和分割的多用户空间实例,这些用户空间实例,也称之为容器,基于linux内核中的namespace、chroot、cgroup实现隔离。web服务网关接口,类似于apache,接受外部请求,交给中间件,交给后端处理,在返回。第二种全虚拟化:硬件辅助全虚拟化,本身就是全虚拟服务不用转义的操作,把一个cpu虚拟成多个cpu,供客户使用。ovs-vsctl 主要是获取ovs-vswichd的配置信息,会更新ovsdb-server中的数据库。

weixin_71818241的博客 1274

[HQChart教程] 去掉“仅学习使用”文字提示的小技巧

最近用 HQChart 做图表时,发现左下角有“仅学习使用”的字样。这种水印虽然是默认的,但如果要展示给客户,可能会显得不够专业。还好,这个问题很好解决,只需要简单修改一下配置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 598

TC3XX - MCAL知识点(三十九):AURIX™ TC3xx 的EDSADC实现旋变解码功能(应用笔记记录)

本文总结了英飞凌应用笔记中关于EDSADC旋变解码系统的关键内容。系统通过调幅解调获取电机位置和速度信号,支持内外载波生成方案,其中内部载波方案更常用(需2个DSADC通道)。重点介绍了滤波器链配置建议(避免FIR1)、系统条件要求(如偶数积分周期)以及群延迟计算方法。特别分析了SDCAP功能对硬件延迟的补偿机制,指出温度等因素可能导致外部电路延迟变化,需通过计数器测量并通过软件调整积分器起始点来消除角度误差。文中还提供了不同硬件延迟情况下的信号处理示例。

梦想技术家 458

06_openstack之创建云主机和常见错误

部署openstack私有云环境:02_openstack私有云部署_桂安俊@kylinOS的博客-优快云博客创建项目和用户:03_openstack之项目及用户管理_桂安俊@kylinOS的博客-优快云博客创建镜像:04_openstack之Glance镜像和云主机类型_桂安俊@kylinOS的博客-优快云博客创建网络:05_openstack之Neutron网络管理_桂安俊@kylinOS的博客-优快云博客以下操作均基于上述环境可以普通用户user01登录管理界面,【计算】--->【云主机数量】

桂安俊@KylinOS 9797

【AUTOSAR SystemServices】AUTOSAR CP中Watchdog Manager模块技术解析

本文深入解析了AUTOSAR中的Watchdog Manager模块实现。该模块通过多层次监督机制(Alive/Deadline/Logical Supervision)确保系统安全运行,具备动态模式切换和分级故障处理能力。 关键实现包括: 数据结构设计:包含监督实体状态结构体(实时状态维护)、监督配置结构体(支持模式切换)和全局状态信息(系统级监控) 核心流程优化:初始化采用事务性设计,检查点处理通过条件编译优化,主监控循环采用流水线式并行处理 监督机制实现:Alive监督采用滑动窗口算法,Deadlin

1038

【五】OpenStack(M版)双节点搭建 之 Nova计算服务的安装与配置

部署Nova计算服务,OpenStack中云主机生命周期的所有活动都由Nova处理。

qq_45275452的博客 1250

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

如何删除 OpenStack Nova 僵尸实例

转自:http://www.vpsee.com/2011/11/how-to-delete-a-openstack-nova-zombie-instance/ 前天强制重启一台 OpenStack Nova 控制结点以后发现虚拟机消失,但是 euca-describe-instances 命令显示 instances 仍然是 running 的状态,使用 euca-terminate-...

apple2025262的博客 319

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

使用openstack以及扩充nova节点

openstack的管理员分为两种: 1、云服务商管理员(admin):负责为企业的用户提供一系列资源(项目)。 2、企业管理员:对云服务商提供的资源(项目)进行规划和分配,提供虚拟机。 项目:是一组隔离的对象和资源。企业管理员可以对项目进行具体的规划。 一、硬件配置操作: 1、创建项目:(提供统一的资源) 使用admin登录,身份管理-->项目-->创建项目。进行配额。 2、为项...

sda1_hacker的博客 953

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

云计算:OpenStack 配置云主机实例的存储挂载并实现外网互通

(2)virsh list --all命令查看KVM虚拟机。(2) bash命令进入第1个DHCP服务器查看。(3) bash命令进入第2个DHCP服务器查看。(4) bash命令进入第3个DHCP服务器查看。(5) bash命令进入第4个DHCP服务器查看。④ 查看br-ex桥的流表信息(重点关注序号)⑤查看br-int桥的流表信息(重点关注序号)(10)云主机cs_01控制台查看分区情况。(14)挂载(会弹出提示,并影响最终挂载)(1)nova list命令查看云主机。

cronaldo91的博客 3411

OpenStack平台Nova管理

1. 规划节点使用OpenStack平台节点规划2. 基础准备部署的OpenStack平台。

m0_73299799的博客 845

OpenStack入门

云计算是一种基于网络的超级计算模式,能够根据用户需求提供计算资源、存储资源、网络资源等。狭义云计算:通过网络按需向用户提供 IT 基础设施(硬件、平台、软件),用户视 “云” 中资源为无限,可横向扩展,如使用水电煤气般按需付费。广义云计算:指服务的交付和使用模式,通过网络以按需、易扩展方式获得所需服务,服务范围广泛。起源2010 年 7 月由 Rackspace 和美国国家航空航天局(NASA)共同发起。Rackspace 贡献存储源码(Swift),NASA 贡献计算源码(Nova)。定义。

YUNYINGXIA的博客 1370

openstack使用命令创建云主机

openstack各组件使用命令

weixin_68655162的博客 2617
上一篇: 【openstack】【cinder】Offload rbd’s copy_volume_to_image function from host to ceph cluster
下一篇: 网络零碎知识点整理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值