1. nova介绍
Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源。OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的。
用途与功能 :
1) 实例生命周期管理;
2) 管理计算资源;
3) 网络和认证管理;
4) REST 风格的 API;
5) 异步的一致性通信;
6) Hypervisor 透明:支持Xen,XenServer/XCP,KVM, UML, VMware vSphere and Hyper-V。
在上图中可以看到,Nova 处于 Openstak 架构的中心,其他组件都为 Nova 提供支持: Glance 为 VM 提供 image Cinder 和 Swift 分别为 VM 提供块存储和对象存储 Neutron 为 VM 提供网络连接。
Nova 架构如下:
Nova 的架构比较复杂,包含很多组件。 这些组件以子服务(后台 deamon 进程)的形式运行,可以分为以下几类:
API
nova-api,是整个 Nova 组件的门户,接收和响应客户的 API 调用。所有对 Nova 的请求都首先由 nova-api 处理。nova-api 向外界暴露若干 HTTP REST API 接口 在 keystone 中我们可以查询 nova-api 的 endponits。
客户端就可以将请求发送到 endponits 指定的地址,向 nova-api 请求操作。 当然,作为最终用户的我们不会直接发送 Rest AP I请求。 OpenStack CLI,Dashboard 和其他需要跟 Nova 交换的组件会使用这些 API。
Nova-api 对接收到的 HTTP API 请求会做如下处理:
1)检查客户端传入的参数是否合法有效;
2)调用 Nova 其他子服务的处理客户端 HTTP 请求;
3)格式化 Nova 其他子服务返回的结果并返回给客户端。
nova-api 接收哪些请求?
简单的说,只要是跟虚拟机生命周期相关的操作,nova-api 都可以响应。 大部分操作都可以在 Dashboard 上找到。打开Instance管理界面
除了提供 OpenStack 自己的API,nova-api 还支持 Amazon EC2 API。 也就是说,如果客户以前使用 Amazon EC2,并且用 EC2 的 API 开发了些工具来管理虚机,那么如果现在要换成 OpenStack,这些工具可以无缝迁移到 OpenStack,因为 nova-api 兼容 EC2 API,无需做任何修改。
Compute Core
a)nova-scheduler:
虚机调度服务,负责决定在哪个计算节点上运行虚机。创建 Instance 时,用户会提出资源需求,例如 CPU、内存、磁盘各需要多少。OpenStack 将这些需求定义在 flavor 中,用户只需要指定用哪个 flavor 就可以了。
可用的 flavor 在 System->Flavors 中管理。
下面介绍 nova-scheduler 是如何实现调度的。
在 /etc/nova/nova.conf 中,nova 通过 driver=filter_scheduler 这个参数来配置 nova-scheduler。
driver=filter_scheduler
Filter scheduler
Filter scheduler 是 nova-scheduler 默认的调度器,调度过程分为两步:
1> 通过过滤器(filter)选择满足条件的计算节点(运行 nova-compute)
2>通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建 Instance。
Nova 允许使用第三方 scheduler,配置 scheduler_driver 即可。 这又一次体现了OpenStack的开放性。Scheduler 可以使用多个 filter 依次进行过滤,过滤之后的节点再通过计算权重选出最适合的节点。
上图是调度过程的一个示例:
1> 最开始有 6 个计算节点 Host1-Host6;
2> 通过多个 filter 层层过滤,Host2 和 Host4 没有通过,被刷掉了;
3> Host1,Host3,Host5,Host6 计算权重,结果 Host5 得分最高,最终入选。
当 Filter scheduler 需要执行调度操作时,会让 filter 对计算节点进行判断,filter 返回 True 或 False。经过前面一堆 filter 的过滤,nova-scheduler 选出了能够部署 instance 的计算节点。
如果有多个计算节点通过了过滤,那么最终选择哪个节点呢?
Scheduler 会对每个计算节点打分,得分最高的获胜。 打分的过程就是 weight,翻译过来就是计算权重值,那么 scheduler 是根据什么来计算权重值呢?
目前 nova-scheduler 的默认实现是根据计算节点空闲的内存量计算权重值: 空闲内存越多,权重越大,instance 将被部署到当前空闲内存最多的计算节点上。
b)nova-compute:
nova-compute 是管理虚机的核心服务,在计算节点上运行。通过调用Hypervisor API实现节点上的 instance的生命周期管理。 OpenStack 对 instance 的操作,最后都是交给 nova-compute 来完成的。 nova-compute 与 Hypervisor 一起实现 OpenStack 对 instance 生命周期的管理。
通过Driver架构支持多种Hypervisor
Hypervisor是计算节点上跑的虚拟化管理程序,虚机管理最底层的程序。 不同虚拟化技术提供自己的 Hypervisor。 常用的 Hypervisor 有 KVM,Xen, VMWare 等。nova-compute 为这些 Hypervisor 定义了统一的接口,Hypervisor 只需要实现这些接口,就可以 Driver 的形式即插即用到 OpenStack 系统中。 下面是Nova Driver的架构示意图:
c)nova-conductor:
nova-compute 经常需要更新数据库,比如更新和获取虚机的状态。 出于安全性和伸缩性的考虑,nova-compute 并不会直接访问数据库,而是将这个任务委托给 nova-conductor。
这样做有两个显著好处:
1> 更高的系统安全性;
2> 更好的系统伸缩性。
Console Interface
nova-console:用户可以通过多种方式访问虚机的控制台:
nova-novncproxy: 基于 Web 浏览器的 VNC 访问
nova-spicehtml5proxy: 基于 HTML5 浏览器的 SPICE 访问
nova-xvpnvncproxy: 基于 Java 客户端的 VNC 访问
nova-consoleauth:负责对访问虚机控制台请求提供 Token 认证
nova-cert:提供 x509 证书支持
Database
Nova 会有一些数据需要存放到数据库中,一般使用 MySQL。数据库安装在控制节点上。 Nova 使用命名为 “nova” 的数据库。
Message Queue
在前面我们了解到 Nova 包含众多的子服务,这些子服务之间需要相互协调和通信。为解耦各个子服务,Nova 通过 Message Queue 作为子服务的信息中转站。 所以在架构图上我们看到了子服务之间没有直接的连线,是通过 Message Queue 联系的。
OpenStack 默认是用 RabbitMQ 作为 Message Queue。 MQ 是 OpenStack 的核心基础组件,我们后面也会详细介绍。
2. Nova 组件如何协同工作
Nova 物理部署方案
前面大家已经看到 Nova 由很多子服务组成,我们也知道 OpenStack 是一个分布式系统,可以部署到若干节点上,那么接下来大家可能就会问:Nova 的这些服务在物理上应该如何部署呢?
对于 Nova,这些服务会部署在两类节点上:计算节点和控制节点。
计算节点上安装了 Hypervisor,上面运行虚拟机。 由此可知:
1> nova-compute 需要放在计算节点上。
2> 子服务则是放在控制节点上的。
下面我们可以看看实验环境的具体部署情况。 通过在计算节点和控制节点上运行.
s -elf | grep nova 来查看运行的 nova 子服务
compute只运行了nova-compute子服务
控制节点controller运行了若干nova-*子服务
RabbitMQ 和 MySQL 也是放在控制节点上的。可能细心的同学已经发现我们的控制节点上也运行了 nova-compute。 这实际上也就意味着 devstack-controller 既是一个控制节点,同时也是一个计算节点,也可以在上面运行虚机。
这也向我们展示了 OpenStack 这种分布式架构部署上的灵活性: 可以将所有服务都放在一台物理机上,作为一个 All-in-One 的测试环境; 也可以将服务部署在多台物理机上,获得更好的性能和高可用。
另外,也可以用 nova service-list 查看 nova-* 子服务都分布在哪些节点上
从虚机创建流程看 nova-* 子服务如何协同工作。
从学习 Nova 的角度看,虚机创建是一个非常好的场景,涉及的 nova-* 子服务很全,下面是流程图。
- 客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:“帮我创建一个虚机”
- API 对请求做一些必要处理后,向 Messaging(RabbitMQ)发送了一条消息:“让 Scheduler 创建一个虚机”
- Scheduler(nova-scheduler)从 Messaging 获取到 API 发给它的消息,然后执行调度算法,从若干计算节点中选出节点 A
- Scheduler 向 Messaging 发送了一条消息:“在计算节点 A 上创建这个虚机”
- 计算节点 A 的 Compute(nova-compute)从 Messaging 中获取到 Scheduler 发给它的消息,然后在本节点的 Hypervisor 上启动虚机。
- 在虚机创建的过程中,Compute 如果需要查询或更新数据库信息,会通过 Messaging 向 Conductor(nova-conductor)发送消息,Conductor 负责数据库访问。
以上是创建虚机最核心的步骤, 这几个步骤向我们展示了 nova-* 子服务之间的协作的方式,也体现了 OpenStack 整个系统的分布式设计思想,掌握这种思想对我们深入理解 OpenStack 会非常有帮助。
3. Nova 创建虚拟机详细过程
1、界面或命令行通过RESTful API向keystone获取认证信息。
2、keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求。
3、界面或命令行通过RESTful API向nova-api发送一个boot instance的请求(携带auth-token)。
4、nova-api接受请求后向keystone发送认证请求,查看token是否为有效用户和token。
5、keystone验证token是否有效,如有效则返回有效的认证和对应的角色(注:有些操作需要有角色权限才能操作)。
6、通过认证后nova-api和数据库通讯。
7、初始化新建虚拟机的数据库记录。
8、nova-api通过rpc.call向nova-scheduler请求是否有创建虚拟机的资源(Host ID)。
9、nova-scheduler进程侦听消息队列,获取nova-api的请求。
10、nova-scheduler通过查询nova数据库中计算资源的情况,并通过调度算法计算符合虚拟机创建需要的主机。
11、对于有符合虚拟机创建的主机,nova-scheduler更新数据库中虚拟机对应的物理主机信息。
12、nova-scheduler通过rpc.cast向nova-compute发送对应的创建虚拟机请求的消息。
13、nova-compute会从对应的消息队列中获取创建虚拟机请求的消息。
14、nova-compute通过rpc.call向nova-conductor请求获取虚拟机消息。(Flavor)
15、nova-conductor从消息队队列中拿到nova-compute请求消息。
16、nova-conductor根据消息查询虚拟机对应的信息。
17、nova-conductor从数据库中获得虚拟机对应信息。
18、nova-conductor把虚拟机信息通过消息的方式发送到消息队列中。
19、nova-compute从对应的消息队列中获取虚拟机信息消息。
20、nova-compute通过keystone的RESTfull API拿到认证的token,并通过HTTP请求glance-api获取创建虚拟机所需要镜像。
21、glance-api向keystone认证token是否有效,并返回验证结果。
22、token验证通过,nova-compute获得虚拟机镜像信息(URL)。
23、nova-compute通过keystone的RESTfull API拿到认证k的token,并通过HTTP请求neutron-server获取创建虚拟机所需要的网络信息。
24、neutron-server向keystone认证token是否有效,并返回验证结果。
25、token验证通过,nova-compute获得虚拟机网络信息。
26、nova-compute通过keystone的RESTfull API拿到认证的token,并通过HTTP请求cinder-api获取创建虚拟机所需要的持久化存储信息。
27、cinder-api向keystone认证token是否有效,并返回验证结果。
28、token验证通过,nova-compute获得虚拟机持久化存储信息。
29、nova-compute根据instance的信息调用配置的虚拟化驱动来创建虚拟机。
4. Nova配置
将三个节点192.168.16.66、.68、.69作如下规划:
控制节点:.66,计算节点.66、.68、.69,然后将.68、.69计算节点加入到.66控制节点。
4.1 安装和配置控制节点
以已经安装了keystone和glance的192.168.16.66为控制节点,先在该节点上安装配置。
1> 创建nova数据库并给用户授权
[root@ajy6 ~]# mysql -uroot -p123 MariaDB [(none)]> CREATE DATABASE nova_api; Query OK, 1 row affected (0.01 sec) MariaDB [(none)]> CREATE DATABASE nova; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> CREATE DATABASE nova_cell0; Query OK, 1 row affected (0.00 sec) 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 BY '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 'NOVA_DBPASS'; MariaDB [(none)]> 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';
2> 登录OpenStack
[root@ajy6 ~]# source openrc
3> 创建nova用户
[root@ajy6 ~]# openstack user create --domain default --password=nova nova [root@ajy6 ~]# openstack user list +----------------------------------+--------+ | ID | Name | +----------------------------------+--------+ | 1a82c1e81e1245c4929e9f57b4149c8e | nova | | 463edaeb97584e73b1cc3ea2cf0c6052 | glance | | 4a3f3226d6a74669a23da16b623c386c | admin | | a5b7806347f04a839e5f87098c45e8b1 | demo | +----------------------------------+--------+
4> 将nova用户添加为管理员角色
[root@ajy6 ~]# openstack role add --project service --user nova admin
5> 创建nova计算服务
[root@ajy6 ~]# openstack service create --name nova \ > --description "OpenStack Compute" compute [root@ajy6 ~]# openstack service list +----------------------------------+----------+----------+ | ID | Name | Type | +----------------------------------+----------+----------+ | 5be8e7d9afe84730b35ca17ae00dccdc | nova | compute | | a3bda1761ac14bfaa6fa6daff9fba4ba | keystone | identity | | bfaf8c43806045038dd086e09b4dfa3e | glance | image | +----------------------------------+----------+----------+
6> 创建nova服务端点
[root@ajy6 ~]# openstack endpoint create --region RegionOne \ > compute public http://ajy6:8774/v2.1 [root@ajy6 ~]# openstack endpoint create --region RegionOne \ > compute internal http://ajy6:8774/v2.1 [root@ajy6 ~]# openstack endpoint create --region RegionOne \ > compute admin http://ajy6:8774/v2.1、
#查看所有服务和其端点,用catalog [root@ajy6 ~]# openstack catalog list +----------+----------+-----------------------------------+ | Name | Type | Endpoints | +----------+----------+-----------------------------------+ | nova | compute | RegionOne | | | | internal: http://ajy6:8774/v2.1 | | | | RegionOne | | | | admin: http://ajy6:8774/v2.1 | | | | RegionOne | | | | public: http://ajy6:8774/v2.1 | | | | | | keystone | identity | RegionOne | | | | admin: http://ajy6:35357/v3/ | | | | RegionOne | | | | internal: http://ajy6:5000/v3/ | | | | RegionOne | | | | public: http://ajy6:5000/v3/ | | | | | | glance | image | RegionOne | | | | admin: http://ajy6:9292 | | | | RegionOne | | | | internal: http://ajy6:9292 | | | | RegionOne | | | | public: http://ajy6:9292 | | | | | +----------+----------+-----------------------------------+
7> 创建服务placement。placement服务用来进行服务统计和服务追踪,用来进行搜集管理。
[root@ajy6 ~]# openstack user create --domain default --password=placement placement
将用户placement设置为admin
[root@ajy6 ~]# openstack role add --project service --user placement admin
创建placement service
[root@ajy6 ~]# openstack service create --name placement --description "Placement API" placement
8> 设置placement服务端点
[root@ajy6 ~]# openstack endpoint create --region RegionOne placement public http://ajy6:8778 [root@ajy6 ~]# openstack endpoint create --region RegionOne placement internal http://ajy6:8778 [root@ajy6 ~]# openstack endpoint create --region RegionOne placement admin http://ajy6:8778 [root@ajy6 ~]# openstack catalog list +-----------+-----------+-----------------------------------+ | Name | Type | Endpoints | +-----------+-----------+-----------------------------------+ | placement | placement | RegionOne | | | | internal: http://ajy6:8778 | | | | RegionOne | | | | public: http://ajy6:8778 | | | | RegionOne | | | | admin: http://ajy6:8778 | | | | | | nova | compute | RegionOne | | | | internal: http://ajy6:8774/v2.1 | | | | RegionOne | | | | admin: http://ajy6:8774/v2.1 | | | | RegionOne | | | | public: http://ajy6:8774/v2.1 | | | | | | keystone | identity | RegionOne | | | | admin: http://ajy6:35357/v3/ | | | | RegionOne | | | | internal: http://ajy6:5000/v3/ | | | | RegionOne | | | | public: http://ajy6:5000/v3/ | | | | | | glance | image | RegionOne | | | | admin: http://ajy6:9292 | | | | RegionOne | | | | internal: http://ajy6:9292 | | | | RegionOne | | | | public: http://ajy6:9292 | | | | | +-----------+-----------+-----------------------------------+ [root@ajy6 ~]#
9> 安装nova服务
[root@ajy6 ~]# yum install openstack-nova-api openstack-nova-conductor \ > openstack-nova-console openstack-nova-novncproxy \ > openstack-nova-scheduler openstack-nova-placement-api -y
10> 编辑配置文件/etc/nova/nova.conf。删除文件重新配置 。
[root@ajy6 ~]# cd /etc/nova/ [root@ajy6 nova]# ls api-paste.ini nova.conf policy.json release rootwrap.conf [root@ajy6 nova]# cp nova.conf nova.conf.bak [root@ajy6 nova]# vim nova.conf [DEFAULT] my_ip=192.168.16.66 #本机地址 use_neutron = True #使用网络(开启) firewall_driver = nova.virt.firewall.NoopFirewallDriver #防火墙驱动 enabled_apis=osapi_compute,metadata #开启api transport_url = rabbit://openstack:123@ajy6 #消息队列服务地址 消息队列OpenStack用户:密码@主机地址
[api] auth_strategy = keystone
[api_database] #api数据库 connection = mysql+pymysql://nova:NOVA_DBPASS@ajy6/nova_api
[barbican] [cache] [cells] [cinder] #os_region_name = RegionOne [cloudpipe] [conductor] [console] [consoleauth] [cors] [cors.subdomain] [crypto] [database] #nova的数据库 connection = mysql+pymysql://nova:NOVA_DBPASS@ajy6/nova [ephemeral_storage_encryption] [filter_scheduler] [glance] api_servers = http://ajy6:9292
[guestfs] [healthcheck] [hyperv] [image_file_url]
[ironic] [key_manager] [keystone_authtoken] #keystone认证 auth_uri = http://ajy6:5000 auth_url = http://ajy6:35357 memcached_servers = ajy6:11211 #缓存地址,若缓存在其他主机,则写其他主机名 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = nova password = nova [libvirt] #virt_type=qemu [matchmaker_redis] [metrics] [mks] [neutron] #先将此处注销 #url = http://controller:9696 #auth_url = http://controller:35357 #auth_type = password #project_domain_name = default #user_domain_name = default #region_name = RegionOne #project_name = service #username = neutron #password = neutron #service_metadata_proxy = true #metadata_proxy_shared_secret = METADATA_SECRET
[notifications] [osapi_v21] [oslo_concurrency]
lock_path=/var/lib/nova/tmp #临时目录、文件 [oslo_messaging_amqp] [oslo_messaging_kafka] [oslo_messaging_notifications] [oslo_messaging_rabbit] [oslo_messaging_zmq] [oslo_middleware] [oslo_policy] [pci] [placement] os_region_name = RegionOne auth_type = password auth_url = http://ajy6:35357/v3 project_name = service project_domain_name = Default username = placement password = placement user_domain_name = Default [quota] [rdp] [remote_debug] [scheduler] [serial_console] [service_user] [spice] [ssl] [trusted_computing] [upgrade_levels] [vendordata_dynamic_auth] [vmware] [vnc] enabled=true vncserver_listen=$my_ip vncserver_proxyclient_address=$my_ip #novncproxy_base_url = http://172.16.254.63:6080/vnc_auto.html [workarounds] [wsgi] [xenserver] [xvp]
11> nova-api也是通过http服务进行工作的,因此修改配置文件/etc/httpd/conf.d/00-nova-placement-api.conf。在文件末尾写入。
[root@ajy6 nova]# vim /etc/httpd/conf.d/00-nova-placement-api.conf <Directory /usr/bin> <IfVersion >= 2.4> Require all granted </IfVersion> <IfVersion < 2.4> Order allow,deny Allow from all </IfVersion> </Directory>
重启http
[root@ajy6 nova]# systemctl restart httpd
12> 同步nova数据库
[root@ajy6 nova]# su -s /bin/sh -c "nova-manage api_db sync" nova [root@ajy6 nova]# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova [root@ajy6 nova]# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova e5a7963c-6ce1-4615-8bdf-9645d92aebe3 #认证秘钥 [root@ajy6 nova]# 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)
13> 查看cell0和cell1两个版本的uuid
[root@ajy6 nova]# nova-manage cell_v2 list_cells +-------+--------------------------------------+ | Name | UUID | +-------+--------------------------------------+ | cell0 | 00000000-0000-0000-0000-000000000000 | | cell1 | e5a7963c-6ce1-4615-8bdf-9645d92aebe3 | +-------+--------------------------------------+
14> 启动nova服务
[root@ajy6 nova]# systemctl enable openstack-nova-api.service \ > openstack-nova-consoleauth.service openstack-nova-scheduler.service \ > openstack-nova-conductor.service openstack-nova-novncproxy.service Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-nova-api.service to /usr/lib/systemd/system/openstack-nova-api.service. [root@ajy6 nova]# systemctl start openstack-nova-api.service \ > openstack-nova-consoleauth.service openstack-nova-scheduler.service \ > openstack-nova-conductor.service openstack-nova-novncproxy.service
至此,控制节点的nova已部署安装完成。
4.2 安装和配置计算节点
计算节点在三台主机上都部署。
4.2.1 在主机192.168.16.66上安装计算节点
1> 下载nova-compute
安装nova-compute服务要先安装依赖
[root@ajy6 ~]# ls anaconda-ks.cfg openrc openstack_app.tar.gz openstack-ocata yum-repo.sh [root@ajy6 ~]# cd openstack-ocata/ [root@ajy6 openstack-ocata]# ls cirros-0.3.3-x86_64-disk.img openstack-compute-yilai [root@ajy6 openstack-ocata]# cd openstack-compute-yilai/ [root@ajy6 openstack-compute-yilai]# ls qemu-img-ev-2.9.0-16.el7_4.8.1.x86_64.rpm qemu-kvm-common-ev-2.9.0-16.el7_4.8.1.x86_64.rpm qemu-kvm-ev-2.9.0-16.el7_4.8.1.x86_64.rpm [root@ajy6 openstack-compute-yilai]# yum localinstall ./* [root@ajy6 ~]# yum install openstack-nova-compute -y
2> 编辑配置文件
计算节点同样要修改配置文件/etc/nova/nova.conf。计算节点和控制节点在同一个主机会同时生成一个配置文件,所以只配置nova.conf即可。配置文件中所有的controller均表示控制节点,在计算节点加入时也应该改为控制节点的主机名而不是计算节点的主机名。
[root@ajy6 ~]# vim /etc/nova/nova.conf [DEFAULT] # ... enabled_apis = osapi_compute,metadata transport_url = rabbit://openstack:RABBIT_PASS@ajy6 my_ip = 192.168.16.66 #节点要设置成管理节点的ip use_neutron = True firewall_driver = nova.virt.firewall.NoopFirewallDriver [api] # ... auth_strategy = keystone [keystone_authtoken] # ... auth_uri = http://ajy6:5000 auth_url = http://ajy6:35357 memcached_servers = ajy6:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = nova password = NOVA_PASS [vnc] enabled=true vncserver_listen=$my_ip vncserver_proxyclient_address=$my_ip novncproxy_base_url = http://192.168.16.66:6080/vnc_auto.html #给虚拟机提供基于web界面的控制台,地址应该写控制节点的地址
[glance] # ... api_servers = http://controller:9292 [oslo_concurrency] # ... lock_path = /var/lib/nova/tmp [pci]
[placement] os_region_name = RegionOne auth_type = password auth_url = http://ajy6:35357/v3 project_name = service project_domain_name = Default username = placement password = placement user_domain_name = Default [libvirt] virt_type=qemu
3> 开启计算服务
[root@ajy6 ~]# systemctl enable libvirtd.service openstack-nova-compute.service Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-nova-compute.service to /usr/lib/systemd/system/openstack-nova-compute.service. [root@ajy6 ~]# systemctl start libvirtd.service openstack-nova-compute.service
4> 添加计算节点到cell的库
查看节点
[root@ajy6 ~]# openstack hypervisor list #虚拟化层 +----+---------------------+-----------------+---------------+-------+ | ID | Hypervisor Hostname | Hypervisor Type | Host IP | State | +----+---------------------+-----------------+---------------+-------+ | 1 | ajy6 | QEMU | 192.168.16.66 | up | +----+---------------------+-----------------+---------------+-------+
将节点同步到数据库
[root@ajy6 ~]# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
这是手动发现的方法,也可以在nova的配置文件/etc/nova/nova.conf里添加自动发现
[scheduler] discover_hosts_in_cells_interval = 300 #自动发现时间为300秒
5> 查看计算服务列表
[root@ajy6 ~]# openstack compute service list +----+-------------+------+----------+---------+-------+--------------+ | ID | Binary | Host | Zone | Status | State | Updated At | +----+-------------+------+----------+---------+-------+--------------+ | 1 | nova- | ajy6 | internal | enabled | up | 2019-06-30T2 | | | consoleauth | | | | | 0:05:53.0000 | | | | | | | | 00 | | 2 | nova- | ajy6 | internal | enabled | up | 2019-06-30T2 | | | conductor | | | | | 0:05:53.0000 | | | | | | | | 00 | | 3 | nova- | ajy6 | internal | enabled | up | 2019-06-30T2 | | | scheduler | | | | | 0:05:53.0000 | | | | | | | | 00 | | 6 | nova- | ajy6 | nova | enabled | up | 2019-06-30T2 | | | compute | | | | | 0:05:48.0000 | | | | | | | | 00 | +----+-------------+------+----------+---------+-------+--------------+
查看catalog服务列表
[root@ajy6 ~]# openstack catalog list +-----------+-----------+-----------------------------------+ | Name | Type | Endpoints | +-----------+-----------+-----------------------------------+ | nova | compute | RegionOne | | | | internal: http://ajy6:8774/v2.1 | | | | RegionOne | | | | public: http://ajy6:8774/v2.1 | | | | RegionOne | | | | admin: http://ajy6:8774/v2.1 | | | | | | placement | placement | RegionOne | | | | internal: http://ajy6:8778 | | | | RegionOne | | | | public: http://ajy6:8778 | | | | RegionOne | | | | admin: http://ajy6:8778 | | | | | | keystone | identity | RegionOne | | | | admin: http://ajy6:35357/v3/ | | | | RegionOne | | | | internal: http://ajy6:5000/v3/ | | | | RegionOne | | | | public: http://ajy6:5000/v3/ | | | | | | glance | image | RegionOne | | | | admin: http://ajy6:9292 | | | | RegionOne | | | | internal: http://ajy6:9292 | | | | RegionOne | | | | public: http://ajy6:9292 | | | | | +-----------+-----------+-----------------------------------+
6> 刷新后再检测
[root@ajy6 ~]# nova-status upgrade check +---------------------------+ | Upgrade Check Results | +---------------------------+ | Check: Cells v2 | | Result: Success | | Details: None | +---------------------------+ | Check: Placement API | | Result: Success | | Details: None | +---------------------------+ | Check: Resource Providers | | Result: Success | | Details: None |
会有三个成功节点参数
4.2.2 添加计算节点
将节点192.168.16.68、1923.168.16.69部署为计算节点添加到控制节点192.168.16.66.
1> 安装
[root@ajy6 ~]# scp openstack_app.tar.gz 192.168.16.68:/root root@192.168.16.68's password: openstack_app.tar.gz 100% 17MB 17.4MB/s 00:01 [root@ajy6 ~]# scp openstack_app.tar.gz 192.168.16.69:/root root@192.168.16.69's password: openstack_app.tar.gz 100% 17MB 17.7MB/s 00:00 [root@ajy8 ~]# ls anaconda-ks.cfg openstack_app.tar.gz yum-repo.sh [root@ajy8 ~]# tar zxf openstack_app.tar.gz [root@ajy8 ~]# ls anaconda-ks.cfg openstack_app.tar.gz openstack-ocata yum-repo.sh [root@ajy8 ~]# cd openstack-ocata/ [root@ajy8 openstack-ocata]# ls cirros-0.3.3-x86_64-disk.img openstack-compute-yilai [root@ajy8 openstack-ocata]# cd openstack-compute-yilai/ [root@ajy8 openstack-compute-yilai]# ls qemu-img-ev-2.9.0-16.el7_4.8.1.x86_64.rpm qemu-kvm-common-ev-2.9.0-16.el7_4.8.1.x86_64.rpm qemu-kvm-ev-2.9.0-16.el7_4.8.1.x86_64.rpm [root@ajy8 openstack-compute-yilai]# yum localinstall ./* -y [root@ajy8 ~]#yum install openstack-nova-compute
对192.168.16.69进行同样的操作。
2> 编辑配置文件,同样的,文件里的controller表示的是控制节点,将此节点该改为控制节点ajy6。
[DEFAULT] my_ip=192.168.16.68 use_neutron = True firewall_driver = nova.virt.firewall.NoopFirewallDriver enabled_apis=osapi_compute,metadata transport_url = rabbit://openstack:123@ajy6 [api] auth_strategy = keystone [api_database] connection = mysql+pymysql://nova:NOVA_DBPASS@ajy6/nova_api [barbican] [cache] [cells] [cinder] #os_region_name = RegionOne [cloudpipe] [conductor] [console] [consoleauth] [cors] [cors.subdomain] [crypto] [database] connection = mysql+pymysql://nova:NOVA_DBPASS@ajy6/nova [ephemeral_storage_encryption] [filter_scheduler] [glance] api_servers = http://ajy6:9292 [guestfs] [healthcheck] [hyperv] [image_file_url] [ironic] [key_manager] [keystone_authtoken] auth_uri = http://ajy6:5000 auth_url = http://ajy6:35357 memcached_servers = ajy6:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = nova password = nova [libvirt] virt_type=qemu [matchmaker_redis] [metrics] [mks] [neutron] #url = http://controller:9696 #auth_url = http://controller:35357 #auth_type = password #project_domain_name = default #user_domain_name = default #region_name = RegionOne #project_name = service #username = neutron #password = neutron #service_metadata_proxy = true #metadata_proxy_shared_secret = METADATA_SECRET [notifications] [osapi_v21] [oslo_concurrency] lock_path=/var/lib/nova/tmp
[oslo_messaging_amqp] [oslo_messaging_kafka] [oslo_messaging_notifications] [oslo_messaging_rabbit] [oslo_messaging_zmq] [oslo_middleware] [oslo_policy] [pci] [placement] os_region_name = RegionOne auth_type = password auth_url = http://ajy6:35357/v3 project_name = service project_domain_name = Default username = placement password = placement user_domain_name = Default [quota] [rdp] [remote_debug] [scheduler] [serial_console] [service_user] [spice] [ssl] [trusted_computing] [upgrade_levels] [vendordata_dynamic_auth] [vmware] [vnc] enabled=true vncserver_listen=$my_ip vncserver_proxyclient_address=$my_ip novncproxy_base_url = http://192.168.16.66:6080/vnc_auto.html [workarounds] [wsgi] [xenserver] [xvp]
192.168.16.69同样操作。
注意本地主机ip
3> 重启
[root@ajy8 nova]# systemctl enable libvirtd.service openstack-nova-compute.service Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-nova-compute.service to /usr/lib/systemd/system/openstack-nova-compute.service. [root@ajy8 nova]#
同样对192.168.16.69进行操作。
4> 两个计算节点配置完成后返回控制节点进行查看
[root@ajy6 ~]# openstack compute service list +----+------------------+------+----------+---------+-------+----------------------------+ | ID | Binary | Host | Zone | Status | State | Updated At | +----+------------------+------+----------+---------+-------+----------------------------+ | 1 | nova-consoleauth | ajy6 | internal | enabled | up | 2019-06-30T20:52:14.000000 | | 2 | nova-conductor | ajy6 | internal | enabled | up | 2019-06-30T20:52:13.000000 | | 3 | nova-scheduler | ajy6 | internal | enabled | up | 2019-06-30T20:52:14.000000 | | 6 | nova-compute | ajy6 | nova | enabled | up | 2019-06-30T20:52:08.000000 | | 7 | nova-compute | ajy8 | nova | enabled | up | 2019-06-30T20:52:08.000000 | | 8 | nova-compute | ajy9 | nova | enabled | up | 2019-06-30T20:52:08.000000 | +----+------------------+------+----------+---------+-------+----------------------------+ [root@ajy6 ~]# [root@ajy6 ~]# [root@ajy6 ~]# openstack hypervisor list +----+---------------------+-----------------+---------------+-------+ | ID | Hypervisor Hostname | Hypervisor Type | Host IP | State | +----+---------------------+-----------------+---------------+-------+ | 1 | ajy6 | QEMU | 192.168.16.66 | up | | 2 | ajy8 | QEMU | 192.168.16.68 | up | | 3 | ajy9 | QEMU | 192.168.16.69 | up | +----+---------------------+-----------------+---------------+-------+ [root@ajy6 ~]#