计算服务 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

安装于控制节点

配置数据库

1
$ mysql -u root -p

新建数据库 novanova_apinova_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 环境变量:

1
$ . admin-openrc

新建 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_DBPASSWORDNOVA_PASSWORDPLACEMENT_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

验证 cell0cell1 注册情况:

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_PASSWORDNOVA_PASSWORDPLACEMENT_PASSWORDmy_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 文件权限为 666chmod 666 /etc/nova/nova.conf

将计算节点加入单元格数据库

在控制节点上操作。

导入 admin 环境变量:

1
$ . admin-openrc

查看可供虚拟化的节点:

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
$ . admin-openrc

查看成功注册的计算服务列表:

1
$ openstack compute service list

查看 API Endpoints 列表以检验与认证服务的连接性:

1
$ openstack catalog list

查看镜像列表以检验与镜像服务的连接性:

1
$ openstack image list

glance 服务无法连接: 错误信息:ERROR glance.common.wsgi DBError: (pymysql.err.InternalError) 错误原因:glance-api.confglance-registry.confnova 安装时被修改。 解决方案:重新改配置文件。

检查单元格和 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 的过程中出现的问题较多,而且大部分都是历史遗留问题。出现问题之后多去看看错误日志。PythonTrackback 错误日志能够帮你找到大多数出错原因,实在不行就上 GitHub 比对一下源码,再不行…… 就重启电脑吧。


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