实验环境

在源码部署 Keystone 和 Glance 之后,继续进行 Nova 的部署。环境设定和 Keystone 部署相关操作见 Ubuntu 18.04 源码安装 Keystone (Victoria) 。

Placement

Placement 用于管理资源,核心功能是帮助用户寻找满足资源需求的设备,Placement 提供 REST API,并使用 json 格式交换数据。使用 Placement 服务的包括 Nova、Neutron 等组件,因此在部署 Nova 前需要部署 Placement ,管理计算资源(主机)。

数据库配置

MySQL 数据库配置,密码 mysql

1
2
# 连接数据库
sudo mysql -u root -p
1
2
3
4
CREATE DATABASE placement;

GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY 'PLACEMENT_DBPASS';
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY 'PLACEMENT_DBPASS';

身份认证和 API 配置

1
2
3
4
5
6
7
8
9
# 加载环境变量
. admin-openrc

# 创建用户,设置密码为 placement
openstack user create --domain default --password-prompt placement

# 将用户添加到 admin 角色
openstack role add --project service --user placement admin
# 无输出

创建服务实体和服务 API 端点

1
2
3
4
5
6
7
# 创建服务实体
openstack service create --name placement --description "Placement API" placement

# 创建服务 API 端点(endpoint)
openstack endpoint create --region RegionOne placement public http://127.0.0.1:8778
openstack endpoint create --region RegionOne placement internal http://127.0.0.1:8778
openstack endpoint create --region RegionOne placement admin http://127.0.0.1:8778

安装依赖

下载 Placement 源码,指定 Victoria 版本

1
2
# 下载源码
git clone https://github.com/openstack/placement.git --branch stable/victoria --single-branch

进入 Placement 目录安装相关依赖

1
2
3
4
5
# 进入目录
cd placement

# 安装依赖
sudo apt install $(bindep -b) -y

使用 pip 安装相关依赖

1
2
3
4
# git init
pip install -r requirements.txt
pip install -r test-requirements.txt
pip install -e .

配置文件

使用 tox 生成配置文件

1
tox -e genconfig

手动创建目录,将配置文件拷贝过去

1
2
3
4
5
6
7
8
# 创建文件夹
sudo mkdir /etc/placement

# 拷贝配置文件
sudo cp etc/placement/placement.conf.sample /etc/placement/placement.conf

# 修改配置文件
sudo vim /etc/placement/placement.conf

在相应小节添加配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[placement_database]
connection = mysql+pymysql://placement:PLACEMENT_DBPASS@127.0.0.1/placement

[api]
auth_strategy = keystone

[keystone_authtoken]
auth_url = http://127.0.0.1:5000/v3
#memcached_servers = 127.0.0.1:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = placement

部署 Placement

安装 Placement

1
sudo python setup.py install

启用服务

PS:打印的日志信息提示在生产环境中不要使用 placement-api

1
2
3
4
5
6
7
8
# 填充数据库
.tox/shared/bin/placement-manage db sync

# 重启 Apache
service apache2 restart

# 启用服务
placement-api --port 8778

测试

验证服务正常运行

1
2
3
4
5
# 加载环境变量
. admin-openrc

# 查询服务状态
placement-status upgrade check

Nova

Nova 本身包含多个组件,对外提供 RESTful API,内部组件使用 RPC 和消息队列传递消息。而且每个内部组件都可以横向扩展,部署多个。

环境配置

安装 rabbitmq(官方推荐,也支持其他几个消息队列)

1
2
3
4
5
6
7
sudo apt install rabbitmq-server -y

# 添加 openstack 用户
sudo rabbitmqctl add_user openstack RABBIT_PASS

# 权限设置
sudo rabbitmqctl set_permissions openstack ".*" ".*" ".*"

MySQL 数据库配置,密码 mysql

1
2
# 连接数据库
sudo mysql -u root -p
1
2
3
4
5
6
7
8
9
10
CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;

GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';
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';

身份认证和 API 配置

1
2
3
4
5
6
7
8
9
# 加载环境变量
. admin-openrc

# 创建用户,设置密码为 nova
openstack user create --domain default --password-prompt nova

# 将用户添加到 admin 角色
openstack role add --project service --user nova admin
# 无输出

创建服务实体和服务 API 端点

1
2
3
4
5
6
7
# 创建服务实体
openstack service create --name nova --description "OpenStack Compute" compute

# 创建服务 API 端点(endpoint)
openstack endpoint create --region RegionOne compute public http://127.0.0.1:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://127.0.0.1:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://127.0.0.1:8774/v2.1

部署 Nova

下载 Nova 源码,指定 Victoria 版本

1
2
# 下载源码
git clone https://github.com/openstack/nova.git --branch stable/victoria --single-branch

进入 Nova 目录安装相关依赖

1
2
3
4
5
# 进入目录
cd nova

# 安装依赖
sudo apt install $(bindep -b) -y

使用 pip 安装相关依赖

1
2
3
# git init
pip install -r requirements.txt
pip install -r test-requirements.txt

使用 tox 生成配置文件

1
tox -e genconfig

手动创建目录,将配置文件拷贝过去,paste-ini 文件用于配置 WSGI 程序

1
2
3
4
5
6
7
8
9
# 创建文件夹
sudo mkdir /etc/nova

# 拷贝配置文件
sudo cp etc/nova/nova.conf.sample /etc/nova/nova.conf
sudo cp etc/nova/api-paste.ini /etc/nova/api-paste.ini

# 修改配置文件
sudo vi /etc/nova/nova.conf

在相应的小节添加配置,同样,没有安装 memcached 所以对应的配置注释掉了

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
43
44
45
[api_database]
connection = mysql+pymysql://nova:NOVA_DBPASS@127.0.0.1/nova_api

[database]
connection = mysql+pymysql://nova:NOVA_DBPASS@127.0.0.1/nova

[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@127.0.0.1:5672/
my_ip = 127.0.0.1

[api]
auth_strategy = keystone

[keystone_authtoken]
www_authenticate_uri = http://127.0.0.1:5000/
auth_url = http://127.0.0.1:5000/
#memcached_servers = 127.0.0.1:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova

[vnc]
enabled = true
server_listen = $my_ip
server_proxyclient_address = $my_ip
novncproxy_base_url = http://127.0.0.1:6080/vnc_auto.html

[glance]
api_servers = http://127.0.0.1:9292

[oslo_concurrency]
lock_path = /var/lib/nova/tmp

[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://127.0.0.1:5000/v3
username = placement
password = placement

nova-novncproxy 依赖 novnc ,直接克隆到相应目录,该组件用于协调 nova-compute 服务和数据库之间的交互。

1
sudo git clone https://github.com/novnc/noVNC.git /usr/share/novnc/

安装 Nova

1
sudo python setup.py install

启用服务 nova-api、nova-scheduler、nova-conductor、nova-novncproxy 。nova-novncproxy 是可选的,它用于协调 nova-compute 服务和数据库之间的交互。

PS:这里使用 .tox 文件夹下的工具,否则会报错,最终的结果是写入数据库,所以这个问题还是暂时不管

1
2
3
4
5
6
7
8
9
10
11
12
# 填充数据库
.tox/shared/bin/nova-manage --config-file /etc/nova/nova.conf api_db sync
.tox/shared/bin/nova-manage --config-file /etc/nova/nova.conf cell_v2 map_cell0
.tox/shared/bin/nova-manage --config-file /etc/nova/nova.conf cell_v2 create_cell --name=cell1 --verbose
.tox/shared/bin/nova-manage --config-file /etc/nova/nova.conf db sync
.tox/shared/bin/nova-manage --config-file /etc/nova/nova.conf cell_v2 list_cells

# 启用服务
sudo nova-api --config-file=/etc/nova/nova.conf --config-file=/etc/nova/api-paste.ini --debug
sudo nova-scheduler --config-file=/etc/nova/nova.conf --config-file=/etc/nova/api-paste.ini --debug
sudo nova-conductor --config-file=/etc/nova/nova.conf --config-file=/etc/nova/api-paste.ini --debug
sudo nova-novncproxy --config-file=/etc/nova/nova.conf --config-file=/etc/nova/api-paste.ini --debug

nova-compute

由于本地测试环境是单机(Ubuntu 18.04 虚拟机),而且通常 nova-compute 不会装在控制节点上,因此没有进行配置。因为没有使用 nova-compute 所以 nova-novncproxy 和 Placement 都是可选的(应该)。

计算节点,启用 nova-compute

1
2
3
4
5
6
# 虚拟机硬件加速(0 表示不支持,需要配置 virt_type=qemu)
egrep -c '(vmx|svm)' /proc/cpuinfo

# 启用服务
systemctl enable libvirtd.service openstack-nova-compute.service
systemctl start libvirtd.service openstack-nova-compute.service

配置文件 /etc/nova/nova-compute.conf

1
2
[libvirt]
virt_type = qemu

启用服务

1
service nova-compute restart

测试

验证服务正常运行

1
2
# 查询 API 状态
nova-status upgrade check

使用 OpenStack Client 执行与计算服务有关的操作

1
2
3
4
5
# 加载环境变量
. admin-openrc

# 列出计算服务
openstack compute service list

参阅