Nova 是 OpenStack 的核心组件之一,负责管理和调度虚拟机实例的生命周期。本文档将指导你在 OpenStack 控制节点上部署 Nova 计算服务。

本实验基于 CentOS 7.9 和 OpenStack Rocky,采用全新部署的 Cells v2 架构。
Nova 组件简介
Nova 主要由以下几个核心组件构成:
- nova-api:接收并响应外部计算 API 的请求。
- nova-scheduler:决定将虚拟机实例分配到哪个计算节点上运行。
- nova-conductor:充当
nova-compute与数据库之间的中间层,提高系统安全性。 - nova-novncproxy:提供通过 Web 浏览器访问虚拟机控制台的功能。
- placement-api:负责跟踪和管理资源(如 CPU、内存、存储)的使用情况。

准备工作

- 打开宿主机上的 VMnet1 和 VMnet8 网卡;
- 使用 MobaXterm 连接虚拟机;
- 执行以下脚本完成实验环境准备:
curl -s http://192.168.192.205/scripts/env3-3-local.sh | bash
一、数据库创建及授权
在安装配置 Nova 前,我们需要先为它创建相应的数据库。Nova 及相关服务共需要使用四个数据库:nova_api、 nova、nova_cell0 和 placement。创建完毕后,还需为这些数据库分配相应的访问权限。
1、以 root 用户身份连接到数据库服务器
连接时请使用你在环境准备阶段安装 MariaDB 时设置的密码(默认密码是 123456):
mysql -u root -p

2、创建以下四个数据库:
create database nova_api;
create database nova;
create database nova_cell0;
create database placement;

3、创建 nova 和 placement 两个数据库用户,并为它们授予对应数据库的所有权限。你可以参考下表了解用户与数据库的对应关系:
| 用户名 | 密码 | 允许访问的数据库 |
|---|---|---|
| nova | nova | nova_api, nova, nova_cell0 |
| placement | placement | placement |
grant all privileges on nova_api.* to 'nova'@'%' identified by 'nova';
grant all privileges on nova.* to 'nova'@'%' identified by 'nova';
grant all privileges on nova_cell0.* to 'nova'@'%' identified by 'nova';
grant all privileges on placement.* to 'placement'@'%' identified by 'placement';

4、完成数据库的创建和授权后,退出数据库命令行:
exit
二、创建服务凭证
1、运行 admin-openstack.sh 脚本,获取管理员命令行执行权限:
source admin-openstack.sh
在执行以下 OpenStack 命令行操作前,必须先加载管理员的凭证文件,以便获取执行命令所需的权限。
2、在 default 域内创建名为 nova 的用户,并按照提示将密码设置为 nova:
openstack user create nova --domain default --password-prompt

验证:你可以使用以下命令查看 default 域内的所有用户,确认 nova 用户是否创建成功。

3、为 nova 用户赋予 service 项目的 admin(管理员)权限:
openstack role add admin --project service --user nova
4、创建 nova 的计算服务(compute service)实体:
openstack service create compute --name nova --description "OpenStack Compute"

验证:你可以查看所有的服务列表,确认 nova 服务是否创建成功。

5、为计算服务创建 API 端点。端点分为公共(public)、内部(internal)和管理(admin)三种类型,分别用于不同场景的访问。
公共端点:
openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1

内部端点:
openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1

管理端点:
openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1

验证:查看计算服务的端点是否创建成功。

6、创建 placement 用户,并按照提示将密码设置为 placement:
openstack user create placement --domain default --password-prompt

7、将 placement 用户加入到 service 项目,并设置 admin 权限:
openstack role add admin --project service --user placement
8、在服务目录中创建 placement 的 API 实体:
openstack service create placement --name placement --description "Placement API"

9、为 placement 服务创建对应的 API 端点:
公共端点:
openstack endpoint create --region RegionOne placement public http://controller:8778

内部端点:
openstack endpoint create --region RegionOne placement internal http://controller:8778

管理端点:
openstack endpoint create --region RegionOne placement admin http://controller:8778

验证:你可以使用以下命令查看 placement 服务的端点信息。
openstack endpoint list --service placement

三、安装并配置 Nova 组件
1、安装 Nova 及 Placement 相关的软件包:
yum install openstack-nova-api \
openstack-nova-conductor \
openstack-nova-novncproxy \
openstack-nova-scheduler \
openstack-nova-placement-api
2、编辑 /etc/nova/nova.conf 配置文件,用以下内容替换原文件内容:
[DEFAULT]
# 配置 IP 地址,将其替换为你自己控制节点的 IP 地址
my_ip = 192.168.30.129
# 启用对网络服务的支持
use_neutron = true
firewall_driver = nova.virt.firewall.NoopFirewallDriver
# 启用计算和元数据 API
enabled_apis = osapi_compute,metadata
# 配置 RabbitMQ 消息队列访问
transport_url = rabbit://openstack:openstack@controller
# 配置数据库访问
[api_database]
connection = mysql+pymysql://nova:nova@controller/nova_api
[database]
connection = mysql+pymysql://nova:nova@controller/nova
[placement_database]
connection = mysql+pymysql://placement:placement@controller/placement
# 配置身份服务访问
[api]
auth_strategy = keystone
[keystone_authtoken]
auth_url = http://controller:5000/v3
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova
# 配置 VNC 代理以使用控制器节点的管理接口 IP 地址
[vnc]
enabled = true
server_listen = $my_ip
server_proxyclient_address = $my_ip
# 配置 Image 服务 API 的位置
[glance]
api_servers = http://controller:9292
# 配置锁定路径
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
# 配置 Placement API
[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 = placement
3、由于某些软件包存在的 Bug,我们需要将以下配置追加到 /etc/httpd/conf.d/00-nova-placement-api.conf 文件的末尾,以允许对 Placement API 的正常访问:
<Directory /usr/bin>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
<IfVersion < 2.4>
Order allow,deny
Allow from all
</IfVersion>
</Directory>
4、重启 httpd 服务,使刚才的配置生效:
使用 systemctl 命令管理服务:
start启动enable开机自动启动restart重启status查看状态
systemctl restart httpd
四、同步数据库
1、同步 nova_api 和 placement 数据库:
su -s /bin/sh -c "nova-manage api_db sync" nova
2、 注册 cell0 数据库:
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
3、创建 cell1 单元:
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
4、同步 nova 数据库:
su -s /bin/sh -c "nova-manage db sync" nova
5、验证 nova 的 cell0 和 cell1 是否已成功注册:
su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova

6、检查各数据库下是否能正常显示数据表,以验证数据库同步是否正确。
你可以使用 Dataflare 等数据库可视化工具连接到数据库,查看 nova、nova_api、nova_cell0 和 placement 数据库中是否已经自动生成了相应的数据表。
五、启动服务并设置开机自启
1、启动 Nova 相关的四个核心服务:
systemctl start \
openstack-nova-api \
openstack-nova-scheduler \
openstack-nova-conductor \
openstack-nova-novncproxy
2、将这些服务设置为随系统开机自动启动:
systemctl enable \
openstack-nova-api.service \
openstack-nova-scheduler \
openstack-nova-conductor \
openstack-nova-novncproxy

3、最后,检查这些服务的运行状态,确保它们都已正常启动:
systemctl status \
openstack-nova-api.service \
openstack-nova-scheduler \
openstack-nova-conductor \
openstack-nova-novncproxy

检查完成情况

执行以下命令,对操作结果进行检测:
curl -s http://192.168.192.205/scripts/3.4.sh | bash
