what happened while start nova compute service

本文深入探讨了nova-compute启动过程中的关键步骤,包括init_host、pre_start_hook和post_start_hook的执行流程,详细解释了如何初始化hypervisor、更新可用资源及执行周期任务。

前面已经对nova创建instance和其他操作讲了不少,回到detail上,

在nova中,api,conductor,scheduler,compute都有对应的manager,在cmd包中启动各种service时,除了api是WSGI service,其他的都是Service,

更直接一点儿的话启动的是RPC的service,但这些服务中,compute的地位是不一样的,特别是启动时,做了很多工作,下面从细节上trace一下看看。

至于启动rpc service时候rpc server对应的target是什么,收到message处理的逻辑是什么,之前都讲过,主要看三个动作:

1. self.manager.init_host()

2. self.manager.pre_start_hook()

3. self.manager.post_start_hook()

对nova-compute来说这里manage自然是compute-manager,先看init_host:

        self.driver.init_host(host=self.host)

#self.driver默认情况为libvirt.LibvirtDriver,因此执行libvirt driver的init_host方法,其他的driver也需要执行对应的init_host, 传入的参数

host=self.host,host从nova.netconf中读出,在compute node则是读取配置文件中的host,而driver的init_host又执行了一大串动作:

initialize:注册driver的error handler,并将libvirt产生的event进行dispatch并处理,即不同的event对应不同的处理方式,比如连接失败之类的

_do_quality_warnings:连接libvirt driver得到cpu feature,分析cpu架构,若配置的virt type不是qemu或者kvm,或者cpu 的arch不是“arch.I686, arch.X86_64”,

给出警告的log

接下来对不同的virt type做不同的处理,若是lxc则判断容器是否有user/group 的namespace,若不是kvm则不进行kvm 加速,检查libvirt version的版本,不能

过低等。


        context = nova.context.get_admin_context()

#得到admin的context,user/project都是null,要的是admin context去objects里面做一些数据库的查询

        instances = objects.InstanceList.get_by_host(
            context, self.host, expected_attrs=['info_cache'])

#得到host中包含的instance list,如果是boot from image,只有临时数据,临时数据之类的都会存在coompute node上,boot from volume则存在volume所在处,

其临时数据?

        if CONF.defer_iptables_apply:
            self.driver.filter_defer_apply_on()

#执行firewall driver的filter_defer_apply_on, 对LibVirtDriver来说,默认的是IptablesFirewallDriver, 最终执行:

self.iptables.defer_apply_on(), self.iptables=linux_net.iptables_manager

只是将iptables_apply_deferred置为True,置为True之后,推迟使用当前iptable rule(当L3 driver使用linux_net作为backend时候,会调到

linux_net.metadata_forward(),应用防火墙规则,若这里defer了的话,就暂时不apply了)


        self.init_virt_events()
#若配置CONF.workarounds.handle_virt_lifecycle_events, 注册对virt driver的event listener

        try:
            # checking that instance was not already evacuated to other host
            self._destroy_evacuated_instances(context)

#这一段逻辑比较绕,先获得本机现有的所有instance(virt driver在本机获得),然后判断每个instance现在的host还是否是当前的host,如果不是,

但是instance的task state属于迁移/resize相关的状态,则不删除该instance; 如果设置CONF.workarounds.destroy_after_evacuate是False,警告,修改为True

之后重启方可;否则获得instance的网络/block device/共享存储,之后删除该instance

            for instance in instances:
                self._init_instance(context, instance)

#初始化所有的instance,这个判断的种类非常多, 很多种情况,针对不对情况,初始化虚机。

        finally:
            if CONF.defer_iptables_apply:
                self.driver.filter_defer_apply_off()
            self._update_scheduler_instance_info(context, instances)

#最后,应用iptables,并执行nova.scheduler.client.query.SchedulerQueryClient.update_instance_info,即通过scheduler去update instance(

对应HostManager中的_instance_info)信息



再来看看pre_start_hook:

只有一句:self.update_available_resource(nova.context.get_admin_context()),注意到这个方法是period_task,

想起ironic里面的period_task:@periodic_task.periodic_task(spacing=CONF.update_resources_interval)

compute_nodes_in_db = self._get_compute_nodes_in_db(context, use_slave=True)

#首先根据self.host拿到host中的所有compute_node(可能使用虚机做hypervisor?不然一个host如何多个compute node?),

nodenames = set(self.driver.get_available_nodes())

#拿到hypervisor对应的host name,然后根据host,driver,hostname对每个node得到一个resource tracker:

rt = self._get_resource_tracker(nodename)
rt.update_available_resource(context)

在resource tracker中,根据前面传入的driver,获得实际available resource(使用libvirt拿到一系列的值),这些数据包括vcpu,memory,local_gb,

vcpu_used等等,使用log记录(report),最重要的是执行_update_available_resource(注意前面有下划线),这里的最重要的步骤是:

_init_compute_node:

#如果compute不存在数据库中,就创建它,所以如果新加入的节点,经过一段时间或者重启nova-compute之后会自检测出来

主要更新的信息包括:

self.stats = importutils.import_object(CONF.compute_stats_class)
self.tracked_instances = {}
self.tracked_migrations = {}


最后看post_start_hook:

不是所有的manager都实现了,cellmanager实现了一些功能


内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
<think>嗯,用户这次问的是在OpenStack中创建nova计算服务的具体操作方法和常见问题排查。从用户提供的多个引用来看,ta应该正在部署OpenStack环境,可能遇到了服务创建失败或验证不通过的情况。用户引用的资料很有针对性,其中引用[1][2][3]都提到了完全相同的命令行操作,这说明ta已经掌握了基础命令,但不确定操作细节或遇到了报错。引用[4][5]则显示用户可能还需要后续的启动配置和架构理解。特别注意到用户提到"排查该命令的相关问题",这暗示实际执行时可能出现了意外状况。从技术角度看,创建计算服务的关键点有几个:首先是必须预先完成keystone的认证配置,这是引用[2]提到的先决条件;其次要注意命令行中"compute"这个服务类型名称是OpenStack的固定参数;最后创建后的端点注册容易被忽略。用户引用的资料里[1]恰好演示了完整的端点创建流程,这个细节很关键。用户可能隐藏的痛点是:当命令输出没有返回类似引用[3]的标准字段(如缺少ID值)时,如何判断服务是否创建成功?或者遇到认证失败的错误提示该如何处理?考虑到OpenStack部署的高失败率,应该重点强调环境检查和权限验证。值得补充但引用中未明确的是:1)如何通过openstackservicelist验证服务状态2)服务创建后的nova组件启动顺序3)可能出现的主机名解析问题。特别是引用[4]提到的自启动配置,对生产环境很重要但用户可能还没进行到这一步。最后要提醒用户注意命令输出的细微差异。比如引用[1]和[3]的输出格式略有不同(后者少了description字段),这可能是OpenStack版本差异导致的正常现象,避免用户误以为是错误。</think> 在OpenStack中创建名为`nova`的计算服务并排查相关问题,需按以下流程操作: --- ### 一、创建Nova计算服务 #### 1. **前置条件确认** - **Keystone认证就绪**:确保已加载管理员环境变量(如`admin-openrc`)[^2]: ```bash source admin-openrc.sh ``` - **用户与角色**:创建`nova`用户并赋予`admin`角色[^2]: ```bash openstack user create --domain default --password NOVA_PASS nova openstack role add --project service --user nova admin ``` #### 2. **创建计算服务实体** - 执行服务创建命令[^1][^2][^3]: ```bash openstack service create --name nova \ --description "OpenStack Compute" compute ``` - **成功输出示例**: ``` +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | OpenStack Compute | | enabled | True | | id | 83721cda2dd94e8bbfad43e34657a6da | | name | nova | | type | compute | +-------------+----------------------------------+ ``` #### 3. **注册API端点** > 端点需指向Nova-API服务的主机名/IP和端口(默认端口`8774/v2.1`)[^1][^4]。 ```bash # 创建Public端点 openstack endpoint create --region RegionOne \ compute public http://<控制器IP>:8774/v2.1 # 创建Internal端点 openstack endpoint create --region RegionOne \ compute internal http://<控制器IP>:8774/v2.1 # 创建Admin端点 openstack endpoint create --region RegionOne \ compute admin http://<控制器IP>:8774/v2.1 ``` --- ### 二、常见问题排查 #### ❌ 错误1:认证失败(HTTP 401) - **原因**:环境变量未加载或密码错误 - **解决**: ```bash # 重新加载认证信息 source admin-openrc.sh # 验证令牌有效性 openstack token issue ``` #### ❌ 错误2:服务类型`compute`不存在(HTTP 400) - **原因**:`compute`是固定服务类型,需确保拼写正确 - **解决**:检查命令末尾是否为**`compute`**(非`nova`): ```bash openstack service create --name nova compute # 正确 openstack service create --name nova nova # 错误 ``` #### ❌ 错误3:端口冲突(HTTP 503) - **原因**:Nova-API服务未启动或端口被占用 - **解决**: ```bash # 启动Nova服务 systemctl start openstack-nova-api # 检查端口监听 netstat -tnlp | grep 8774 ``` #### ❌ 错误4:端点注册失败 - **原因**:URL格式错误或Keystone未同步 - **解决**: - 确认URL包含协议(`http://`)和正确端口 - 重启Keystone服务: ```bash systemctl restart httpd ``` --- ### 三、服务验证 1. **检查服务列表**: ```bash openstack service list | grep nova ``` > 应显示`nova`服务状态为`Enabled`[^3]。 2. **验证端点**: ```bash openstack endpoint list | grep compute ``` > 确认`public`、`internal`、`admin`三类端点均存在。 3. **启动Nova组件**(部署后必做)[^4]: ```bash systemctl enable --now openstack-nova-{api,scheduler,conductor,novncproxy} ``` --- ### 关键架构原理 > Nova依赖其他服务协同工作[^5]: > - **Keystone**:身份认证 > - **Glance**:提供系统镜像 > - **Neutron**:网络管理 > - **Cinder**:块存储 > > ![](https://docs.openstack.org/nova/latest/_images/architecture.svg) > *Nova通过Driver调用Hypervisor(如KVM)实现虚拟机生命周期管理[^5]。* ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值