OpenStack系列(5)

一、计算服务概览

使用OpenStack计算服务来托管和管理云计算系统。OpenStack计算服务是基础设施即服务(IAAS)系统的主要部分,模块主要由Python实现。

OpenStgack计算组件请求OpenStack Identity服务进行认证;请求OpenStack Image服务提供磁盘镜像;为OpenStack dashboard提供用户管理与管理员接口。磁盘镜像访问限制在项目与用户上;配额以每个项目进行设定(例如,每个项目下可以创建多少实例)。OpenStack组件可以在标准硬件上水平大规模扩展,并且下载磁盘镜像启动虚拟机实例。
OpenStack计算服务由下列组件所构成:

  • nova-api服务

接受和响应来自最终用户的计算API服务。此服务支持OpenStack计算服务API,Amazon EC2 API,以及特殊的管理API用于赋予用户做一些管理的操作。它会强制实施一些规则,发起多数的编排活动,例如运行一个实例。

  • nova-api-metadata服务

接受来自虚拟机发送的元数据请求。nova-api-metadata服务一般在安装nova-network服务的多主机模式下使用。

  • nova-compute服务

一个持续工作的守护进程,通过Hypervior的API来创建和销毁虚拟机实例。例如:
XenServer/XCP的XenAPI
KVM或QEMU的libvirt
VMware的VMwareAPI
过程很复杂。最为基本的,守护进程同意了来自队列的动作请求,转换为一系列的系统命令如启动一个KVM实例,然后,到数据库中更新它的状态。

  • nova-scheduler服务

拿到一个来自队列请求虚拟机实例,然后决定那台计算服务器主机来运行它。

  • nova-conductor模块

媒介作用于nova-compute服务与数据库之间。它排除了由nova-compute服务对云数据库的直接访问。nova-conductor模块可以水平扩展。但是,不要将它部署在运行nova-compute服务的主机节点上。

  • nova-cert模块

服务器守护进程向Nova Cert服务提供X509证书。用来为euca-bundle-image生成证书,仅仅是在EC2 API的请求中使用。

  • nova-network worker守护进程

与nova-compute服务类似,从队列中接受网络任务,并且操作网络。执行任务例如创建桥接的接口或者改变IPtables的规则。

  • nova-consoleauth守护进程

授权控制台代理所提供的用户令牌。该服务必须为控制台代理运行才可奏效。在集群配置中你可以运行二者中任一代理服务而非仅运行一个nova-consoleauth服务。

  • nova-novncproxy守护进程

提供一个代理,用于访问正在运行的实例,通过VNC协议,支持基于浏览器的novnc客户端。

  • nova-spicehtml5proxy守护进程

提供一个代理,用于访问正在运行的实例,通过SPICE协议,支持基于浏览器的HTML5客户端。

  • nova-xvpvncproxy守护进程

提供一个代理,用于访问正在运行的实例,通过VNC协议,支持OpenStack特定的Java客户端。

  • nova-cert守护进程

X509证书

  • nova客户端

用于用户作为租户管理员或最终用户来提交命令。

  • 队列

一个在守护进程间传递消息的中央集线器。常见实现有RabbitMQ以及如Zero MQ等AMQP消息队列。

  • SQL数据库

存储构建时和运行时的状态,为云基础设施,包括有:
可用实例类型、使用中的实例、可用网络、项目
理论上,OpenStack计算可以支持任何和SQL-Alchemy所支持的后端数据库,通常使用SQLite3来做测试可开发工作,MySQL和PostgreSQL作生产环境。

二、安装并配置控制节点

1. 创建数据库、服务凭证和API端点

  1. 创建数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 用数据库连接客户端以 root 用户连接到数据库服务器:
    mysql -u root -p

    # 2.创建 nova_api 和 nova 数据库:
    CREATE DATABASE nova_api;
    CREATE DATABASE nova;
    CREATE DATABASE nova_cell0;

    # 3.对数据库进行正确的授权:

    GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'nova123456a?';
    GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'nova123456a?';
    GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova123456a?';
    GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova123456a?';
    GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'nova123456a?';
    GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'nova123456a?';
  2. 获得 admin 凭证来获取只有管理员能执行的命令的访问权限

    1
    2
    source /home/admin-openrc
    echo $OS_USERNAME
  3. 创建服务证书

    1
    2
    3
    4
    5
    6
    7
    8
    # 1.创建 nova 用户:
    openstack user create --domain default --password-prompt nova

    # 2.给 nova 用户添加 admin 角色(这个命令执行后没有输出):
    openstack role add --project service --user nova admin

    # 3.创建 nova 服务实体:
    openstack service create --name nova --description "OpenStack Compute" compute
  4. 创建Compute服务API端点

    1
    2
    3
    openstack endpoint create --region RegionOne compute public http://ctl01:8774/v2.1
    openstack endpoint create --region RegionOne compute internal http://ctl01:8774/v2.1
    openstack endpoint create --region RegionOne compute admin http://ctl01r:8774/v2.1
  5. 创建Placement服务用户和服务

    1
    2
    3
    4
    # 使用您选择的创建Placement服务用户PLACEMENT_PASS
    openstack user create --domain default --password-prompt placement
    # 使用admin角色将Placement用户添加到服务项目(此命令不提供输出)
    openstack role add --project service --user placement admin
  6. 配置Placement服务

    1
    2
    3
    4
    5
    6
    # 在服务目录中创建Placement API条目
    openstack service create --name placement --description "Placement API" placement
    # 创建Placement API服务端点
    openstack endpoint create --region RegionOne placement public http://ctl01:8778
    openstack endpoint create --region RegionOne placement internal http://ctl01:8778
    openstack endpoint create --region RegionOne placement admin http://ctl01:8778

2. 安装并配置组件

  1. 安装软件包

    1
    2
    3
    yum install -y openstack-nova-api openstack-nova-conductor \
    openstack-nova-console openstack-nova-novncproxy \
    openstack-nova-scheduler openstack-nova-placement-api
  2. 编辑/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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    vim /etc/nova/nova.conf

    # 1.在[DEFAULT]部分,只启用计算和元数据API:
    [DEFAULT]
    # ...
    enabled_apis = osapi_compute,metadata

    # 2.在[api_database]和[database]部分,配置数据库的连接:
    # 用你为Compute数据库选择的密码来代替NOVA_DBPASS。
    [api_database]
    # ...
    connection = mysql+pymysql://nova:nova123456a?@controller/nova_api

    [database]
    # ...
    connection = mysql+pymysql://nova:nova123456a?@controller/nova

    # 3.在[DEFAULT]和[oslo_messaging_rabbit]部分,配置RabbitMQ消息队列访问:
    # 用你在RabbitMQ中为openstack选择的密码替换RABBIT_PASS。
    [DEFAULT]
    # ...
    transport_url = rabbit://openstack:rabbit123456@ctl01

    # 4.在[api]和[keystone_authtoken]部分,配置认证服务访问:
    # 使用你在身份认证服务中设置的nova用户的密码替换NOVA_PASS。
    [api]
    # ...
    auth_strategy = keystone

    [keystone_authtoken]
    # ...
    auth_url = http://ctl01:5000/v3
    memcached_servers = ctl01:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = nova
    password = 123456a?

    # 5.在[DEFAULT]部分,配置my_ip来使用控制节点的管理接口的IP地址。
    [DEFAULT]
    ...
    my_ip = 192.168.1.100

    # 6.在 [DEFAULT] 部分,使能 Networking 服务:
    # 默认情况下,计算服务使用内置的防火墙服务。
    # 由于网络服务包含了防火墙服务,
    # 你必须使用nova.virt.firewall.NoopFirewallDriver防火墙服务来禁用掉计算服务内置的防火墙服务
    [DEFAULT]
    ...
    use_neutron = True
    firewall_driver = nova.virt.firewall.NoopFirewallDriver

    # 7.在[vnc]部分,配置VNC代理使用控制节点的管理接口IP地址 :
    [vnc]
    enabled = true
    # ...
    server_listen = $my_ip
    server_proxyclient_address = $my_ip

    # 8.在 [glance] 区域,配置镜像服务 API 的位置:
    [glance]
    # ...
    api_servers = http://ctl01:9292

    # 9.在 [oslo_concurrency] 部分,配置锁路径:
    [oslo_concurrency]
    # ...
    lock_path = /var/lib/nova/tmp

    # 10.在该[placement]部分中,配置Placement API:
    [placement]
    # ...
    os_region_name = RegionOne
    project_domain_name = Default
    project_name = service
    auth_type = password
    user_domain_name = Default
    auth_url = http://ctl01:5000/v3
    username = placement
    password = 123456a?

    # 11.由于打包错误,您必须通过将以下配置添加到以下内容来启用对Placement API的访问

    vim /etc/httpd/conf.d/00-nova-placement-api.conf
    <Directory /usr/bin>
    <IfVersion >= 2.4>
    Require all granted
    </IfVersion>
    <IfVersion < 2.4>
    Order allow,deny
    Allow from all
    </IfVersion>
    </Directory>

    # Restart the httpd service:
    service httpd restart
    service httpd status
  3. 初始化数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 填充nova-api数据库(忽略此输出中的任何弃用消息)
    su -s /bin/sh -c "nova-manage api_db sync" nova
    # 注册cell0数据库
    su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
    # 创建cell1单元格
    su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
    # 填充nova数据库
    su -s /bin/sh -c "nova-manage db sync" nova
    # 验证nova cell0和cell1是否正确注册
    nova-manage cell_v2 list_cells
  4. 验证数据库是否写入成功

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 应该有110张表
    mysql -uroot -p'123456a?' -D nova -se "show tables"
    mysql -uroot -p'123456a?' -D nova -se "show tables" | wc -l

    # 应该有32张表
    mysql -uroot -p'123456a?' -D nova_api -se "show tables"
    mysql -uroot -p'123456a?' -D nova_api -se "show tables" | wc -l

    mysql -uroot -p'123456a?' -D nova_cell0 -se "show tables"
    mysql -uroot -p'123456a?' -D nova_cell0 -se "show tables" | wc -l
  5. 重启服务

    1
    2
    3
    4
    5
    service nova-api restart
    service nova-consoleauth restart
    service nova-scheduler restart
    service nova-conductor restart
    service nova-novncproxy restart

三、安装和配置计算机点

该服务支持多个虚拟机管理程序来部署实例或虚拟机(VM)。为简单起见,此配置使用Quick EMUlator(QEMU)虚拟机管理程序和支持虚拟机硬件加速的计算节点上的基于内核的VM(KVM)扩展。从传统硬件上,此配置使用通用QEMU管理程序。可以通过稍作修改来遵循这些说明,以使用其他计算节点水平扩展环境。

1. 安装并配置组件

  1. 安装软件包

    1
    apt-get install nova-compute
  2. 编辑/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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    vim /etc/nova/nova.conf

    # 1.在该[DEFAULT]部分中,仅启用计算和元数据API:
    # 在该[DEFAULT]部分中,配置RabbitMQ消息队列访问:
    [DEFAULT]
    # ...
    enabled_apis = osapi_compute,metadata
    transport_url = rabbit://openstack:rabbit123456@ctl01

    # 2.在[api]和[keystone_authtoken]部分中,配置身份服务访问:
    # 注释掉或删除该[keystone_authtoken] 部分中的任何其他选项。
    [api]
    # ...
    auth_strategy = keystone

    [keystone_authtoken]
    # ...
    auth_url = http://ctl01:5000/v3
    memcached_servers = ctl01:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = nova
    password = 123456a?

    # 3.在该[DEFAULT]部分中,配置my_ip选项:
    # 替换MANAGEMENT_INTERFACE_IP_ADDRESS为计算节点上管理网络接口的IP地址
    [DEFAULT]
    # ...
    my_ip = 192.168.1.200

    # 4.在该[DEFAULT]部分中,启用对网络服务的支持:
    # 默认情况下,Compute使用内部防火墙服务。由于Networking包含防火墙服务
    # 因此必须使用nova.virt.firewall.NoopFirewallDriver防火墙驱动程序禁用Compute防火墙服务。
    [DEFAULT]
    # ...
    use_neutron = True
    firewall_driver = nova.virt.firewall.NoopFirewallDriver

    # 5.在该[vnc]部分中,启用并配置远程控制台访问:
    # 如果要访问远程控制台的Web浏览器驻留在无法解析ctl01主机名的主机上
    # 则必须ctl01使用控制器节点的管理接口IP地址替换
    [vnc]
    # ...
    enabled = True
    server_listen = $my_ip
    server_proxyclient_address = $my_ip
    novncproxy_base_url = http://ctl01:6080/vnc_auto.html

    # 6.在该[glance]部分中,配置Image服务API的位置:
    [glance]
    # ...
    api_servers = http://ctl01:9292

    # 7.在该[oslo_concurrency]部分中,配置锁定路径:
    [oslo_concurrency]
    # ...
    lock_path = /var/lib/nova/tmp

    # 8.在该[placement]部分中,配置Placement API:
    # 注释掉该[placement]部分中的任何其他选项。
    [placement]
    # ...
    os_region_name = RegionOne
    project_domain_name = Default
    project_name = service
    auth_type = password
    user_domain_name = Default
    auth_url = http://ctl01:5000/v3
    username = placement
    password = 123456a?
  3. 验证安装

    1
    2
    3
    4
    5
    6
    7
    8
    egrep -c '(vmx|svm)' /proc/cpuinfo

    # 如果这个命令返回了 one or greater 的值,那么你的计算节点支持硬件加速且不需要额外的配置。
    # 如果这个命令返回了 zero 值,那么你的计算节点不支持硬件加速。你必须配置 libvirt 来使用 QEMU 去代替 KVM
    # 在 /etc/nova/nova.conf 文件的 [libvirt] 区域做出如下的编辑:
    [libvirt]
    ...
    virt_type = qemu
  4. 重启服务

    1
    service nova-compute restart

四、将计算节点添加到单元数据库(控制节点)

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
# 获取管理员凭据以启用仅管理员CLI命令,然后确认数据库中是否存在计算主机:
source /home/admin-openrc
echo $OS_USERNAME
openstack compute service list --service nova-compute

# 发现计算主机:
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova

# 输出结果展示:
[root@controller html]# source /home/admin-openrc

[root@controller html]# echo $OS_USERNAME
admin

[root@controller html]# openstack compute service list --service nova-compute
+----+--------------+----------+------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+----+--------------+----------+------+---------+-------+----------------------------+
| 6 | nova-compute | compute1 | nova | enabled | up | 2019-01-20T13:58:26.000000 |
+----+--------------+----------+------+---------+-------+----------------------------+

[root@controller html]# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
/usr/lib/python2.7/site-packages/oslo_db/sqlalchemy/enginefacade.py:332: NotSupportedWarning: Configuration option(s) ['use_tpool'] not supported
exception.NotSupportedWarning
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting computes from cell 'cell1': 48e8e55e-7b55-40f6-84bb-e1acc878140c
Checking host mapping for compute host 'compute1': a42100e8-83de-4500-b22a-831d3f6de399
Creating host mapping for compute host 'compute1': a42100e8-83de-4500-b22a-831d3f6de399
Found 1 unmapped computes in cell: 48e8e55e-7b55-40f6-84bb-e1acc878140c

注意:
添加新计算节点时,必须在控制器节点上运行以注册这些新计算节点,或者,可以在以下位置设置适当的间隔:

1
2
3
vim /etc/nova/nova.conf
[scheduler]
discover_hosts_in_cells_interval = 300

五、验证操作(在控制节点上执行这些命令)

验证Compute服务的运行

  1. 获取admin凭据来访问仅管理员CLI命令

    1
    2
    source /home/admin-openrc
    echo $OS_USERNAME
  2. 列出服务组件以验证每个进程的成功启动和注册

此输出应指示控制节点上启用的三个服务组件以及计算节点上启用的一个服务组件

1
2
3
4
5
6
7
8
9
10
11
openstack compute service list

[root@controller html]# openstack compute service list
+----+------------------+------------+----------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+----+------------------+------------+----------+---------+-------+----------------------------+
| 1 | nova-consoleauth | controller | internal | enabled | up | 2019-01-20T13:59:49.000000 |
| 2 | nova-conductor | controller | internal | enabled | up | 2019-01-20T13:59:49.000000 |
| 3 | nova-scheduler | controller | internal | enabled | up | 2019-01-20T13:59:49.000000 |
| 6 | nova-compute | compute1 | nova | enabled | up | 2019-01-20T13:59:56.000000 |
+----+------------------+------------+----------+---------+-------+----------------------------+

  1. 列出Identity服务中的API端点以验证与Identity服务的连接

端点列表可能会有所不同,具体取决于OpenStack组件的安装,忽略此输出中的任何警告。

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
openstack catalog list

[root@controller html]# openstack catalog list
+-----------+-----------+-----------------------------------------+
| Name | Type | Endpoints |
+-----------+-----------+-----------------------------------------+
| keystone | identity | RegionOne |
| | | admin: http://controller:5000/v3/ |
| | | RegionOne |
| | | internal: http://controller:5000/v3/ |
| | | RegionOne |
| | | public: http://controller:5000/v3/ |
| | | |
| nova | compute | RegionOne |
| | | internal: http://controller:8774/v2.1 |
| | | RegionOne |
| | | public: http://controller:8774/v2.1 |
| | | RegionOne |
| | | admin: http://controller:8774/v2.1 |
| | | |
| glance | image | RegionOne |
| | | internal: http://controller:9292 |
| | | RegionOne |
| | | public: http://controller:9292 |
| | | RegionOne |
| | | admin: http://controller:9292 |
| | | |
| placement | placement | RegionOne |
| | | admin: http://controller:8778 |
| | | RegionOne |
| | | public: http://controller:8778 |
| | | RegionOne |
| | | internal: http://controller:8778 |
| | | |
+-----------+-----------+-----------------------------------------+

  1. 列出Image服务中的镜像以验证与Image服务的连接

    1
    2
    3
    4
    5
    6
    7
    8
    openstack image list

    [root@controller html]# openstack image list
    +--------------------------------------+--------+--------+
    | ID | Name | Status |
    +--------------------------------------+--------+--------+
    | 6cc21209-0d33-477c-a37e-eeed6b34f3ad | cirros | active |
    +--------------------------------------+--------+--------+
  2. 检查单元格和放置API是否运行成功

    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
    nova-status upgrade check

    [root@controller ~]# nova-status upgrade check
    /usr/lib/python2.7/site-packages/oslo_db/sqlalchemy/enginefacade.py:332: NotSupportedWarning: Configuration option(s) ['use_tpool'] not supported
    exception.NotSupportedWarning
    Option "os_region_name" from group "placement" is deprecated. Use option "region-name" from group "placement".
    +-------------------------------+
    | 升级检查结果 |
    +-------------------------------+
    | 检查: Cells v2 |
    | 结果: 成功 |
    | 详情: None |
    +-------------------------------+
    | 检查: Placement API |
    | 结果: 成功 |
    | 详情: None |
    +-------------------------------+
    | 检查: Resource Providers |
    | 结果: 成功 |
    | 详情: None |
    +-------------------------------+
    | 检查: Ironic Flavor Migration |
    | 结果: 成功 |
    | 详情: None |
    +-------------------------------+
    | 检查: API Service Version |
    | 结果: 成功 |
    | 详情: None |
    +-------------------------------+

参考文档

  1. https://www.jianshu.com/p/6ec8973f73dc