第 5 章 Nova - 028 - nova-compute 部署 instance 详解

2024-01-07 06:30

本文主要是介绍第 5 章 Nova - 028 - nova-compute 部署 instance 详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

nova-compute

 

nova-compute 在计算节点上运行,负责管理节点上的 instance。

OpenStack 对 instance 的操作,最后都是交给 nova-compute 来完成的。

nova-compute 与 Hypervisor 一起实现 OpenStack 对 instance 生命周期的管理。

 

通过 Driver 架构支持多种 Hypervisor

 

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。

compute_driver = libvirt.LibvirtDriver

 

nova-compute 的功能可以分为两类:

1、定时向 OpenStack 报告计算节点的状态

2、实现 instance 生命周期的管理

 

定期向 OpenStack 报告计算节点的状态

nova-scheduler 的很多 Filter 是根据算节点的资源使用情况进行过滤的。

比如 RamFilter 要检查计算节点当前可以的内存量;

CoreFilter 检查可用的 vCPU 数量;

DiskFilter 则会检查可用的磁盘空间。

 

nova-compute 会把计算节点的信息定期上报给 OpenStack 。

从 nova-compute 的日志 /opt/stack/logs/n-cpu.log 可以发现: 每隔一段时间,nova-compute 就会报告当前计算节点的资源使用情况和 nova-compute 服务状态。

 

nova-compute 可以通过 Hypervisor 的 driver 获取当前节点上所有 instance 的资源占用信息。

举例来说:

在实验环境下 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-scheduler 选定了部署 instance 的计算节点后,会通过消息中间件 rabbitMQ 向选定的计算节点发出 launch instance 的命令。

该计算节点上运行的 nova-compute 收到消息后会执行 instance 创建操作。

日志 /opt/stack/logs/n-cpu.log 记录了整个操作过程。

 

nova-compute 创建 instance 的过程可以分为 4 步:

1、为 instance 准备资源

2、创建 instance 的镜像文件

3、创建 instance 的 XML 定义文件

4、创建虚拟网络并启动虚拟机

 

1、为 instance 准备资源

nova-compute 首先会根据指定的 flavor 依次为 instance 分配内存、磁盘空间和 vCPU。

可以在日志中看到这些细节

 

网络资源也会提前分配。

 

 

2、创建 instance 的镜像文件

资源准备好之后,nova-compute 会为 instance 创建镜像文件。

OpenStack 启动一个 instance 时,会选择一个 image,这个 image 由 Glance 管理。 nova-compute会:

1、首先将该 image 下载到计算节点

2、然后将其作为 backing file 创建 instance 的镜像文件

 

从 Glance 下载 image

 

nova-compute 首先会检查 image 是否已经下载(比如之前已经创建过基于相同 image 的 instance)。

如果没有,就从 Glance 下载 image 到本地。

由此可知,如果计算节点上要运行多个相同 image 的 instance,只会在启动第一个 instance 的时候从 Glance 下载 image,后面的 instance 启动速度就大大加快了。

日志如下:

 

可以看到:

1、image(ID为 917d60ef-f663-4e2d-b85b-e4511bb56bc2)是 qcow2 格式,nova-compute 将其下载。

Nova 默认会通过 qemu-img 转换成 raw 格式,以提高 IO 性能。

2、image 的存放目录是 /opt/stack/data/nova/instances/_base,这是由 /etc/nova/nova.conf 的下面两个配置选项决定的。

instances_path = /opt/stack/data/nova/instances

base_dir_name = _base

3、下载的 image 文件被命名为 60bba5916c6c90ed2ef7d3263de8f653111dd35f,这是 image id 的 SHA1 哈希值。

 

 

3、为 instance 创建镜像文件

有了 image 之后,instance 的镜像文件直接通过 qemu-img 命令创建,backing file 就是下载的 image。

 

这里 instance 的镜像文件位于 /opt/stack/data/glance/images/7ad5f8e3-40bd-41d0-8393-da393a7b61ab,格式为 qcow2,其中 7ad5f8e3-40bd-41d0-8393-da393a7b61ab 就是 instance 的 id。

可以通过 qume-img info 查看 disk 文件的属性

 

 

这两个容易搞混淆:

1、image,指的是 Glance 上保存的镜像,作为 instance 运行的模板。

计算节点将下载的 image 存放在 /opt/stack/data/glance/images 目录下。

2、镜像文件,指的是 instance 启动盘所对应的文件

3、二者的关系是:image 是镜像文件 的 backing file。

image 不会变,而镜像文件会发生变化。

比如安装新的软件后,镜像文件会变大。

 

因为英文中两者都叫 “image”,为避免混淆,这里用 “image” 和 “镜像文件” 作区分。

 

 

3、创建 instance 的 XML 定义文件

 

创建的 XML 文件会保存到该 instance 目录 /opt/stack/data/nova/instances/f1e22596-6844-4d7a-84a3-e41e6d7618ef,命名为 libvirt.xml

 

 

4、创建虚拟网络并启动 instance

接下来便是为 instance 创建虚拟网络设备

 

linux-bridge 来实现的虚拟网络,一切就绪,接下来可以启动 instance 了。

 

至此,instance 已经成功启动。

OpenStack 图形界面和 KVM CLI 都可以查看到 instance 的运行状态。

 

 

在计算节点上,instance 并不是以 OpenStack上的名字命名,而是采用 instance-xxxxx 的格式。

 

----------------------------------------------引用来自--------------------------------------------------

https://www.cnblogs.com/CloudMan6/p/5451276.html

https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587838&idx=1&sn=d9086010c7c1b6d2cf7bb5668dae6e00&chksm=8d308167ba47087114eeeac94add3dc9f642501fd22975b57fb193c92bd0b303375a046fff37&scene=21#wechat_redirect

转载于:https://www.cnblogs.com/gsophy/p/11004414.html

这篇关于第 5 章 Nova - 028 - nova-compute 部署 instance 详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578998

相关文章

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是