OpenStack部署(五、nova)
- 一、Nova概述
-
- 1. nova计算服务
- 2. nova系统架构
- 3. nova概念架构
- 3. nova组件-API
- 4. nova组件-Scheduler
- 5. nova组件-Compute
- 6. nova组件-Conductor
- 7. nova组件-PlacementAPI
- 二、虚拟机实例化流程
- 三、nova部署架构
- 四、nova元数据
- 五、nova组件部署
-
- 1. 控制节点(c1)配置nova服务
-
- 1.1 创建数据库实例并授权
- 1.2 创建nova用户并配置compute-api端点
- 1.3 安装nova组件并修改配置文件
- 1.4 验证
- 2. 计算节点(c1、c2)配置nova服务
-
- 2.1 安装nova-compute组件并修改配置文件
- 2.2 开启nova-compute服务
- 3. 添加计算节点到控制节点
一、Nova概述
1. nova计算服务
- 计算服务是openstack最核心的服务之一,负责维护和管理云环境的计算资源,它在openstack项目中代号是nova。
- Nova自身并没有提供任何虚拟化能力,它提供计算服务,使用不同的虚拟化驱动来与底层支持的Hypervisor(虚拟机管理器)进行交互。所有的计算实例(虚拟服务器)由Nova进行生命周期的调度管理(启动、挂起、停止、删除等)
- Nova需要keystone、glance、neutron、cinder和swift等其他服务的支持,能与这些服务集成,实现如加密磁盘、裸金属计算实例等
2. nova系统架构
- Nova由多个服务器进程组成,每个进程执行不同的功能
- DB:用于数据存储的sqI数据库。
- API:用于接收HTTP请求、转换命令、通过消息队列或HTTP与其他组件通信的nova组件。Scheduler:用于决定哪台计算节点承载计算实例的nova调度器。
- Network:管理IP转发、网桥或虚拟局域网的nova网络组件。
- Compute:管理虚拟机管理器与虚拟机之间通信的nova计算组件。
激活Windows - Conductor:处理需要协调(构建虚拟机或调整虚拟机大小)的请求,或处理对象转换
3. nova概念架构
- 云平台用户在经过Keystone服务认证授权后,通过Horizon或者Reset API模式创建虚拟机服务,创建过程中包括利用Nova服务创建虚拟机实例,虚拟机实例采用Glance提供镜像服务,然后使用Neutron为新建的虚拟机分配lIP地址,并将其纳入虚拟网络中,之后在通过Cinder创建的卷为虚拟机挂载存储块,整个过程都在Ceilometer模块资源的监控下,Cinder产生的卷(Volume)和Glance提供的镜像(lmage)可以通过Swift的对象存储机制进行保存。
3. nova组件-API
- API是客户访问nova的http接口,它由nova-api服务实现,nova-api服务接收和响应来自最终用户的计算api请求。作为openstack对外服务的最主要接口, nova-api提供了一个集中的可以查询所有api的端点。
- 所有对nova的请求都首先由nova-api处理。API提供REST标准调用服务,便于与第三方系统集成。
- 最终用户不会直接改送RESTful API请求,而是通过openstack命令行、dashbord和其他需要跟nova交换的组件来使用这些API。
- 只要跟虚拟机生命周期相关的操作,nova-api都可以响应。
- Nova-api对接收到的HTTP API请求做以下处理:
- 1)检查客户端传入的参数是否合法有效
- 2)调用nova其他服务来处理客户端HTTP请求
- 3)格式化nova其他子服务返回结果并返回给客户端
- Nova-api是外部访问并使用nova提供的各种服务的唯一途径,也是客户端和nova之间的中间层。
4. nova组件-Scheduler
-
Scheduler可译为调度器,由nova-scheduler服务实现,主要解决的是如何选择在哪个计算节点上启动实例的问题。它可以应用多种规则,如果考虑内存使用率、cpu负载率、cpu构架(intellamd)等多种因素,根据一定的算法,确定虚拟机实例能够运行在哪一台计算服务器上。Nova-scheduler服务会从队列中接收一个虚拟机实例的请求,通过读取数据库的内容,从可用资源池中选择最合适的计算节点来创建新的虚拟机实例。
-
创建虚拟机实例时,用户会提出资源需求,如cpu.内存、磁盘各需要多少。Openstack将这些需求定义在实例类型中,用户只需指定使用哪个实例类型
-
Nova调度器的类型:
-
随机调度器(chance scheduler):从所有正常运行nova-compute服务的节点中随机选择。
-
过滤器调度器(filter scheduler):根据指定的过滤条件以及权重选择最佳的计算节点。Filter又称为筛选器
-
缓存调度器(caching scheduler):可看作随机调度器的一种特殊类型,在随机调度的基础上将主机资源信息缓存在本地内存中,然后通过后台的定时任务定时从数扼库中获取最新的主机资源信息。
-
过滤器调度器调度过程:
-
通过指定的过滤器选择满足条件的计算节点,比如内存使用率小于50%,可以使用多个过滤器依次进行过滤。
-
对过滤之后的主机列表进行权重计算并排序,选择最优的计算节点来创建虚拟机实例。
-
过滤器
-
当过滤调度器需要执行调度操作时,会让过滤器对计算节点进行判断,返回True或False。
-
scheduler_available_filters选项用于配置可用过滤器,默认是所有nova自带的过滤器都可以用于过滤作用
Scheduler_available_filters = nova.scheduler.filters.all_filters -
另外还有一个选项scheduler_default_filters用于指定nova-scheduler服务真正使用的过滤器,默认值如下Scheduler_default_filters = RetryFilters,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,lmagePropertiesFilter,ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter
-
RetryFilter(再审过滤器)
主要作用是过滤掉之前已经调度过的节点。如A、B、C都通过了过滤,A权重最大被选中执行操作,由于某种原因,操作在A上失败了。Nova-filter将重新执行过滤操作,那么此时A就被会RetryFilter直接排除,以免再次失败 -
AvailabilityZoneFilter (可用区域过滤器)
为提高容灾性并提供隔离服务,可以将计算节点划分到不同的可用区域中。Openstack默认有一个命名为nova的可用区域,所有的计算节点初始是放在nova区域中的。用户可以根据需要创建自己的一个可用区域。创建实例时,需要指定将实例部署在哪个可用区域中。Nova-scheduler执行过滤操作时,会使用AvailabilityZoneFilter不属于指定可用区域计算节点过滤掉 -
RamFilter(内存过滤器)
根据可用内存来调度虚拟机创建,将不能满足实例类型内存需求的计算节点过滤掉,但为了提高系统资源利用率,Openstack在计算节点的可用内存时允许超过实际内存大小,超过的程度是通过nova.conf配置文件中ram_allocation_ratio参数来控制的,默认值是1.5。
Vi /etc/nova/nova.conf
Ram_allocation_ratio=1.5 -
DiskFilter(硬盘调度器)
根据磁盘空间来调度虚拟机创建,将不能满足类型磁盘需求的计算节点过滤掉。磁盘同样允许超量,超量值可修改nova.conf中disk_allocation_ratio参数控制,默认值是1.0
Vi letc/nova/nova.conf
disk_allocation_ratio=1.0 -
CoreFilter(核心过滤器)
根据可用CPU核心来调度虚拟机创建,将不能满足实例类型vCPU需求的计算节点过滤掉。vCPU也允许超量,超量值是通过修改nova.conf中cpu_allocation_ratio参数控制,默认值是16。
Vi /etc/nova/nova.conf
cpu_allocation_ratio=16.0 -
ComputeFilter(计算过滤器)
保证只有nova-compute服务正常工作的计算节点才能被nova-scheduler调度,它是必选的过滤器。 -
ComputeCapablilitiesFilter(计算能力过滤器)
根据计算节点的特性来过滤 -
lmagePropertiesFilter(镜像属性过滤器)
根据所选镜像的属性来筛选匹配的计算节点。通过元数据来指定其属性。如希望镜像只运行在KVM的Hypervisor上,可以通过Hypervisor Type属性来指定。 -
ServerGroupAntiAffinityFilter(服务器组反亲和性过滤器)
要求尽量将实例分散部署到不同的节点上。例如有3个实例s1、s2、s3,3个计算节点A、B、C。具体操作如下:
创建一个anti-affinit策略的服务器组
openstack server group create -policy anti-affinity group-1
创建三个实例,将它们放入group-1服务器组
openstack server create -flavor m1.tiny -image cirros -hint group=group-1 s1openstack server create -flavor m1.tiny -image cirros -hint group=group-1 s2openstack server create -flavor m1.tiny -image cirros -hint group=group-1 s3
ServerGroupAffinityFilter(服务器组亲和性过滤器)
与反亲和性过滤器相反,此过滤器尽量将实例部署到同一个计算节点上
5. nova组件-Compute
-
Nova-compute在计算节点上运行,负责管理节点上的实例。通常一个主机运行一个Nova-compute服务,一个实例部署在哪个可用的主机上取决于调度算法。OpenStack对实例的操作,最后都是提交给Nova-compute来完成。
-
Nova-compute可分为两类,一类是定向openstack报告计算节点的状态,另一类是实现实例生命周期的管理。
-
通过Driver (驱动)架构支持多种Hypervisor虚拟机管理器
- 面对多种Hypervisor,nova-compute为这些Hypervisor定义统一的接口
- Hypervisor只需要实现这些接口,就可以Driver的形式即插即用到OpenStack系统中
-
定期向OpenStack报告计算节点的状态
- 每隔一段时间,nova-compute就会报告当前计算节点的资源使用情况和nova-compute服务状态。
- nova-compute是通过Hypervisor的驱动获取这些信息的。
-
实现虚拟机实例生命周期的管理
- OpenStack对虚拟机实例最主要的操作都是通过nova-compute实现的。创建、关闭、重启、挂起、恢复、中止、调整大小、迁移、快照
- 以实例创建为例来说明nova-compute的实现过程。
(1)为实例准备资源。
(2)创建实例的镜像文件。
(3)创建实例的XML定义文件。
(4)创建虚拟网络并启动虚拟机。
6. nova组件-Conductor
- 由nova-conductor模块实现!旨在为数据库的访问提供━层安全保障,[Nova-conductor作为nova-
compute服务与数据库之间交互的中介,避免了直接访问由nova-compute服务创建对接数据库。 - Nova-compute访问数据库的全部操作都改到nova-conductor中,nova-conductor作为对数据库操作的一个代理,而且neva-conductor是部署在控制节点上的。
- Nova-conductor有助于提高数据库的访问性能,nova-compute可以创建多个线程使用远程过程调用(RPC)访问nova-conductor。
- 在一个大规模的openstack部署环境里,管理员可以通过增加nova-conductor的料昙事应口益增长的计算节点对数据库的访问量。
7. nova组件-PlacementAPI
- 以前对资源的管理全部由计算节点承担,在统计资源使用情况时,只是简单的将所有计算节点的资源情况累加起来,但是系统中还存在外部资源,这些资源由外部系统提供。如ceph、n作等提供的存储资源等。面对多种多样的资源提供者,管理员需要统一的、简单的管理接口来统计系统中资源使用情况,这个接口就是PlacementAPl。
- PlacementAPI由nova-placement-api服务来实现,旨在追踪记录资源提供者的目录和资源使用情况。
- 被消费的资源类型是按类进行跟踪的。如计算节点类、共享存储池类、IP地址类等。
二、虚拟机实例化流程
-
用户可以通过多种方式访问虚拟机的控制台
-
Nova-novncproxy守护进程:通过vnc连接访问正在运行的实例提供一个代理,支持浏览器novnc客户端。
-
Nova-spicehtml5proxy守护进程:通过spice连接访问正在运行的实例提供一个代理,支持基于html5浏览器的客户端。
-
Nova-xvpvncproxy守护进程:通过vnc连接访问正在运行的实例提供一个代理,支持openstack专用的java客户端。
-
Nova-consoleauth守护进程:负责对访问虚拟机控制台提供用户令牌认证。这个服务必须与控制台代理程序共同使用。
-
控制台接口
-
首先用户(可以是OpenStack最终用户,也可以是其他程序))执行Nova Client提供的用于创建虚拟机的命令。
-
nova-api服务监听到来自于Nova Client的HTTP请求,并将这些请求转换为AMQP消息之后加入消息队列。
-
通过消息队列调用nova-conductor服务。
-
nova-conductor服务从消息队列中接收到虚拟机实例化请求消息后,进行一些准备工作。
-
nova-conductor服务通过消息队列告诉nova-scheduler服务去选择一个合适的计算节点来创建虚拟机,此时nova-scheduler会读取数据库的内容。
-
nova-conductor服务从nova-scheduler服务得到了合适的将计算节点的信息后,在通过消息队列来通知nova-compute服务实现虚拟机的创建。
三、nova部署架构
- nova的cell架构
- 当openstack nova集群的规模变大时,数据库和消息队列服务就会出现瓶颈问题。Nova为提高水平扩展及分布式、大规模的部署能力,同时又不增加数据库和消息中间件的复杂度,引入了Cell概念。
- Cell可译为单元。为支持更大规模的部署,openstack较大的nova集群分成小的单元,每个单元都有自己的消息队列和数据库,可以解决规模增大时引起的瓶颈问题。在Cell中,Keystone、Neutron、Cinder、Glance等资源是共享的
- API节点上的数据库
- nova_api数据库中存放全局信息,这些全局数据表是从nova库迁过来的,如flavor (实例模型)、instance groups(实例组). quota(配额)。
- nova_cell0数据库的模式与nova一样,主要用途就是当实例调度失败时,实例的信息不属于任何一个Cell,因而存放到nova_cell0数据库中。
四、nova元数据
- 元数据作用是通过向虚拟机实例注入元数据信息,实例启动时获得自己的元数据,实例中的cloud-init工具根据元数据完成个性化配置工作。
- openstack将cloud-init定制虚拟机实例配置时获取的元数据信息分成两大类:元数据(metadata)和用户数据(user data) 。
- 元数据指的是结构化数据,以键值对形式注入实例,包括实例自身的一些常用属性,如主机名、网络配置信息(IP地址和安全组)、SSH密钥等。
- 用户数据是非结构化数据,通过文件或脚本的方式进行注入,支持多种文件格式,如gzip、shell、cloud-init配置文件等,主要包括一些命令、脚本,比如shell脚本。
- openstack将元数据和用户数据的配置信息注入机制分为两种,一种是配置驱动器机制,另一种是元数据服务机制。
五、nova组件部署
ct(控制节点):192.168.117.80
?nova-api(nova主服务)
?nova-scheduler(nova调度服务)
?nova-condutor(nova数据库服务,提供数据库访问)
?nova-novncproxy(nova的vnc服务,提供实例的控制台)
c1(计算节点1):192.168.100.90
c2(计算节点2):192.168.100.100
nova-compute(nova计算服务)
1. 控制节点(c1)配置nova服务
ct(控制节点):192.168.117.80
1.1 创建数据库实例并授权
mysql -uroot -pcreate database nova_api;
grant all privileges on nova_api.* to 'nova'@'localhost' identified by 'nova_dbpass';
grant all privileges on nova_api.* to 'nova'@'%' identified by 'nova_dbpass';create database nova;
grant all privileges on nova.* to 'nova'@'localhost' identified by 'nova_dbpass';
grant all privileges on nova.* to 'nova'@'%' identified by 'nova_dbpass';create database nova_cell0;
grant all privileges on nova_cell0.* to 'nova'@'localhost' identified by 'nova_dbpass';
grant all privileges on nova_cell0.* to 'nova'@'%' identified by 'nova_dbpass';
flush privileges;
1.2 创建nova用户并配置compute-api端点
#创建nova用户
openstack user create --domain default --password nova_pass nova#向nova用户添加admin角色
openstack role add --project service --user nova admin#创建nova服务实体
openstack service create --name nova --description "OpenStack Compute" compute
openstack endpoint create --region RegionOne compute public http://ct:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://ct:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://ct:8774/v2.1
1.3 安装nova组件并修改配置文件
#安装openstack-nova组件
yum -y install openstack-nova-api openstack-nova-conductor openstack-nova-novncproxy openstack-nova-scheduler
cp -a /etc/nova/nova.conf{
,.bak}
grep -Ev '^$|#' /etc/nova/nova.conf.bak > /etc/nova/nova.confvim /etc/nova/nova.conf[DEFAULT]
enabled_apis = osapi_compute,metadata
my_ip = 192.168.100.80
use_neutron = true
firewall_driver = nova.virt.firewall.NoopFirewallDriver
transport_url = rabbit://openstack:RABBIT_PASS@ct[api]
auth_strategy = keystone[api_database]
connection = mysql+pymysql://nova:nova_dbpass@ct/nova_api[database]
connection = mysql+pymysql://nova:nova_dbpass@ct/nova[glance]
api_servers = http://ct:9292[keystone_authtoken]
auth_url = http://ct:5000/v3
memcached_servers = ct:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova_pass[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://ct:5000/v3
username = placement
password = placement_pass[vnc]
enabled = true
server_listen = '$my_ip'
server_proxyclient_address = '$my_ip'[placement_database]
connection = mysql+pymysql://placement:placement_dbpass@ct/placement
#初始化nova数据库,生成相关表结构
su -s /bin/sh -c "nova-manage api_db sync" nova
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
su -s /bin/sh -c "nova-manage db sync" nova
1.4 验证
#验证nova cell0和cell1是否正确注册
su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
#启动Nova服务并配置开机启动
systemctl start openstack-nova-api openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy
systemctl enable openstack-nova-api openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy
#检查nova服务是否启动
netstat -tnlup|egrep '8774|8775'
curl http://ct:8774
2. 计算节点(c1、c2)配置nova服务
c1(计算节点1):192.168.100.90
c2(计算节点2):192.168.100.100
2.1 安装nova-compute组件并修改配置文件
yum -y install openstack-nova-compute
cp -a /etc/nova/nova.conf{
,.bak}
grep -Ev '^$|#' /etc/nova/nova.conf.bak > /etc/nova/nova.confvim /etc/nova/nova.conf[DEFAULT]
enabled_apis = osapi_compute,metadata
my_ip = 192.168.100.90 #填本机IP地址
use_neutron = true
firewall_driver = nova.virt.firewall.NoopFirewallDriver
transport_url = rabbit://openstack:RABBIT_PASS@ct[api]
auth_strategy = keystone[glance]
api_servers = http://ct:9292[keystone_authtoken]
auth_url = http://ct:5000/v3
memcached_servers = ct:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova_pass[libvirt]
virt_type = qemu[oslo_concurrency]
lock_path = /var/lib/nova/tmp[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://ct:5000/v3
username = placement
password = placement_pass[vnc]
enabled = true
server_listen = 0.0.0.0
server_proxyclient_address = '$my_ip'
novncproxy_base_url http://ct:6080/vnc_auto.html
#判断计算机是否支持虚拟机硬件加速
egrep -c '(vmx|svm)' /proc/cpuinfo
2.2 开启nova-compute服务
#启动服务并设置开机自启
systemctl start libvirtd.service openstack-nova-compute.service
systemctl enable libvirtd.service openstack-nova-compute.service
3. 添加计算节点到控制节点
ct(控制节点):192.168.117.80
- 添加计算节点到 cell 数据库
openstack compute service list --service nova-compute
- 发现计算节点
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
#设置适当的发现时间间隔(可选操作)
vim /etc/nova/nova.conf
[scheduler]
discover_hosts_in_cells_interval = 300systemctl restart openstack-nova-api.service
- 验证计算服务
#列出服务组件以验证每个进程的成功启动和注册情况
openstack compute service list
#列出身份服务中的API端点以验证与身份服务的连接
openstack catalog list
#列出图像服务中的图像以验证与图像服务的连接性
openstack image list
#检查Cells和placement API是否正常运行
nova-status upgrade check