计算服务 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 国际许可协议进行许可。