计算服务 Nova 介绍¶
OpenStack 计算服务包含以下组件:
nova-api 服务nova-api-metadata服务nova-compute 服务nova-placement-api 服务nova-scheduler 服务nova-conductor 模块nova-cert 模块nova-consoleauth 守护进程nova-novncproxy 守护进程nova-spicehtml5proxy 守护进程nova-xvpvncproxy 守护进程- 队列服务
SQL 数据库
安装计算服务 Nova¶
安装于控制节点¶
配置数据库¶
新建数据库 nova ,nova_api ,nova_cell0:
1
2
3
| MariaDB [(none)]> create database nova_api;
MariaDB [(none)]> create database nova;
MariaDB [(none)]> create database nova_cell0;
|
赋予 nova 用户权限并设置 NOVA_PASSWORD:
1
2
3
4
5
6
| MariaDB [(none)]> grant all privileges on nova_api.* to 'nova'@'localhost' identified by 'NOVA_DBPASSWORD';
MariaDB [(none)]> grant all privileges on nova_api.* to 'nova'@'%' identified by 'NOVA_DBPASSWORD';
MariaDB [(none)]> grant all privileges on nova.* to 'nova'@'localhost' identified by 'NOVA_DBPASSWORD';
MariaDB [(none)]> grant all privileges on nova.* to 'nova'@'%' identified by 'NOVA_DBPASSWORD';
MariaDB [(none)]> grant all privileges on nova_cell0.* to 'nova'@'localhost' identified by 'NOVA_DBPASSWORD';
MariaDB [(none)]> grant all privileges on nova_cell0.* to 'nova'@'%' identified by 'NOVA_DBPASSWORD';
|
新建服务证书及 API Endpoints¶
导入 admin 环境变量:
新建 nova 用户并设置密码 NOVA_PASSWORD:
1
| $ openstack user create --domain default --password-prompt nova
|
将 admin 角色加入 nova 用户中:
1
| $ openstack role add --project service --user nova admin
|
生成 nova 服务入口点:
1
| $ openstack service create --name nova --description "OpenStack Compute" compute
|
生成计算服务 API Endpoints :
1
2
3
| $ 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
|
新建 placement 用户并设置密码 PALCEMENT_PASSWORD:
1
| $ openstack user create --domain default --password-prompt placement
|
将 admin 角色加入 placement 用户中:
1
| $ openstack role add --project service --user placement admin
|
生成 placement 服务入口点:
1
| $ openstack service create --name placement --description "Placement API" placement
|
生成 Placement 服务的 API Endpoints :
1
2
3
| $ 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
|
安装配置组件¶
安装组件包:
1
| # yum install openstack-nova-api openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler openstack-nova-placement-api
|
编辑 /etc/nova/nova.conf 文件:
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
46
47
48
49
50
51
52
53
54
55
56
| [DEFAULT]
# ...
enabled_apis = osapi_compute, metadata
transport_url = rabbit://openstack:RABBIT_PASSWORD@controller
my_ip = 192.168.1.105
use_neutron = true
firewall_driver = nova.virt.firewall.NoopFirewallDriver
[api_database]
# ...
connection = mysql+pymysql://nova:NOVA_DBPASSWORD@controller/nova_api
[database]
# ...
connection = mysql+pymysql://nova:NOVA_DBPASSWORD@controller/nova
[api]
# ...
auth_strategy = true
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
project_name = service
user_domain_name = default
user_name = nova
password = NOVA_PASSWORD
[vnc]
# ...
enabled = true
vncserver_listen = $my_ip
vncserver_proxyclient_address = $my_ip
[glance]
# ...
api_servers = http://controller:9292
[oslo_concurrency]
# ...
lock_path = /var/lib/nova/tmp
[placement]
# ...
os_region_one = RegionOne
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
auth_url = http://controller:35357/v3
auth_type = password
password = PLACEMENT_PASSWORD
|
将 NOVA_DBPASSWORD,NOVA_PASSWORD,PLACEMENT_PASSWORD 替换成自己需要的密码;
将 [DEFAULT] 中的 my_ip 字段更改为自己的 IP 。
由于一个打包问题,你还需要编辑 /etc/httpd/conf.d/00-nova-placement-api.conf,追加以下内容:
1
2
3
4
5
6
7
8
9
| <Directory /usr/bin>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
<IfVersion < 2.4>
Order allow,deny
Allow from all
</IfVersion>
</Directory>
|
重启 Apache HTTP 服务:
1
| # systemctl restart httpd
|
同步数据库¶
填充 nova-api 数据库:
1
| # su -s /bin/sh -c "nova-manage api_db sync" nova
|
注册 cell0 数据库:
1
| # su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
|
创建 cell1 :
1
| # su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
|
无法创建 cell:
错误代码:
1
2
3
4
| usage: nova-manage cell_v2 [-h]
{discover_hosts,map_cell0,map_cell_and_hosts,map_instances,simple_cell_setup,verify_instance}
...
nova-manage cell_v2: error: argument action: invalid choice: 'create_cell' (choose from 'discover_hosts', 'map_cell0', 'map_cell_and_hosts', 'map_instances', 'simple_cell_setup', 'verify_instance')
|
错误原因:历史遗留问题,之前的 DevStack 没有卸载干净,Newtown 版本组件残留导致。
解决方案:查找到 DevStack 安装目录,卸载。保证 nova-manage --version 值为 15.0.8 。
填充 nova 数据库
1
| # su -s /bin/sh -c "nova-manage db sync" nova
|
验证 cell0 和 cell1 注册情况:
1
| # nova-manage cell_v2 list_cells
|
开启计算服务¶
1
2
| # systemctl enable openstack-nova-api openstack-nova-consoleauth openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy
# systemctl start openstack-nova-api openstack-nova-consoleauth openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy
|
安装于计算节点¶
安装配置组件¶
安装组件包:
1
| # yum install openstack-nova-compute
|
编辑 /etc/nova/nova.conf 配置文件:
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
46
47
48
49
| [DEFAULT]
# ...
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:RABBIT_PASSWORD@controller
my_ip = 192.168.1.104
use_neutron = true
firewall_driver = nova.virt.firewall.NoopFirewallDriver
[api]
# ...
auth_strategy = keystone
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = NOVA_PASSWORD
[vnc]
# ...
enabled = true
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html
[glance]
# ...
api_servers = http://controller:9292
[oslo_concurrency]
# ...
lock_path = /var/lib/nova/tmp
[placement]
# ...
os_region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:35357/v3
username = placement
password = PLACEMENT_PASSWORD
|
将 RABBIT_PASSWORD,NOVA_PASSWORD,PLACEMENT_PASSWORD,my_ip 替换成自己的密码和 IP。
启动计算服务¶
查看主机是否支持硬件虚拟化:
1
| $ egrep -c '(vmx|svm)' /proc/cpuinfo
|
若输出结果大于等于 1,则说明支持硬件虚拟化;
若输出结果等于 0,则不支持硬件虚拟化,需要使用 QEMU 方式:更改 /etc/nova/nova.conf ,将 [libvirt] 部分中的 virt_type 字段值设为 qemu。
1
2
| # systemctl enable libvirtd openstack-nova-compute
# systemctl start libvirtd openstack-nova-compute
|
openstack-nova-compute 无法启动:
错误信息:ImportError: Class NoopFirewallDriver cannot be found
错误原因:nova.conf 编辑错误。
解决方案:将 [DEFAULT] 中的 firewall_driver 字段改为 nova.virt.firewall.NoopFirewallDriver 即可。
openstack-nova-compute 无法启动:
错误信息:ConfigFilesPermissionDeniedError: Failed to open some config files: /etc/nova/nova.conf
错误原因:使用其他账号复制文件 nova.conf 导致权限错误。
解决方案:更改 nova.conf 文件权限为 666 :chmod 666 /etc/nova/nova.conf。
将计算节点加入单元格数据库¶
在控制节点上操作。
导入 admin 环境变量:
查看可供虚拟化的节点:
1
| $ openstack hypervisor list
|
无法使用 openstack 相关命令:
错误信息:The server is currently unavailable. Please try again at a later time. (HTTP 503) (Request-ID: req-61249be6-40b6-4174-b0f7-8153681aa79c)
错误原因:nova.conf 配置错误。
解决方案:将 [keystone_authtoken] 中的 user_name 改为 username 人太蠢了打错了。
发现 compute 节点,并将其加入 cell 中:
1
| # su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
|
服务测试¶
在控制节点上操作。
导入 admin 环境变量:
查看成功注册的计算服务列表:
1
| $ openstack compute service list
|
查看 API Endpoints 列表以检验与认证服务的连接性:
1
| $ openstack catalog list
|
查看镜像列表以检验与镜像服务的连接性:
glance 服务无法连接:
错误信息:ERROR glance.common.wsgi DBError: (pymysql.err.InternalError)
错误原因:glance-api.conf 与 glance-registry.conf 在 nova 安装时被修改。
解决方案:重新改配置文件。
检查单元格和 Placement API 是否正常工作:
1
| # nova-status upgrade check
|
Placement API 提示 503 错误:
错误信息:ERROR keystonemiddleware.auth_token [-] Bad response code while validating token: 400
错误原因:大部分为 nova.conf 文件中的 [placement] 字段出错,但是本例中的配置文件并无错误,怀疑是服务未能重启彻底问题。
解决方案:检查配置,重启机器,或等待。
参考资料:Placement API, nova-status
部署 nova 的过程中出现的问题较多,而且大部分都是历史遗留问题。出现问题之后多去看看错误日志。Python 的 Trackback 错误日志能够帮你找到大多数出错原因,实在不行就上 GitHub 比对一下源码,再不行…… 就重启电脑吧。

本作品采用
知识共享署名-相同方式共享 4.0 国际许可协议进行许可。