1
2
3
4
5
6
7
作者:李晓辉

联系方式:

微信:Lxh_Chat

邮箱:939958092@qq.com

前言

在云计算环境中,计算资源的高效管理和调度是确保虚拟机快速部署和稳定运行的关键。OpenStack作为一个强大的开源云平台,提供了灵活的资源管理和高效的虚拟化能力。而Nova服务作为OpenStack的核心组件之一,负责管理虚拟机的生命周期,包括创建、启动、停止和删除等操作。本文将详细介绍如何在OpenStack控制节点上安装和配置Nova服务,帮助你顺利搭建一个功能完善的云平台。

Nova服务概述

Nova的作用

Nova服务是OpenStack中的计算服务,它在OpenStack架构中扮演着至关重要的角色。以下是Nova的主要功能:

  1. 虚拟机管理:Nova负责管理虚拟机的生命周期,包括创建、启动、停止、删除等操作。它提供了RESTful API接口,供用户和管理员管理虚拟机实例。

  2. 资源调度:Nova与Placement服务协作,根据资源情况选择最适合运行虚拟机的计算节点。调度器根据资源信息,选择合适的节点来部署虚拟机。

  3. 计算资源管理:Nova管理计算节点上的资源,如CPU、内存、磁盘等。它确保计算节点的资源被合理分配和使用。

Nova的架构

Nova服务由以下几个主要组件构成:

  1. nova-api:这是Nova服务的核心组件,提供RESTful API接口,供用户和管理员管理虚拟机实例。

  2. nova-scheduler:调度器组件,负责根据资源情况选择最适合运行虚拟机的计算节点。

  3. nova-conductor:协调组件,负责处理与数据库的交互,确保多个Nova服务实例之间的数据一致性。

  4. nova-compute:计算服务组件,运行在每个计算节点上,负责管理虚拟机的生命周期。

  5. 数据库:Nova使用关系型数据库(如MariaDB)存储虚拟机实例和计算资源的信息。

  6. 配置文件:Nova的主要配置文件是nova.conf,其中包含了数据库连接信息、身份认证配置、消息队列配置等。

工作原理

Nova的工作原理可以概括为以下几个步骤:

  1. API请求处理:用户通过Nova API发送请求,如创建虚拟机、查询虚拟机状态等。nova-api组件接收这些请求,并将其转发给相应的服务组件。

  2. 调度决策:当用户请求创建虚拟机时,nova-scheduler组件根据Placement服务提供的资源信息,选择最适合运行虚拟机的计算节点。

  3. 资源分配nova-conductor组件与数据库交互,确保资源分配信息被正确记录。

  4. 虚拟机管理nova-compute组件在选定的计算节点上创建、启动、停止或删除虚拟机。

  5. 资源释放:当虚拟机被删除时,Nova服务释放相应的资源,并更新资源分配信息。

通过以上机制,Nova服务确保了虚拟机的高效管理和资源的合理利用。接下来我将详细介绍如何在OpenStack控制节点上安装和配置Nova服务,以确保你的OpenStack环境能够高效地管理虚拟机实例。

需要注意,此章节是在控制节点完成的

这个部分将描述如何在控制节点上安装和配置 Compute 的API服务

准备nova数据库用户和权限

创建Nova数据库和用户,并分配权限,以便Nova服务可以访问数据库。

1
mysql -u root -pLiXiaohui
1
2
3
CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;
1
2
3
4
5
6
7
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'LiXiaohui';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'LiXiaohui';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'LiXiaohui';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'LiXiaohui';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'LiXiaohui';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'LiXiaohui';
exit

创建nova服务用户和角色

加载管理员环境变量文件,以便使用OpenStack命令行工具

1
source adminrc.sh

创建Nova用户并添加为service项目的管理员。

1
2
3
4
5
6
7
8
9
10
11
[root@controller ~]# openstack user create --domain default --password LiXiaohui nova
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | default |
| enabled | True |
| id | 0f41bea70add4b9d97c3c91eaf7d6e7b |
| name | nova |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
1
[root@controller ~]# openstack role add --project service --user nova admin

创建Nova服务和Endpoint

创建Nova服务

1
2
3
4
5
6
7
8
9
10
[root@controller ~]# openstack service create --name nova --description "OpenStack Compute" compute
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Compute |
| enabled | True |
| id | 7e6cb73bc6a1465282cce7d9af3d37a1 |
| name | nova |
| type | compute |
+-------------+----------------------------------+

创建nova endpoint

创建公共、内部和管理三个Endpoint

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@controller ~]# openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 44b7bb17a1a24455971de09c3a1ee2e9 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 7e6cb73bc6a1465282cce7d9af3d37a1 |
| service_name | nova |
| service_type | compute |
| url | http://controller:8774/v2.1 |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 2fd4074deb8d49738d0060ede3164c9d |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 7e6cb73bc6a1465282cce7d9af3d37a1 |
| service_name | nova |
| service_type | compute |
| url | http://controller:8774/v2.1 |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 30f44d023bcf44e09874f4faafcb1f1b |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 7e6cb73bc6a1465282cce7d9af3d37a1 |
| service_name | nova |
| service_type | compute |
| url | http://controller:8774/v2.1 |
+--------------+----------------------------------+

安装配置nova组件

安装Nova组件

安装Nova服务所需的软件包

1
yum install openstack-nova-api openstack-nova-conductor openstack-nova-novncproxy openstack-nova-scheduler -y

准备配置文件

准备配置文件/etc/nova/nova.conf

准备配置文件/etc/nova/nova.conf,该文件包含了Nova服务的全局配置信息,包括数据库连接、身份认证、消息队列、VNC设置等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
crudini --set /etc/nova/nova.conf DEFAULT enabled_apis osapi_compute,metadata
crudini --set /etc/nova/nova.conf DEFAULT transport_url rabbit://openstack:LiXiaohui@controller:5672/
crudini --set /etc/nova/nova.conf DEFAULT my_ip 192.168.8.10
crudini --set /etc/nova/nova.conf api_database connection mysql+pymysql://nova:LiXiaohui@controller/nova_api
crudini --set /etc/nova/nova.conf database connection mysql+pymysql://nova:LiXiaohui@controller/nova
crudini --set /etc/nova/nova.conf api auth_strategy keystone
crudini --set /etc/nova/nova.conf keystone_authtoken www_authenticate_uri http://controller:5000
crudini --set /etc/nova/nova.conf keystone_authtoken auth_url http://controller:5000
crudini --set /etc/nova/nova.conf keystone_authtoken auth_uri http://controller:5000
crudini --set /etc/nova/nova.conf keystone_authtoken memcached_servers controller:11211
crudini --set /etc/nova/nova.conf keystone_authtoken auth_type password
crudini --set /etc/nova/nova.conf keystone_authtoken project_domain_name Default
crudini --set /etc/nova/nova.conf keystone_authtoken user_domain_name Default
crudini --set /etc/nova/nova.conf keystone_authtoken project_name service
crudini --set /etc/nova/nova.conf keystone_authtoken username nova
crudini --set /etc/nova/nova.conf keystone_authtoken password LiXiaohui
crudini --set /etc/nova/nova.conf service_user send_service_user_token true
crudini --set /etc/nova/nova.conf service_user auth_url http://controller:5000/identity
crudini --set /etc/nova/nova.conf service_user auth_strategy keystone
crudini --set /etc/nova/nova.conf service_user auth_type password
crudini --set /etc/nova/nova.conf service_user project_domain_name Default
crudini --set /etc/nova/nova.conf service_user user_domain_name Default
crudini --set /etc/nova/nova.conf service_user project_name service
crudini --set /etc/nova/nova.conf service_user username nova
crudini --set /etc/nova/nova.conf service_user password LiXiaohui
crudini --set /etc/nova/nova.conf vnc enabled true
crudini --set /etc/nova/nova.conf vnc server_listen ' $my_ip'
crudini --set /etc/nova/nova.conf vnc server_proxyclient_address ' $my_ip'
crudini --set /etc/nova/nova.conf glance api_servers http://controller:9292
crudini --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp
crudini --set /etc/nova/nova.conf placement region_name RegionOne
crudini --set /etc/nova/nova.conf placement project_domain_name Default
crudini --set /etc/nova/nova.conf placement project_name service
crudini --set /etc/nova/nova.conf placement auth_type password
crudini --set /etc/nova/nova.conf placement user_domain_name Default
crudini --set /etc/nova/nova.conf placement auth_url http://controller:5000/v3
crudini --set /etc/nova/nova.conf placement username placement
crudini --set /etc/nova/nova.conf placement password LiXiaohui

或者

  • enabled_apis:指定Nova服务启用的API接口。这里启用了计算API(osapi_compute)和元数据API(metadata)。

  • transport_url:指定消息队列的连接字符串,Nova服务通过它与RabbitMQ通信。这里使用的是RabbitMQ,用户名为openstack,密码为LiXiaohui,服务运行在controller主机的5672端口。

  • my_ip:指定Nova服务绑定的IP地址,用于监听API请求。这里设置为192.168.8.10

1
2
3
4
5
[DEFAULT]
...
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:LiXiaohui@controller:5672/
my_ip = 192.168.8.10
  • [api_database] 部分 connection:指定Nova API数据库的连接字符串。这里使用的是MySQL数据库,用户名为nova,密码为LiXiaohui,数据库名称为nova_api,服务运行在controller主机上。

  • [database] 部分 connection:指定Nova主数据库的连接字符串。这里使用的是MySQL数据库,用户名为nova,密码为LiXiaohui,数据库名称为nova,服务运行在controller主机上。

1
2
3
4
5
6
7
[api_database]
...
connection = mysql+pymysql://nova:LiXiaohui@controller/nova_api

[database]
...
connection = mysql+pymysql://nova:LiXiaohui@controller/nova
  • auth_strategy:指定Nova API使用的认证策略。这里设置为keystone,表示使用Keystone服务进行身份认证。
1
2
3
[api]
...
auth_strategy = keystone

这部分配置了Nova服务如何与Keystone服务进行交互,以进行身份认证和授权

1
2
3
4
5
6
7
8
9
10
11
[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:5000/
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = LiXiaohui

这部分配置了Nova服务用户的信息,用于与Keystone交互

1
2
3
4
5
6
7
8
9
10
[service_user]
send_service_user_token = true
auth_url = http://controller:5000/identity
auth_strategy = keystone
auth_type = password
project_domain_name = Default
project_name = service
user_domain_name = Default
username = nova
password = LiXiaohui
  • enabled:启用VNC服务,允许用户通过VNC访问虚拟机。

  • server_listen:指定VNC服务监听的IP地址,这里使用$my_ip变量。

  • server_proxyclient_address:指定VNC代理客户端的IP地址,这里使用$my_ip变量。

1
2
3
4
[vnc]
enabled = true
server_listen = $my_ip
server_proxyclient_address = $my_ip

这部分配置了Nova服务如何与Glance服务进行交互

1
2
3
[glance]
...
api_servers = http://controller:9292

这部分配置了Nova服务的并发设置,lock_path指定锁文件的存储路径,用于确保多个Nova服务实例之间的数据一致性。

1
2
3
[oslo_concurrency]
...
lock_path = /var/lib/nova/tmp

这部分配置了Nova服务如何与Placement服务进行交互

1
2
3
4
5
6
7
8
9
10
[placement]
...
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:5000/v3
username = placement
password = LiXiaohui

准备Nova相关数据库

同步Nova的API数据库,创建所有必要的表和初始数据结构。

1
su -s /bin/sh -c "nova-manage api_db sync" nova

注册cell0数据库

将cell0映射到Nova的数据库,cell0是Nova的默认单元格,用于管理全局资源,nova-manage cell_v2 map_cell0:此命令将cell0单元格映射到Nova的数据库,确保全局资源管理的正常运行

1
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova

创建cell1

创建一个名为cell1的单元格,用于管理计算节点的资源

1
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova

填充nova数据库

同步Nova的主数据库,确保所有表和数据结构与服务版本一致

1
su -s /bin/sh -c "nova-manage db sync" nova

验证cell0和cell1注册正常

验证cell0和cell1是否成功注册到Nova服务中

1
2
3
4
5
6
7
8
[root@controller ~]# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+
| Name | UUID | Transport URL | Database Connection | Disabled |
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 | none:/ | mysql+pymysql://nova:****@controller/nova_cell0 | False |
| cell1 | a906846b-650e-42c1-8d9e-dcf5cbec6a6e | rabbit://openstack:****@controller:5672/ | mysql+pymysql://nova:****@controller/nova | False |
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+

启动nova服务

1
2
3
4
5
systemctl enable --now \
openstack-nova-api.service \
openstack-nova-scheduler.service \
openstack-nova-conductor.service \
openstack-nova-novncproxy.service

启用并启动Nova服务的相关组件,确保服务能够正常运行

  • openstack-nova-api.service:Nova API服务,处理用户请求。

  • openstack-nova-scheduler.service:Nova调度器服务,选择最适合运行虚拟机的计算节点。

  • openstack-nova-conductor.service:Nova协调服务,处理与数据库的交互。

  • openstack-nova-novncproxy.service:Nova VNC代理服务,提供VNC访问。