Nova的概述

Nova是OpenStack平台核心组件之一,负责管理网络、存储以及维护云平台的计算资源,还包括整个云环境虚拟机的生命周期。

Nova分为控制节点和计算节点: 计算节点:主要安装Nova-compute(负责虚拟机的创建)
控制节点:安装除Nova-compute外的组件
d
Nova的组件分类

  • Nova-Api (接收用户的请求,通过消息队列供其他组件调用)
  • Rabbit-mq Server (消息队列服务,组件之间的沟通桥梁,所有通过消息队列来进行资源的调度)
  • Nova-compute (在计算节点运行,创建虚拟机用的)
  • Nova-Network (为虚拟机提供网络服务的,承担IP地址、vlan、安全组的划分)
  • Nova-Scheduler(调度器,从消息队列获取请求,进行合适的调度操作,选择合适的计算节点来运行虚拟机[考虑的因素包括:CPU、内存、存储等])
  • Nova-Conductor(连接DB数据库用,是Nova-compute和DB数据库之间的中间介。Nova-compute相应访问数据库就是通过这个组件来代理访问的)

Nova的工作原理

客户端想要创建一个虚拟机的请求过程: 首先,客户端提供用户名和密码向keystone进行认证操作,认证通过,返回token。客户端拿着token向Nova发送创建虚拟机的请求,Nova收到token以后,去跟keystone进行验证该用户是否具备该权限。验证通过,Nova-Api通过消息队列(Rabbitmq)告知Nova-Scheduler进行调度操作,通过一系列的选择,将符合条件的计算节点记录到消息队列当中,对应的计算节点从消息队列获取到指令以后,就会进行创建虚拟机的操作。
当需要检索数据库以及更新数据库操作时,计算节点通过消息队列告知Nova-Conductor去完成。然后通过消息队列告知计算节点即可

Nova的构建

测试环境

主机

IP地址

controller

ens33:192.168.1.10 ens37:192.168.2.10

compute

ens33:192.168.1.20 ens37:192.168.2.20

Controller节点的配置

安装Nova相关组件包

[root@controller ~]# yum install openstack-nova-api openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler openstack-nova-placement-api -y

创建Nova数据库

[root@controller ~]# mysql -uroot -p
MariaDB [(none)]> create database nova;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all privileges on nova.* to 'nova'@'localhost' identified by 'nova';
Query OK, 0 rows affected (0.48 sec)

MariaDB [(none)]> grant all privileges on nova.* to 'nova'@'%' identified by 'nova';
Query OK, 0 rows affected (0.00 sec)

创建Nova-Api数据库

MariaDB [(none)]> create database nova_api;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all privileges on nova_api.* to 'nova'@'localhost' identified by 'nova';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all privileges on nova_api.* to 'nova'@'%' identified by 'nova';
Query OK, 0 rows affected (0.00 sec)

创建Nova_cell0数据库

MariaDB [(none)]> create database nova_cell0;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all privileges on nova_cell0.* to 'nova'@'localhost' identified by 'nova';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all privileges on nova_cell0.* to 'nova'@'%' identified by 'nova';
Query OK, 0 rows affected (0.00 sec)

修改Nova配置文件,配置数据库连接

[root@controller ~]# vi /etc/nova/nova.conf
[DEFAULT]
3166 transport_url=rabbit://guest:guest@controller
[api_database]
3523 connection=mysql+pymysql://nova:nova@controller/nova_api
[database]
4646 connection=mysql+pymysql://nova:nova@controller/nova

初始化数据库

[root@controller ~]# su -s /bin/sh -c "nova-manage api_db sync" nova 
[root@controller ~]# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova 
[root@controller ~]# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova 
d1fab571-29cd-431e-8296-f9d84ab34a8f
[root@controller ~]# su -s /bin/sh -c "nova-manage db sync" nova  
//会出现警告,忽略

创建Nova用户

[root@controller ~]# source admin-openstack.sh 
[root@controller ~]# openstack user create --domain default --password nova nova 
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | 81bf28300f9c474d9d26d64ec2c751f4 |
| enabled             | True                             |
| id                  | a3bd94cc2b9747479435c023cd416f31 |
| name                | nova                             |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

赋予service的admin角色
[root@controller ~]# openstack role add --project service --user nova admin

创建Nova服务实体

[root@controller ~]# openstack service create --name nova --description "Openstack Compute" compute
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Openstack Compute                |
| enabled     | True                             |
| id          | 9c803e5e735548e49a99a8437bb6edce |
| name        | nova                             |
| type        | compute                          |
+-------------+----------------------------------+

指定类型为Compute

创建端点信息(public、internal、admin)

创建public端点信息
[root@controller ~]# openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | f1cff9146d0d4ff49040ad21975bcab9 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 9c803e5e735548e49a99a8437bb6edce |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+

创建internal端点信息
[root@controller ~]# openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 94c0ab36d0f74fa3b268f7551f28d503 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 9c803e5e735548e49a99a8437bb6edce |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+

创建admin端点信息
[root@controller ~]# openstack endpoint create --region RegionOne compute admin  http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | cdfb6fb534be4b9695dd4ddc8cc68e69 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 9c803e5e735548e49a99a8437bb6edce |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+

创建placement用户

[root@controller ~]# openstack user create --domain default --password placement placement 
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | 81bf28300f9c474d9d26d64ec2c751f4 |
| enabled             | True                             |
| id                  | f63d4ca038104d0a824fbae2b95f5119 |
| name                | placement                        |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

赋予admin角色
[root@controller ~]# openstack role add --project service --user placement admin

创建placement服务实体

[root@controller ~]# openstack service create --name placement --description "Placement API" placement
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Placement API                    |
| enabled     | True                             |
| id          | e6b27ffd2cc041cfae7c52d750abb4d3 |
| name        | placement                        |
| type        | placement                        |
+-------------+----------------------------------+

创建placement的端点信息

创建public端点信息
[root@controller ~]# openstack endpoint create --region RegionOne placement public http://controller:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 181b70279c9c48ca8748c09df9f3c9dc |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | e6b27ffd2cc041cfae7c52d750abb4d3 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+

创建internal端点信息
[root@controller ~]# openstack endpoint create --region RegionOne placement internal http://controller:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 3ea2d10303d043a7bd81f924671934a0 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | e6b27ffd2cc041cfae7c52d750abb4d3 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+

创建admin端点信息
[root@controller ~]# openstack endpoint create --region RegionOne placement admin http://controller:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | a093ff8e5aea4db695cf064cba67bc33 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | e6b27ffd2cc041cfae7c52d750abb4d3 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+

修改Apache的配置文件

[root@controller ~]# vi /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>

重启httpd服务器
[root@controller ~]# systemctl restart httpd

修改Nova配置文件

[root@controller ~]# vi /etc/nova/nova.conf 
[DEFAULT]
启动网络服务支持和关闭防火墙
1765 use_neutron=true
2427 firewall_driver=nova.virt.firewall.NoopFirewallDriver

设置启用的元数据API
2766 enabled_apis=osapi_compute,metadata

开启认证方式为keystone
3231 auth_strategy=keystone


配置镜像服务 API 的位置
[glance]
5351 api_servers=http://controller:9292

配置锁路径
[oslo_concurrency]
7924 lock_path=/var/lib/nova/tmp

RabbitMq(消息队列配置)
3173 rpc_backend=rabbit
8275 rabbit_host=controller
8283 rabbit_port=5672
8295 rabbit_userid=guest
8301 rabbit_password=guest

配置VNC代理使用控制节点的管理接口IP地址
[vnc]
10296 enabled=true
10320 server_listen=controller
10333 server_proxyclient_address=controller

Nova认证配置
[keystone_authtoken]
6158 auth_uri=http://controller:5000
6159 auth_url=http://controller:35357
6209 memcached_servers=controller:11211
6316 auth_type=password
6317 project_domain_name=default
6318 user_domain_name=default
6319 project_name=service
6320 username=nova
6321 password=nova

配置placement
[placement]
8828 os_region_name=RegionOne
8868 auth_type=password
8874 auth_url=http://controller:5000/v3
8889 project_name=service
8895 project_domain_name=default
8915 username=placement
8921 user_domain_name=default
8924 password=placement

启动相关服务即可

[root@controller ~]# systemctl start  openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
设置开机自动启动
[root@controller ~]# systemctl enable  openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service

验证Nova数据库是否创建成功

[root@controller ~]# nova-manage cell_v2 list_cells
+-------+--------------------------------------+----------------------------------+---------------------------------------------------+
|  名称 |                 UUID                 |          Transport URL           |                     数据库连接                    |
+-------+--------------------------------------+----------------------------------+---------------------------------------------------+
| cell0 | 00000000-0000-0000-0000-000000000000 |              none:/              | mysql+pymysql://nova:****@192.168.1.10/nova_cell0 |
| cell1 | 2dea9f59-2743-45fb-a619-48ed16720473 | rabbit://guest:****@192.168.1.10 |    mysql+pymysql://nova:****@192.168.1.10/nova    |
+-------+--------------------------------------+----------------------------------+---------------------------------------------------+

查看当前节点运行的组件数量
[root@controller ~]# openstack host list 
+------------+-------------+----------+
| Host Name  | Service     | Zone     |
+------------+-------------+----------+
| controller | scheduler   | internal |
| controller | conductor   | internal |
| controller | consoleauth | internal |
+------------+-------------+----------+

以上就是controller节点的配置

compute节点的配置

安装Nova组件包

[root@compute ~]# yum install openstack-nova-compute -y

修改Nova的配置文件

将controller节点的配置文件复制过来进行修改即可
[root@controller ~]# scp /etc/nova/nova.conf root@compute:/etc/nova/nova.conf 
[root@compute ~]# vi /etc/nova/nova.conf 
只需要修改如下内容即可
10325 server_listen=0.0.0.0
10338 server_proxyclient_address=compute
10356 novncproxy_base_url=http://compute:6080/vnc_auto.html

然后注释掉数据库连接
3523 #connection = mysql+pymysql://nova:nova@192.168.1.10/nova_api
4646 #connection=mysql+pymysql://nova:nova@192.168.1.10/nova

检查系统处理器是否支持虚拟机的硬件加速

[root@compute ~]# egrep -c '(vmx|svm)' /proc/cpuinfo 
(1)如果该命令返回一个1或更大的值,说明你的系统支持硬件加速,通常不需要额外的配置。
(2)如果这个指令返回一个0值,说明你的系统不支持硬件加速,你必须配置libvirt取代KVM来使用QEMU。

[root@compute ~]# vi /etc/nova/nova.conf 
6429 virt_type=qemu

启动相关服务即可

[root@compute ~]# systemctl start libvirtd.service openstack-nova-compute.service 
[root@compute ~]# systemctl enable libvirtd.service openstack-nova-compute.service

添加计算节点

在controller节点执行

[root@controller ~]# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova

查看添加的效果
[root@controller ~]# openstack host list 
+------------+-------------+----------+
| Host Name  | Service     | Zone     |
+------------+-------------+----------+
| controller | scheduler   | internal |
| controller | conductor   | internal |
| controller | consoleauth | internal |
| compute    | compute     | nova     |
+------------+-------------+----------+

查看nova和keystone连接是否正常

[root@controller ~]# nova service-list 
+--------------------------------------+------------------+------------+----------+---------+-------+----------------------------+-----------------+-------------+
| Id                                   | Binary           | Host       | Zone     | Status  | State | Updated_at                 | Disabled Reason | Forced down |
+--------------------------------------+------------------+------------+----------+---------+-------+----------------------------+-----------------+-------------+
| a1cec9c5-77bd-49b4-8001-b889699d28a2 | nova-scheduler   | controller | internal | enabled | up    | 2021-01-17T07:18:27.000000 | -               | False       |
| 78ea7096-30aa-4f3a-a47c-fb989a859f3f | nova-conductor   | controller | internal | enabled | up    | 2021-01-17T07:18:27.000000 | -               | False       |
| c81de351-4e2c-40ae-b6f6-13467ca77e07 | nova-consoleauth | controller | internal | enabled | up    | 2021-01-17T07:18:28.000000 | -               | False       |
| b9fc5cff-5d38-49bd-a245-1dc1890dd108 | nova-compute     | compute    | nova     | enabled | up    | 2021-01-17T07:18:29.000000 | -               | False       |
+--------------------------------------+------------------+------------+----------+---------+-------+----------------------------+-----------------+-------------+

至此,Nova服务就搭建完成了