实验环境

在源码部署 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

参阅