浅谈OpenStack T版服务组件--Nova计算服务(#^.^#)

Posted 可乐卷儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈OpenStack T版服务组件--Nova计算服务(#^.^#)相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


一、Nova简介

1、Nova的概念

  1. 算服务是openstack最核心的服务之一, 负责维护和管理云环境的计算资源(实例生命周期),它在openstack项目中代号是nova
  2. va自身并没有提供任何虚拟化能力,它提供计算服务,使用不同的虚拟化驱动来与底层支持的Hypervisor (虚拟机管理器)进行交互。所有的计算实例(虚拟服务器)由Nova进行生命周期的调度管理(启动、挂起、停止、删除等)
  3. Nova需要keystone、glance、 neutron、 cinder和swift等其他服务的支持, 能与这些服务集成,实现如加密磁盘、裸金属计算实例等(也是nova的一大特性)

2、Nova系统架构

架构组成特性
DB用于数据存储的sql数据库
API用于接收HTTP请求、转换命令、通过消息队列(相对于nova组件本身对内)或HTTP(对外)与其他组件通信的nova组件。
Scheduler用于决定哪台计算节点承载计算实例的nova调度器
Network管理IP转发、网桥或虚拟局域网的nova网络组件
Compute管理虚拟机管理器与虚拟机之间通信的nova计算组件
Conductor处理需要协调(构建虚拟机或调整虚拟机大小)的请求,或者处理对象转换

二、Nova组件详解

1、Nova–API

API是在客户端创建实例时,只需要知道实例成功与否和一个简要的信息

  1. API是客户访问nova的http接口,它由nova-api服务实现,nova-api服务接收和响应来自最终用户的计算api请求。作为openstack对外服务的最主要接口,nova-api提供了一个集中的可以查询所有api
    的端点。
  2. 所有对nova的请求都首先由nova-api处理。API提供REST标准调用服务,便于与第三方系统集成。
  3. 最终用户不会直接改送RESTful API请求,而是通openstack命令行、dashbord和其他需要跟nova交换的组件来使用这些API。
  4. :只要跟虚拟机生命周期相关的操作,nova-api都可以响应,
  5. Nova-api对接收到的HTTP API请求做以下处理:
    1):检查客户端传入的参数是否合法有效,(请求进入时)
    2):调用nova其他服务来处理客户端HTTP请求,(分发任务时)
    3):格式化nova其他子服务返回结果并返回给客户端,(返回请求时)
  6. Nova-api是外部访问并使用nova提供的各种服务的唯一途径,也是客户端和nova之间的中间层

2、Nova–Scheduler调度器

scheduler的目的:选择最适合启动实例的计算节点

1、概念

控制台(horizon)创建虚拟机,API通过conductor协调分发,任务交给scheduler,scheduler需要先确定虚拟机如何创建

  1. Scheduler可译为调度器,由nova-scheduler服务实现,主要解决的是如何选择在哪个计算节点上启动实例的问题。它可以应用多种规则,如果考虑内存使用率、cpu负载率、 cpu构架(intel/amd) 等多种因素,根据一定的算法,确定虚拟机实例能够运行在哪一台计算服务器上。Nova-scheduler服务会从队列中接收一个虚拟机实例的请求,通过读取数据库的内容,从可用资源池中选择最合适的计算节点来创建新的虚拟机实例。

  2. 创建虚拟机实例时,用户会提出资源需求,如cpu,内存、磁盘各需要多少。Openstack将这些需求定义在实例类型中,用户只需指定使用哪个实例类型就可以了

举例说明:
需求:1、磁盘>= 40G
上图所示,首先过滤预选,排除掉node_03,再结合cpu的使用率,得出node_01是最优选择
scheduler的工作流程
首先跟DB数据库对接:
数据库中维护了后端计算节点的资源清单/信息
其次scheduler 预选:过滤
先把不符合的计算节点(此处是不合法磁盘>= 40G)剔除在外
最后scheduler 优选:打分
在预选之后,再对剩余的计算节点资源进行函数+权重值的运算得出一个分数,分数越高,越适合创建实例

2、调度器的类型

①:随机调度器(chance scheduler) :从所有正常运行nova-compute服务的节点中随机选择。
②:过滤器调度器(filter scheduler) :根据指定的过滤条件以及权重选择最佳的计算节点。Filter又称为筛选器
③:缓存调度器(caching scheduler):可看作随机调度器的中特殊类型,在随机调度的基础上将主机资源信息缓存在本地内存中,然后通过后台的定时任务定时从数据库中获取最新的主机资源信息。

简述工作流程:
scheduler接收到任务的时候
先通过DB数据库中查询后端计算节点的资源信息,通过指定/未指定选择计算节点
若已指定host,直接发请求至制定compute node
若未指定host,需要通过DB数据库(数据库的信息可以和后端资源信息可以接近实时同步)获取后端资源信息,需要经过过滤和权重的计算打分,确定最适合创建实例的节点

为了让让scheduler调度时参照的节点数据是接近实时的,主要由以下三点:
1、由compute会把节点信息汇报到数据库内,但是不是完全的实时汇报,有间隔时间
2、libvirt接近实时,通过libvirt收集宿主机资源
3、缓存在scheduler所在的服务器上,还会周期性同步信息给DB

3、过滤器调度器调度过程

主要分二个阶段

  1. 通过指定的过滤器选择满足条件的计算节点,比如内存使用率小于50%,可以使用多个过滤器依次进行过滤
  2. 对过滤之后的主机列表进行权重计算并排序,选择最优的计算节点来创建虚拟机实例

3.1、过滤器

  • 当过滤调度器需要执行调度操作时, 会让过滤器对计算节点进行判断,返回True或False。
    /etc/nova/nova.conf配置文件中
  • 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, ImagePropertiesFilter,
    ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter

3.2、过渡器类型

过滤调度器将按照列表中的顺序依次过滤

  • 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 /etc/nova/nova.conf
      disk_allocation_ratio=1.0
  • CoreFilter(核心过滤器)
    • 根据可用CPU核心来调度虚拟机创建,将不能满足实例类型vCPU需求的计算节点过滤掉。vCPU也允许超量,超量值是通过修改nova.con中cpu_allocatin_ratio参数控制,默认值是16。
      Vi /etc/nova/nova.conf
      cpu_allocation_ratio=16.0
  • ComputeFilter(计算过滤器)
    • 保证只有nova-compute服务正常工作的计算节点才能被nova-scheduler调度,它是必选的过滤器。
  • ComputeCapablilitiesFilter (计算能力过滤器)
    • 根据计算节点的特性来过滤,如x86_ 64和ARM架构的不同节点,要将实例根据不同的节点类型进行分配
  • ImagePropertiesFilter(镜像属性过滤器)
    • 根据所选镜像的属性来筛选匹配的计算节点。通过元数据来指定其属性。如希望镜像只运行在KVM的Hyperisor上,可以通过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 s1
      openstack server create -flavor m1.tiny -image cirros -hint group=group-1 s2
      openstack server create -flavor m1.tiny -image cirros -hint group=group-1 s3
  • ServerGroupAffinityFilter(服务器组亲和性过滤器)
    • 与反亲和性过滤器相反,此过滤器尽量将实例部署到同一个计算节点上

3、Nova–Compute

  • 定期向OpenStack报告计算节点的状态
    • 每隔一段时间,nova-compute就会报告当前计算节点的资源使用情况和nova-compute
      服务状态。
    • nova-compute是通过Hypervisor的驱动获取这些信息的。
  • 实现虚拟机实例生命周期的管理
    • OpenStack对虚拟机实例最主要的操作都是通过nova-compute实现的。
      创建、关闭、重启、挂起、恢复、中止、调整大小、迁移、快照
    • 以实例创建为例来说明nova-compute的实现过程(compute执行的顺序)
      • 为实例准备资源。
      • 创建实例的镜像文件。
      • 创建实例的XML定义文件。
      • 创建虚拟网络并启动虚拟机。

4、Nova–Conductor

由nova-conductor模块实现旨在为数据库的访问提供一层安全保障。Nova-conductor作为nova-compute服务与数据库之间交互的中介,避免了直接访问由nova-compute服务创建对接数据库。
Nova-compute访问数据库的全部操作都改到nova-conductor中,nova- conductor作为对数据库操作的一个代理,而且nova-conductor是部署在控制节点上的。
Nova-conductor有助于提高数据库的访问性能,nova-compute可以创建多个线程使用远程过程调用(RPC)访问nova-conductor.
在一个大规模的openstack部署环境里,管理员可以通过增加nova-conductor的数量来应付日益增长的计算节点对数据库的访问量

5、Nova-PlacementAPl

  • 以前对资源的管理全部由计算节点承担,在统计资源使用情况时,只是简单的将所有计算节点的资源情况累加起来,但是系统中还存在外部资源,这些资源由外部系统提供。如ceph, nfs等提供的存储资源等。面对多种多样的资源提供者,管理员需要统一的、简单的管理接口来统计系统中资源使用情况,这个接口就是PlacementAPl
  • PlacementAPI由nova-placement-api服务来实现,旨在追踪记录资源提供者的目录和资源使用情况
  • 被消费的资源类型是按类进行跟踪的。如计算节点类、共享存储池类、IP地址类等

6、控制台接口

  • 首先用户(可以是OpenStack最终用户,也可以是其他程序)执行Nova Client提供的用于创建虚拟机的命令。
  • nova-api服务监听到来自于Nova Client的HTTP请求,并将这些请求转换为AMQP消息之后加入消息队列。
  • 通过消息队列调用nova-conductor服务。
  • nova-conductor服务从消息队列中接收到虚拟机实例化请求消息后,进行一些准备工作。
  • nova-conductor服务通过消息队列告诉nova-scheduler服务去选择-个合适的计算节点来创建虚拟机,此时nova-scheduler会读取数据库的内容。
  • nova-conductor服务从nova-scheduler服务得到了合适的将计算节点的信息后,在通过消息队列来通知nova-com ute服务实现虚拟机的创建。

三、Nova部署架构

1、经典部署架构

  1. Nova经典部署模式:一个控制节点

  2. Nova负载均衡部署模式:多个控制节点

2、Cell架构

  1. 架构背景
    当openstack nova集群的规模变大时,数据库和消息队列服务就会出现瓶颈问题。Nova为提高水平扩展及分布式、大规模的部署能力,同时又不增加数据库和消息中间件的复杂度,引入了CelI概念
  2. cell的概念
    Cell可译为单元。为支持更大规模的部署,openstack较大的nova集群分成小的单元,每个单元都有自己的消息队列和数据库,可以解决规模增大时引起的瓶颈问题。在Cell中,Keystone、Neutron、 Cinder、Glance等资源是共享的

3、需要扩展的对象

  • DB数据库:接收全部的读和写,compute汇报节点的压力
  • conductor:承受来源于compute的压力,compute是多线程的
  • rabbitmq:通过负载均衡部署架构图来看,三个控制节点+三个计算节点均通过rabbitmq传递

举例说明:
创建虚拟机请求id=1—>DB数据库中记录创建实例A的请求,id=1—>nova的conductor向compute发送指令,让compute具体去创建实例–>compute找scheduler适合创建实例的节点,比如说Schuster告知node1适合创建实例—>node1在cell_01内,conductor把创建虚拟机的请求交给cell_01处理—>cell_01管理node1上的compute之后,会把具体的信息写入自己的数据库中----》再把结果返回给conductor—>conductor返回请求结果更新之后的数据到DB数据库中

4、Nova结合Cell架构

  1. 结合单cell架构

过程如下:
nova-api接收请求给到nova-conductor---->nova-conductor把任务请求信息和概览信息放入API数据库中,同时对接scheduler确定计算节点 ,创建资源-----找到对应的cell单元处理任务
conductor借由消息队列将创建虚拟机的任务交给cell数据库中的rabbitmq----找到cell内部的conductor组件—conductor调度具体的请求任务交给compute处理–compute处理好了之后任务返回conductor并把信息维护在cell数据库中—cell处理完成之后通过cell的rabbitma传给nova的消息队列-----nova的消息队列传给conductor—>nova-conductor会完善cell处理的结果“任务A id=1交给cell_01单元处理”并记录到API数据库,同时通知API任务完成和结果内容
API想要获取数据之后从API的数据库获取,完整信息在nova接收之后会做一个简单的格式化管理并返回给客户端

  1. 结合多cell架构
    与单cell架构是类似的,无法就是多了几个cell架构部分的内容,有更多的计算节点和compute节点

5、Nova的Cell架构目的

nova的cell架构目的是什么(扩展)???

  • NOVA架构的分层结构:
    • DB -> API数据库
    • conductor --> super conductor
    • rabbitmq --> api-rabbitmq
  • 扩展后,加入了cell单元,单元是一个个独立存在的结构,形成cell_n的结构:
    • cell的数据库是cell_n数据库
    • cell的控制器: nova-conductor
    • cell的消息队列: cell-rabbitmq

四、部署Nova计算服务

配置操作系统+OpenStack运行环境

主机名内存硬盘网卡系统
ct8300+300VM:192.168.10.100CentOS7.6
NAT:192.168.35.140CentOS7.6
c18300+300VM:192.168.10.101CentOS7.6
NAT:192.168.35.141CentOS7.6
C28300+300VM:192.168.10.102CentOS7.6
NAT:192.168.35.142CentOS7.6

nova组件部署位置

控制节点服务
ct​nova-api(nova主服务)
ct​nova-scheduler(nova调度服务)
ct​nova-conductor(nova数据库服务,提供数据库访问)
ct​nova-novncproxy(nova的vnc服务,提供实例的控制台)
c1、c2nova-compute(nova计算服务)

1、Placement组件部署

  1. 创建数据库实例和数据库用户
[root@ct ~]# mysql -uroot -p
MariaDB [(none)]> CREATE DATABASE placement;
MariaDB [(none)]> grant all privileges on placement.* to 'placement'@'localhost' identified by 'PLACEMENT_DBPASS';
MariaDB [(none)]> grant all privileges on placement.* to 'placement'@'%' identiffied by 'PLACEMENT_DBPASS';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit;
  1. 创建Placement服务用户和API的endpoint
创建placement用户
[root@ct ~]# openstack user create --domain default --password PLACEMENT_PASS placement
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | e2fd74e3578f4d47a1f1ab30fff76d80 |
| name                | placement                        |
| options             |                                |
| password_expires_at | None                             |
+---------------------+----------------------------------+
给与placement用户对service项目拥有admin权限
[root@ct ~]# openstack role add --project service --user placement admin
创建一个placement服务,服务类型为placement
[root@ct ~]# openstack service create --name placement --description "Placement API" placement
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Placement API                    |
| enabled     | True                             |
| id          | 6332d10b09144e509971822c6749a267 |
| name        | placement                        |
| type        | placement                        |
+-------------+----------------------------------+

注册API端口到placement的service中;注册的信息会写入到mysql中
[root@ct ~]# openstack endpoint create --region RegionOne placement public http://ct:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 296458b3da894b318f7ee10018480da3 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 6332d10b09144e509971822c6749a267 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://ct:8778                   |
+--------------+----------------------------------+

[root@ct ~]# openstack endpoint create --region RegionOne placement internal http://ct:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 569d80ebf9cc4587b03e203c1037cf73 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 6332d10b09144e509971822c6749a267 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://ct:8778                   |
+--------------+----------------------------------+
[root@ct~]# openstack endpoint create --region RegionOne placement admin http://ct:8778
 +--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 565c7960765f4431859639949cb7b5d2 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 6332d10b09144e509971822c6749a267 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://ct:8778                   |
+--------------+----------------------------------+

  1. 安装placement服务
[root@ct ~]#  yum -y install openstack-placement-api
[root@ct ~]#  cp /etc/placement/placement.conf,.bak	placement.conf	修改placement配置文件
[root@ct ~]#  grep -Ev '^$|#' /etc/placement/placement.conf.bak > /etc/placement/placement.conf
[root@ct ~]#  openstack-config --set /etc/placement/placement.conf placement_database connection mysql+pymysql://placement:PLACEMENT_DBPASS@ct/placement
[root@ct ~]#  openstack-config --set /etc/placement/placement.conf api auth_strategy keystone
[root@ct ~]#  openstack-config --set /etc/placement/placement.conf keystone_authtoken auth_url  http://ct:5000/v3
[root@ct ~]#  openstack-config --set /etc/placement/placement.conf keystone_authtoken memcached_servers ct:11211
[root@ct ~]#  openstack-config --set /etc/placement/placement.conf keystone_authtoken auth_type password
[root@ct ~]#  openstack-config --set /etc/placement/placement.conf keystone_authtoken project_domain_name Default
[root@ct ~]#  openstack-config --set /etc/placement/placement.conf keystone_authtoken user_domain_name Default
[root@ct ~]#  openstack-config --set /etc/placement/placement.conf keystone_authtoken project_name service
[root@ct ~]#  openstack-config --set /etc/placement/placement.conf keystone_authtoken username placement
[root@ct ~]#  openstack-config --set /etc/placement/placement.conf keystone_authtoken password PLACEMENT_PASS
[root@ct placement]# cat placement.conf		##查看placement配置文件
[DEFAULT]
[api]
auth_strategy = keystone
[cors]
[keystone_authtoken]
auth_url = http://ct:5000/v3		##指定keystone地址
memcached_servers = ct:11211		##session信息是缓存放到了memcached中
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = PLACEMENT_PASS
[oslo_policy]
[placement]
[placement_database]
connection = mysql+pymysql://placement:PLACEMENT_DBPASS@ct/placement
[profiler]
  1. 导入数据库
su -s /bin/sh -c "placement-manage db sync" placement

  1. 修改Apache配置文件: 00-placemenct-api.conf
    安装完placement服务后会自动创建该文件-虚拟主机配置
[root@ct ~]# cd /etc/httpd/conf.d/
[root@ct conf.d]# vim 00-placement-api.conf 		##安装完placement会自动创建此文件
</Location>		##配置文件最后插入以下内容
<Directory /usr/bin>			#此处是bug,必须添加下面的配置来启用对placement api的访问,否则在访问apache的
<IfVersion >= 2.4>				#api时会报403;添加在文件的最后即可
	Require all granted
</IfVersion>
<IfVersion < 2.4>				#apache版本;允许apache访问/usr/bin目录;否则/usr/bin/placement-api将不允许被访问
	Order allow,deny				
	Allow from all			#允许apache访问
</IfVersion>
</Directory>
重新启动apache
[root@ct placement]# systemctl restart httpd		##重启Apache为了识别虚拟主机中修改的部分
  1. 测试
① curl 测试访问
[root@ct placement]# curl ct:8778
"versions": ["status": "CURRENT", "min_version": "1.0", "max_version": "1.36", "id": "v1.0", "links": ["href": "", "rel": "self"]]
② 查看端口占用(netstat、lsof)
[root@ct placement]# netstat -natp | grep 8778
tcp6       0      0 :::8778                 :::*                    LISTEN      72994/httpd  
③ 检查placement状态
[root@ct placement]# placement-status upgrade check
+----------------------------------+
| Upgrade Check Results            |
+----------------------------------+
| Check: Missing Root Provider IDs |
| Result: Success                  |
| Details: None                    |
+----------------------------------+
| Check: Incomplete Consumers      |
| Result: Success                  |
| Details: None                    |
+----------------------------------+

2、计算节点Nova服务配置

  1. 创建nova数据库,并执行授权操作
[root@ct ~]# mysql -uroot -p
MariaDB [(none)]> CREATE DATABASE nova_api;
MariaDB [(none)]> CREATE DATABASE nova;
MariaDB [(none)]> CREATE DATABASE nova_cell0;
MariaDB [(none)]> grant all privileges on nova_api.* to 'nova'@'localhost' identified by 'NOVA_DBPASS';
MariaDB [(none)]> grant all privileges on nova_api.* to 'nova'@'%' identified byy 'NOVA_DBPASS';
MariaDB [(none)]> grant all privileges on nova.* to 'nova'@'localhost' identified by 'NOVA_DBPASS';
MariaDB [(none)]> grant all privileges on nova.* to 'nova'@'%' identified by 'NOOVA_DBPASS';
MariaDB [(none)]> grant all privileges on nova_cell0.* to 'nova'@'localhost' ideentified by 'NOVA_DBPASS';
MariaDB [(none)]> grant all privileges on nova_cell0.* to 'nova'@'%' identified  by 'NOVA_DBPASS';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit
  1. 管理Nova用户及服务
[root@ct ~]# openstack user create --domain default --password NOVA_PASS nova	##创建nova用户
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | dcf3b5df290c42638de1f41a834d4284 |
| name                | nova                             |
| options             |                                |
| password_expires_at | None                             |
+---------------------+----------------------------------+

[root@ct ~]# openstack role add --project service --user nova admin	##把nova用户添加到service项目,拥有admin权限
创建nova服务
[root@ct ~]# openstack service create --name nova --description "OpenStack Compute" compute
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Compute                |
| enabled     | True                             |
| id          | d1f76108c8484212a8f296467508aa49 |
| name        | nova                             |
| type        | compute                          |
+-------------+----------------------------------+

给Nova服务关联endpoint(端点)
[root@ct ~]# openstack endpoint create --region RegionOne compute public http://ct:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 4bdb48b8c8c549609c157fcbab532bd7 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | d1f76108c8484212a8f296467508aa49 |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://ct:8774/v2.1              |
+--------------+----------------------------------+
[root@ct ~]# openstack endpoint create --region RegionOne compute internal http://ct:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 4509b03c2767491580ac064df598d9e7 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | d1f76108c8484212a8f296467508aa49 |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://ct:8774/v2.1              |
+--------------+----------------------------------+

[root@ct ~]# openstack endpoint create --region RegionOne compute admin http://ct:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | e6c30360730f448ca21b20666f18a7a4 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | d1f76108c8484212a8f296467508aa49 |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://ct:8774/v2.1              |
+--------------+----------------------------------+
  1. 安装nova组件、修改nova配置文件(nova.conf)
    nova-api、nova-conductor:控制器、nova-novncproxynovn的代理、nova-scheduler:调度器
[root@ct ~]# yum -y install openstack-nova-api openstack-nova-conductor openstack-nova-novncproxy openstack-nova-scheduler
[root@ct ~]# cd /etc/nova/
[root@ct nova]# cp -a /etc/nova/nova.conf,.bak
[root@ct nova]#  grep -Ev '^$|#' /etc/nova/nova.conf.bak > /etc/nova/nova.conf
 openstack-config --set /etc/nova/nova.conf DEFAULT enabled_apis osapi_compute,metadata
 openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 192.168.10.100	##修改为ct的IP(内部IP)
 openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron true
 openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver
 openstack-config --set /etc/nova/nova.conf DEFAULT transport_url rabbit://openstack:RABBIT_PASS@ct
 openstack-config --set /etc/nova/nova.conf api_database connection mysql+pymysql://nova:NOVA_DBPASS@ct/nova_api
 openstack-config --set /etc/nova/nova.conf database connection mysql+pymysql://nova:NOVA_DBPASS@ct/nova
 openstack-config --set /etc/nova/nova.conf placement_database connection mysql+pymysql://placement:PLACEMENT_DBPASS@ct/placement
 openstack-config --set /etc/nova/nova.conf api auth_strategy keystone
 openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://ct:5000/v3
 openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers ct:11211
 openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password
 openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name Default
 openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name Default
 openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service
 openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova
 openstack-config --set /etc/nova/nova.conf keystone_authtoken password NOVA_PASS
 openstack-config --set /etc/nova/nova.conf vnc enabled true
 openstack-config --set /etc/nova/nova.conf vnc server_listen ' $my_ip'
 openstack-config --set /etc/nova/nova.conf vnc server_proxyclient_address ' $my_ip'
 openstack-config --set /etc/nova/nova.conf glance api_servers http://ct:9292
 openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp
 openstack-config --set /etc/nova/nova.conf placement region_name RegionOne
 openstack-config --set /etc/nova/nova.conf placement project_domain_name Default
 openstack-config --set /etc/nova/nova.conf placement project_name service
 openstack-config --set /etc/nova/nova.conf placement auth_type password
 openstack-config --set /etc/nova/nova.conf placement user_domain_name Default
 openstack-config --set /etc/nova/nova.conf placement auth_url http://ct:5000/v3
 openstack-config --set /etc/nova/nova.conf placement username placement
 openstack-config --set /etc/nova/nova.conf placement password PLACEMENT_PASS
[root@ct nova]# cat nova.conf		##查看配置文件
[DEFAULT]
enabled_apis = osapi_compute,metadata						##指定支持的api类型
my_ip = 192.168.10.100										##定义本地IP
use_neutron = true											##通过neutron获取IP地址
firewall_driver = nova.virt.firewall.NoopFirewallDriver		##防火墙的引擎
transport_url = rabbit://openstack:RABBIT_PASS@ct			##指定连接的rabbitmq
[api]
auth_strategy = keystone									##指定使用keystone认证
[api_database]
connection = mysql+pymysql://nova:NOVA_DBPASS@ct/nova_api	##api连入数据库
[barbican]
[cache]
[cinder]
[compute]
[conductor]
[console]
[consoleauth]
[cors]
[database]
connection = mysql+pymysql://nova:NOVA_DBPASS@ct/nova		
[devices]
[ephemeral_storage_encryption]
[filter_scheduler]
[glance]
api_servers = http://ct:9292		
[guestfs]
[healthcheck]
[hyperv]
[ironic]
[key_manager]
[keystone]
[keystone_authtoken]				##配置keystone的认证信息
auth_url = http://ct:5000/v3		##到此url去认证
memcached_servers = ct:11211		##memcache数据库地址:端口
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = NOVA_PASS
[libvirt]
[metrics]
[mks]
[neutron]
[notifications]
[osapi_v21]
[oslo_concurrency]						##指定锁路径
lock_path = /var/lib/nova/tmp			##锁的作用是创建虚拟机时,在执行某个操作的时候,需要等此步骤执行完后才能执行下一个步骤,不能并行执行,保证操作是一步一步的执行
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[pci]
[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
[powervm]
[privsep]
[profiler]
[quota]
[rdp]
[remote_debug]
[scheduler]
[serial_console]
[service_user]
[spice]
[upgrade_levels]
[vault]
[vendordata_dynamic_auth]
[vmware]
[vnc]										##此处如果配置不正确,则连接不上虚拟机的控制台
enabled = true
server_listen =  $my_ip						##指定vnc的监听地址
server_proxyclient_address =  $my_ip		##server的客户端地址为本机地址;此地址是管理网的地址
[workarounds]
[wsgi]
[xenserver]
[xvp]
[zvm]


[placement_database]
  1. 初始化数据库
①:初始化nova_api数据库
[root@ct ~]# su -s /bin/sh -c "nova-manage api_db sync" nova
②:注册cell0数据库;nova服务内部把资源划分到不同的cell中,把计算节点划分到不同的cell中;openstack内部基于cell把计算节点进行逻辑上的分组
[root@ct ~]# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
③:创建cell1单元格;
[root@ct ~]# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
269a515f-5d1a-4acc-be6b-26f3146b0ec6		##cell1的id
④:初始化nova数据库;可以通过 /var/log/nova/nova-manage.log 日志判断是否初始化成功
[root@ct ~]# su -s /bin/sh -c "nova-manage db sync" nova
/usr/lib/python2.7/site-packages/pymysql/cursors.py:170: Warning: (1831, u'Duplicate index `block_device_mapping_instance_uuid_virtual_name_device_name_idx`. This is deprecated and will be disallowed in a future release')
  result = self._query(query)
/usr/lib/python2.7/site-packages/pymysql/cursors.py:170: Warning: (1831, u'Duplicate index `uniq_instances0uuid`. This is deprecated and will be disallowed in a future release')
  result = self._query(query)
⑤:可使用以下命令验证cell0和cell1是否注册成功
su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova #验证cell0和cell1组件是否注册成功
 +-------+--------------------------------------+----------------------------+-----------------------------------------+----------+
|  名称 |                 UUID                 |       Transport URL        |                数据库连接               | Disabled |
+-------+--------------------------------------+----------------------------+-----------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 |           none:/           | mysql+pymysql://nova:****@ct/nova_cell0 |  False   |
| cell1 | 269a515f-5d1a-4acc-be6b-26f3146b0ec6 | rabbit://openstack:****@ct |    mysql+pymysql://nova:****@ct/nova    |  False   |
+-------+--------------------------------------+----------------------------+-----------------------------------------+----------+
  1. 启动Nova服务
[root@ct ~]# systemctl enable openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
[root@ct ~]# systemctl start openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
①:检查nova服务端口
[root@ct ~]# netstat -tnlup|egrep '8774|8775'
tcp        0      0 0.0.0.0:8775            0.0.0.0:*               LISTEN      48566/python2       
tcp        0      0 0.0.0.0:8774            0.0.0.0:*               LISTEN      48566/python2
[root@ct ~]# curl http://ct:8774

3、计算节点配置Nova服务

  1. c1、c2安装nova-compute组件
yum -y install openstack-nova-compute
修改配置文件nova.conf
cp -a /etc/nova/nova.conf,.bak
grep -Ev '^$|#' /etc/nova/nova.conf.bak > /etc/nova/nova.conf
c1节点:
openstack-config --set /etc/nova/nova.conf DEFAULT enabled_apis osapi_compute,metadata
openstack-config --set /etc/nova/nova.conf DEFAULT transport_url rabbit://openstack:RABBIT_PASS@ct
openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 192.168.10.101				#修改为对应节点的内部IP
openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron true
openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver
openstack-config --set /etc/nova/nova.conf api auth_strategy keystone
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://ct:5000/v3
openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers ct:11211
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password
openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name Default
openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name Default
openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service
openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova
openstack-config --set /etc/nova/nova.conf keystone_authtoken password NOVA_PASS
openstack-config --set /etc/nova/nova.conf vnc enabled true
openstack-config --set /etc/nova/nova.conf vnc server_listen 0.0.0.0
openstack-config --set /etc/nova/nova.conf vnc server_proxyclient_address ' $my_ip'
openstack-config --set /etc/nova/nova.conf vnc novncproxy_base_url http://192.168.10.101:6080/vnc_auto.html
openstack-config --set /etc/nova/nova.conf glance api_servers http://ct:9292
openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp
openstack-config --set /etc/nova/nova.conf placement region_name RegionOne
openstack-config --set /etc/nova/nova.conf placement project_domain_name Default
openstack-config --set /etc/nova/nova.conf placement project_name service
openstack-config --set /etc/nova/nova.conf placement auth_type password
openstack-config --set /etc/nova/nova.conf placement user_domain_name Default
openstack-config --set /etc/nova/nova.conf placement auth_url http://ct:5000/v3
openstack-config --set /etc/nova/nova.conf placement username placement
openstack-config --set /etc/nova/nova.conf placement password PLACEMENT_PASS
openstack-config --set /etc/nova/nova.conf libvirt virt_type qemu
[root@c1 nova]# cat nova.conf		##查看配置文件
[DEFAULT]
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:RABBIT_PASS@ct
my_ip = 192.168.10.101#修改为对应节点的内部IP
use_neutron = true
firewall_driver = nova.virt.firewall.NoopFirewallDriver
[api]
auth_strategy = keystone
[api_database]
[barbican]
[cache]
[cinder]
[compute]
[conductor]
[console]
[consoleauth]
[cors]
[database]
[devices]
[ephemeral_storage_encryption]
[filter_scheduler]
[glance]
api_servers = http://ct:9292
[guestfs]
[healthcheck]
[hyperv]
[ironic]
[key_manager]
[keystone]
[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
[metrics]
[mks]
[neutron]
[notifications]
[osapi_v21]
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[pci]
[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
[powervm]
[privsep]
[profiler]
[quota]
[rdp]
[remote_debug]
[scheduler]
[serial_console]
[service_user]
[spice]
[upgrade_levels]
[vault]
[vendordata_dynamic_auth]
[vmware]
[vnc]
enabled = true
server_listen = 0.0.0.0
server_proxyclient_address =  $my_ip
novncproxy_base_url = http://192.168.10.101:6080/vnc_auto.html
[workarounds]
[wsgi]
[xenserver]
[xvp]
[zvm]
  1. 开启服务
 systemctl enable libvirtd.service openstack-nova-compute.service
 systemctl start libvirtd.service openstack-nova-compute.service

以上操作计算节点-c2与c1相同(除IP地址不同)

  1. controller节点操作
查看compute节点是否注册到controller上,通过消息队列;需要在controller节点执行
[root@ct ~]# openstack compute service list --service nova-compute
+----+--------------+------+------+---------+-------+----------------------------+
| ID | Binary       | Host | Zone | Status  | State | Updated At                 |
+----+--------------+------+------+---------+-------+----------------------------+
|  8 | nova-compute | c1   | nova | enabled | up    | 2021-08-26T13:29:30.000000 |
|  9 | nova-compute | c2   | nova | enabled | up    | 2021-08-26T13:29:33.000000 |
+----+--------------+------+------+---------+-------+----------------------------+
  1. 扫描当前openstack中有可用的计算节点,发现后会把计算节点创建到cell中,后面就可以在cell中创建虚拟机;相当于openstack内部对计算节点进行分组,把计算节点分配到不同的cell中
[root@ct ~]# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting computes from cell 'cell1': 269a515f-5d1a-4acc-be6b-26f3146b0ec6
Checking host mapping for compute host 'c1': 77c14ea3-41e4-4008-81b2-4b18565796ec
Creating host mapping for compute host 'c1': 77c14ea3-41e4-4008-81b2-4b18565796ec
Checking host mapping for compute host 'c2': 5398f1e7-ee65-471a-bb7c-357764c357a1
Creating host mapping for compute host 'c2': 5398f1e7-ee65-471a-bb7c-357764c357a1
Found 2 unmapped computes in cell: 269a515f-5d1a-4acc-be6b-26f3146b0ec6
  1. 默认每次添加个计算节点,在控制端就需要执行一次扫描,这样会很麻烦,所以可以修改控制端nova的主配置文件
[root@ct ~]# vim /etc/nova/nova.conf
[scheduler]		##此处下面插入一行
discover_hosts_in_cells_interval = 300 		##每300秒扫描一次;自动添加计算节点
 
[root@ct ~]# systemctl restart openstack-nova-api.service
  1. 验证计算节点服务
#检查 nova 的各个服务是否都是正常,以及 compute 服务是否注册成功
[root@ct ~]# openstack compute service list 
+----+----------------+------+----------+---------+-------+----------------------------+
| ID | Binary         | Host | Zone     | Status  | State | Updated At                 |
+----+----------------+------+----------+---------+-------+----------------------------+
|  4 | nova-scheduler | ct   | internal | enabled | up    | 2021-08-26T13:34:17.000000 |
|  7 | nova-conductor | ct   | internal | enabled | up    | 2021-08-26T13:34:19.000000 |
|  8 | nova-compute   | c1   | nova     | enabled | up    | 2021-08-26T13:34:20.000000 |
|  9 | nova-compute   | c2   | nova     | enabled | up    | 2021-08-26T13:34:13.000000 |
+----+----------------+------+----------+---------+-------+----------------------------+

[root@ct ~]# openstack catalog list		##查看各个组件的 api 是否正常
+-----------+-----------+---------------------------------+
| Name      | Type      | Endpoints                       |
+-----------+-----------+---------------------------------+
| placement | placement | RegionOne                       |
|           |           |   public: http://ct:8778        |
|           |           | RegionOne                       |
|           |           |   admin: http://ct:8778         |
|           |           | RegionOne                       |
|           |           |   internal: http://ct:8778      |
|           |           |                                 |
| glance    | image     | RegionOne                       |
|           |           |   public: http://ct:9292        |
|           |           | RegionOne                       |
|           |           |   admin: http://ct:9292         |
|           |           | RegionOne                       |
|           |           |   internal: http://ct:9292      |
|           |           |                                 |
| keystone  | identity  | RegionOne                       |
|           |           |   admin: http://ct:5000/v3/     |
|           |           | RegionOne                       |
|           |           |   internal: http://ct:5000/v3/  |
|           |           | RegionOne                       |
|           |           |   public: http://ct:5000/v3/    |
|           |           |                                 |
| nova      | compute   | RegionOne                       |
|           |           |   internal: http://ct:8774/v2.1 |
|           |           | RegionOne                       |
|           |           |   public: http://ct:8774/v2.1   |
|           |           | RegionOne                       |
|           |           |   admin: http://ct:8774/v2.1    |
|           |           |                                 |
+-----------+-----------+---------------------------------+
 [root@ct ~]# openstack image list		##查看是否能够拿到镜像
 +--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| ca02269b-9b20-4a03-9b35-5c889b624db8 | cirros | active |
+--------------------------------------+--------+--------+
 
#查看cell的api和placement的api是否正常,只要其中一个有误,后期无法创建虚拟机
[root@ct ~]# nova-status upgrade check
+--------------------------------+
| Upgrade Check Results          |
+--------------------------------+
| Check: Cells v2                |
| Result: Success                |
| Details: None                  |
+--------------------------------+
| Check: Placement API           |
| Result: Success                |
| Details: None                  |
+--------------------------------+
| Check: Ironic Flavor Migration |
| Result: Success                |
| Details: None                  |
+--------------------------------+
| Check: Cinder API              |
| Result: Success                |
| Details: None                  |
+--------------------------------+

五、总结

  • Placement部署
    提供了placement-apiWSGI脚本,用于与Apache,nginx或其他支持WSGI的Web服务器一起运行服务(通过nginx或apache实现python入口代理)。
    根据用于部署OpenStack的打包解决方案,WSGI脚本可能位于/usr/bin 或中/usr/local/bin
    Placement服务是从 S 版本,从nova服务中拆分出来的组件,作用是收集各个node节点的可用资源,把node节点的资源统计写入到mysql,Placement服务会被nova scheduler服务进行调用 Placement服务的监听端口是8778

    • 需修改的配置文件:
      ① placement.conf
      主要修改思路:
      Keystone认证相关(url、HOST:PORT、域、账号密码等)
      对接数据库(位置)
      ② 00-placement-api.conf
      主要修改思路(虚拟主机):
      Apache权限、访问控制
  • 节点部署注意点
    Nova分为控制节点、计算节点
    Nova组件核心功能是调度资源,在配置文件中需要体现的部分:指向认证节点位置(URL、ENDPOINT)、调用服务、注册、提供支持等,配置文件中的所有配置参数基本都是围绕此范围(对实例生命周期管理)进行设置

以上是关于浅谈OpenStack T版服务组件--Nova计算服务(#^.^#)的主要内容,如果未能解决你的问题,请参考以下文章

OpenStack 运维 - 部署Nova组件 [T版]

OpenStack 运维 - 部署Nova组件 [T版]

OpenStack的部署T版——Nova组件

传统公司部署OpenStack(t版)简易介绍——nova模块部署

传统公司部署OpenStack(t版)简易介绍——nova模块部署

OpenStack--T版部署(内容较多,需要细品(❁´◡`❁))!