nova-compute 部署 instance 详解 - 每天5分钟玩转 OpenStack(28)

本节讨论 nova-compute,并详细分析 instance 部署的全过程。
先给大家道个歉:今天这篇文章的篇幅比以往要多一些,本来想分两次发,但考虑到文章的完整和系统性,还是一次发了出来,这次可能要超出 5 分钟了,大家见谅。
nova-compute 在计算节点上运行,负责管理节点上的 instance。
OpenStack 对 instance 的操作,最后都是交给 nova-compute 来完成的。
nova-compute 与 Hypervisor 一起实现 OpenStack 对 instance 生命周期的管理。
通过 Driver 架构支持多种 Hypervisor
接着的问题是:现在市面上有这么多 Hypervisor,nova-compute 如何与它们配合呢?
这就是我们之前讨论过的 Driver 架构。
nova-compute 为这些 Hypervisor 定义了统一的接口,Hypervisor 只需要实现这些接口,就可以 Driver 的形式即插即用到 OpenStack 系统中。
下面是Nova Driver的架构示意图

我们可以在 /opt/stack/nova/nova/virt/ 目录下查看到 OpenStack 源代码中已经自带了上面这几个 Hypervisor 的 Driver

某个特定的计算节点上只会运行一种 Hypervisor,只需在该节点 nova-compute 的配置文件 /etc/nova/nova.conf 中配置所对应的 compute_driver 就可以了。
在我们的环境中因为是 KVM,所以配置的是 Libvirt 的 driver。

nova-compute 的功能可以分为两类:
定时向 OpenStack 报告计算节点的状态
实现 instance 生命周期的管理
下面我们依次介绍。
定期向 OpenStack 报告计算节点的状态
前面我们看到 nova-scheduler 的很多 Filter 是根据算节点的资源使用情况进行过滤的。
比如 RamFilter 要检查计算节点当前可以的内存量;CoreFilter 检查可用的 vCPU 数量;DiskFilter 则会检查可用的磁盘空间。
那这里有个问题:OpenStack 是如何得知每个计算节点的这些信息呢?
答案就是:nova-compute 会定期向 OpenStack 报告。
从 nova-compute 的日志 /opt/stack/logs/n-cpu.log 可以发现:
每隔一段时间,nova-compute 就会报告当前计算节点的资源使用情况和 nova-compute 服务状态。

如果我们再深入问一个问题:nova-compute 是如何获得当前计算节点的资源使用信息的?
给大家一分钟自己先思考一下?
好,揭晓答案。
要得到计算节点的资源使用详细情况,需要知道当前节点上所有 instance 的资源占用信息。
这些信息谁最清楚?
当然是 Hypervisor。
大家还记得之前我们讨论的 Nova Driver 架构吧,nova-compute 可以通过 Hypervisor 的 driver 拿到这些信息。
举例来说,在我们的实验环境下 Hypervisor 是 KVM,用的 Driver 是 LibvirtDriver。
LibvirtDriver 可以调用相关的 API 获得资源信息,这些 API 的作用相当于我们在 CLI 里执行 virsh nodeinfo、virsh dominfo 等命令。
实现 instance 生命周期的管理
OpenStack 对 instance 最主要的操作都是通过 nova-compute 实现的,包括 instance 的 launch、shutdown、reboot、suspend、resume、terminate、resize、migration、snapshot 等。
本小节重点学习 nova-compute 如何实现 instance launch(部署)操作,其它操作将会在后面的章节讨论。
当 nova-scheduler 选定了部署 instance 的计算节点后,会通过消息中间件 rabbitMQ 向选定的计算节点发出 launch instance 的命令。
该计算节点上运行的 nova-compute 收到消息后会执行 instance 创建操作。
日志 /opt/stack/logs/n-cpu.log 记录了整个操作过程。
nova-compute 创建 instance 的过程可以分为 4 步:
为 instance 准备资源
创建 instance 的镜像文件
创建 instance 的 XML 定义文件
创建虚拟网络并启动虚拟机
下面我们依次讨论每个步骤。
为 instance 准备资源
nova-compute 首先会根据指定的 flavor 依次为 instance 分配内存、磁盘空间和 vCPU。
可以在日志中看到这些细节

网络资源也会提前分配。

创建 instance 的镜像文件
资源准备好之后,nova-compute 会为 instance 创建镜像文件。
OpenStack 启动一个 instance 时,会选择一个 image,这个 image 由 Glance 管理。
nova-compute会:
首先将该 image 下载到计算节点
然后将其作为 backing file 创建 instance 的镜像文件。
从 Glance 下载 image
nova-compute 首先会检查 image 是否已经下载(比如之前已经创建过基于相同 image 的 instance)。如果没有,就从 Glance 下载 image 到本地。
由此可知,如果计算节点上要运行多个相同 image 的 instance,只会在启动第一个 instance 的时候从 Glance 下载 image,后面的 instance 启动速度就大大加快了。
日志如下:

可以看到
image(ID为 917d60ef-f663-4e2d-b85b-e4511bb56bc2)是 qcow2 格式,nova-compute 将其下载,然后通过 qemu-img 转换成 raw 格式。 转换的原因是下一步需要将其作为 instance 的镜像文件的 backing file,而 backing file不能是 qcow2 格式。
image 的存放目录是 /opt/stack/data/nova/instances/_base,这是由 /etc/nova/nova.conf 的下面两个配置选项决定的。
instances_path = /opt/stack/data/nova/instances
base_dir_name = _base
下载的 image 文件被命名为 60bba5916c6c90ed2ef7d3263de8f653111dd35f,这是 image id 的 SHA1 哈希值。
为 instance 创建镜像文件
有了 image 之后,instance 的镜像文件直接通过 qemu-img 命令创建,backing file 就是下载的 image。

这里 instance 的镜像文件位于 /opt/stack/data/nova/instances/f1e22596-6844-4d7a-84a3-e41e6d7618ef/disk,格式为 qcow2,其中 f1e22596-6844-4d7a-84a3-e41e6d7618ef 就是 instance 的 id。
可以通过 qemu-info 查看 disk 文件的属性

这里有两个容易搞混淆的术语,在此特别说明一下:
image,指的是 Glance 上保存的镜像,作为 instance 运行的模板。 计算节点将下载的 image 存放在 /opt/stack/data/nova/instances/_base 目录下。
镜像文件,指的是 instance 启动盘所对应的文件
二者的关系是:image 是镜像文件 的 backing file。image 不会变,而镜像文件会发生变化。比如安装新的软件后,镜像文件会变大。
因为英文中两者都叫 “image”,为避免混淆,我们用 “image” 和 “镜像文件” 作区分。
创建 instance 的 XML 定义文件

创建的 XML 文件会保存到该 instance 目录 /opt/stack/data/nova/instances/f1e22596-6844-4d7a-84a3-e41e6d7618ef,命名为 libvirt.xml
创建虚拟网络并启动 instance
接下来便是为 instance 创建虚拟网络设备

本环境用的是 linux-bridge 实现的虚拟网络,在 Neutron 章节我们会详细讨论 OpenStack 虚拟网络的不同实现方式。
一切就绪,接下来可以启动 instance 了。


至此,instance 已经成功启动。
OpenStack 图形界面和 KVM CLI 都可以查看到 instance 的运行状态。


在计算节点上,instance 并不是以 OpenStack上 的名字命名,而是用 instance-xxxxx 的格式。
哇,居然坚持看完了!
在下面给自己点个赞吧 :-)

nova-compute 部署 instance 详解 - 每天5分钟玩转 OpenStack(28)的更多相关文章
- Nova Suspend/Rescue 操作详解 - 每天5分钟玩转 OpenStack(35)
本节我们讨论 Suspend/Resume 和 Rescue/Unrescue 这两组操作. Suspend/Resume 有时需要长时间暂停 instance,可以通过 Suspend 操作将 in ...
- Start Instance 操作详解 - 每天5分钟玩转 OpenStack(31)
本节通过日志文件详细分析 instance start 操作. 下面是 start instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-compute 执 ...
- Terminate Instance 操作详解 - 每天5分钟玩转 OpenStack(33)
本节通过日志详细分析 Nova Terminate 操作. Terminate 操作就是删除 instance,下面是 terminate instance 的流程图 向 nova-api 发送请求 ...
- Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34)
本节通过日志详细分析 Nova Pause/Resume 操作. 有时需要短时间暂停 instance,可以通过 Pause 操作将 instance 的状态保存到宿主机的内存中.当需要恢复的时候,执 ...
- Snapshot Instance 操作详解 - 每天5分钟玩转 OpenStack(36)
本节我们通过日志详细讨论 instance 的 snapshot 操作. 有时候操作系统损坏得很严重,通过 Rescue 操作无法修复,那么我们就得考虑通过备份恢复了.当然前提是我们之前对instan ...
- Rebuild Instance 操作详解 - 每天5分钟玩转 OpenStack(37)
上一节我们讨论了 snapshot,snapshot 的一个重要作用是对 instance 做备份. 如果 instance 损坏了,可以通过 snapshot 恢复,这个恢复的操作就是 Rebuil ...
- Shelve Instance 操作详解 - 每天5分钟玩转 OpenStack(38)
Instance 被 Suspend 后虽然处于 Shut Down 状态,但 Hypervisor 依然在宿主机上为其预留了资源,以便在以后能够成功 Resume. 如果希望释放这些预留资源,可以使 ...
- Unshelve Instance 操作详解 - 每天5分钟玩转 OpenStack(39)
上一节我们 shelve instance 到 Glance,本节讨论如何通过 unshelve 操作恢复该 instance. 因为 Glance 中保存了 instance 的 image,uns ...
- Migrate Instance 操作详解 - 每天5分钟玩转 OpenStack(40)
Migrate 操作的作用是将 instance 从当前的计算节点迁移到其他节点上. Migrate 不要求源和目标节点必须共享存储,当然共享存储也是可以的. Migrate 前必须满足一个条件:计算 ...
随机推荐
- 解决ASP.NET Core Mvc文件上传限制问题
一.简介 在ASP.NET Core MVC中,文件上传的最大上传文件默认为20MB,如果我们想上传一些比较大的文件,就不知道怎么去设置了,没有了Web.Config我们应该如何下手呢? 二.设置上传 ...
- Windows下程序打包发布时的小技巧
一.背景 Windows下开发的应用程序在发布时,需要将其依赖的一些动态链接库一起打进安装包里面去.这个时候,快速确定这个程序到底依赖哪些动态链接库变得非常重要.很久以前写过一篇关于Qt程序安装包制作 ...
- ReSharper.8.0.14.856注册码
ReSharper.8.0.14.856注册码 用户名:ronle 注册码:ZoJzmeVBoAv9Sskw76emgksMMFiLn4NM 网络转载
- Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)
接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理. 还提到EntityFramework和Dapper,EntityFramework和Dapper是.net环境下 ...
- 圆形背景的TextView
[应用场景]: [需要的xml]:shape_circle.xml <?xml version="1.0" encoding="UTF-8"?>&l ...
- GJM :异步Socket [转载]
原帖地址:http://blog.csdn.net/awinye/article/details/537264 原文作者:Awinye 目录(?)[-] 转载请原作者联系 Overview of So ...
- GJM :C#开发 异步处理是目的,多线程是手段
但是BeginAccept和EndAccept不就是system.net.socket封装好的异步socket吗如果用多线程来实现的话那就不叫异步了吧 1.再次强调,异步是目的,多线程是手段. 所谓异 ...
- 原生HTML5 input type=file按钮UI自定义
原生<input type="file" name="file" />长得太丑 提升一下颜值 实现方案一.设置input[type=file]透明度 ...
- [原][C#][winForm]分级基金折溢价WinForm网络计算器
分级基金折溢价WinForm网络计算器 通过子/母基金代码,从 [ 东方财富网,天天基金网,新浪 ] 抓取分级基金的子母基金数据(代码,名称,净值,价格), 并计算出子基金(A基金,B基金)以及母基金 ...
- arcgis10.2.2桌面版具体的安装步骤过程
先声明一下,这里的截图虽说是ArcGIS10.1版本的,但是安装步骤是对的,本人用ArcGIS10.2.2软件测试成功安装上 一.ArcGIS许可证管理器安装 1.在软件包文件夹license man ...