第 3 章 OpenStack基本控制服务多点部署

第 3 章 OpenStack基本控制服务多点部署

本章主要介绍基于Kilo版本的OpenStack基本控制服务的多点部署。之所以将控制服务的部署作为单独一章介绍,原因是后期在进一步部署nova-network或Neutron网络组件时,只需要改动配置文件即可。

这里所说的OpenStack基本控制服务,是指MySQL、RabbitMQ、Keystone、Glance、NovaAPI、Horizon这6个核心的基础控制服务组件。之所以选择这6个组件,是因为我们认为对于初学者来说,先从一个简单的基础来学习OpenStack将会有较好的帮助;反之,没有基础的情况下,再将后续的组件一起安装,将会出现“知其然,而不知其所以然”的情况,对学习没有帮助。另一方面,对于很多刚开始将OpenStack用于办公与生产环境的企业来说,这6个组件构成的系统基本上可以满足虚拟化/私有云的应用要求。

多点部署的意思是每个控制服务单独安装到不同的虚拟机中,而不是将所有的服务都安装到同一台服务器或虚拟机中。在本章的部署环境中,我们将不同的控制服务分别安装到运行Ubuntu 14.04的虚拟机中,这些虚拟机运行在一台安装有CentOS 6.6图形界面操作系统的物理服务器上(以下简称为控制节点主机A或主机A)。

相较于All-In-One的部署模式,多点安装将更有助于读者深入理解OpenStack系统的架构,同时也有助于以此为基础的企业生产系统进一步扩展与强化。

3.1 部署环境说明

在本章的示例中,我们将OpenStack的多个控制服务安装在多个虚拟服务器之中,运行控制服务的虚拟服务器全部采用Linux发行版Ubuntu操作系统。控制服务器宿主机的操作系统则采用易于管理的CentOS 6.6图形界面。控制系统服务器采用多点安装,需提前规划好控制系统使用的IP地址。具体部署示意图如图3-1所示。

图 3-1 控制系统多点部署示意图

基本环境简述如下。

  • 控制节点主机安装CentOS 6.6操作系统,上面运行6台基于Ubuntu 14.04操作系统的虚拟机,分别安装了MySQL、RabbitMQ、Keystone、Glance、Nova API、Horizon这6个OpenStack控制服务。

  • 控制节点主机 CentOS系统上创建br1与br4网桥,分别包括eth0与eth3物理网卡。每个虚拟机创建eth0和eth1两个网络接口,分别挂接到br1与br4上。

  • 控制节点主机的eth0网卡接在交换机的控制VLAN上,形成OpenStack的控制网络,eth3则连接在交换机的管理VLAN上。

  • 系统的互联网网关是172.16.113.2。

3.2 控制节点主机环境准备

作为部署基础,首先要准备一台服务器作为控制节点主机,同时在其上制作一个标准的虚拟机镜像,用于创建其他OpenStack控制服务虚拟机。

3.2.1 服务器硬件准备

本书中的示例使用的服务器配置如下所示。

  • 处理器:2路8核。

  • 内存:64GB内存。

  • 硬盘:2TB,支持RAID 5或RAID 10阵列。

  • 网络:配置4个千兆网络接口。

在中小企业的生产系统中,需要进一步提高处理器、内存、磁盘与网络的处理能力,在确保可靠性的基础上进一步提高性能。

3.2.2 操作系统环境准备

控制节点主机需要提前安装好CentOS操作系统,并在该系统上创建用于挂载虚拟主机的br1和br4网桥。

1. 安装CentOS操作系统

本例中,为了方便创建与管理虚拟机,建议安装带图形界面、包含了虚拟机运行基础环境与管理环境的CentOS 6.x操作系统。为了快速安装,可以采用本书中的PXE安装方法。

2. 删除virbr0网桥

当CentOS安装了虚拟化运行环境软件包后,会自动创建virbr0桥,以便挂接在系统中创建的虚拟机上,而我们并不需要它,因此这里直接将其删除:

virsh net-destroy default
virsh net-undefine default

3. 创建网桥br1和br4

安装完操作系统后,CentOS识别的服务器网卡名为eth0、eth1、eth2和eth3。我们需要配置一个包含eth0网卡、名为br1的网桥和一个包含eth3、名为br4的网桥。网桥br1的配置文件ifcfg-br1的内容如下:

DEVICE="br1"
TYPE=Bridge
BOOTPROTO=static
ONBOOT="yes"

网卡eth0的配置文件ifcfg-eth0的内容如下:

DEVICE="eth0"
NM_CONTROLLED="no"
ONBOOT="yes"
BRIDGE="br1"

上述配置将eth0网卡加入到br1的网桥中。

网桥br4的配置文件ifcfg-br4的内容如下:

DEVICE="br4"
TYPE=Bridge
BOOTPROTO=static
IPADDR=172.16.113.209
NETMASK=255.255.255.0
GATEWAY=172.16.113.2
DNS1=61.139.2.69
ONBOOT="yes"

这里给br4配置IP地址的目的是为了访问互联网。

网卡eth3的配置文件ifcfg-eth3的内容如下:

DEVICE="eth3"
NM_CONTROLLED="no"
ONBOOT="yes"
BRIDGE="br4"

上述配置将eth3网卡加入到br4的网桥中。

经过上述配置后,需重启系统的网络服务,相关命令如下:

# service network restart

3.3 虚拟机镜像的准备

本章中,我们将按以下方案准备虚拟机镜像。

  • 控制节点虚拟机磁盘文件的大小为200GB,其格式为QCOW2。

  • 控制节点虚拟机操作系统为Ubuntu 14.04。

  • 控制节点虚拟机添加OpenStack Kilo的软件仓库。

  • 控制节点虚拟机需配置NTP客户端。

  • 虚拟机准备eth0和eth1这两个网络接口。

安装好虚拟机后,需要进一步对虚拟机预安装NTP及Kilo软件源。

3.3.1 虚拟机镜像网络接口准备

给虚拟机准备两块虚拟网卡,分别挂载到主机A上的br1与br4网桥(虚拟机内表现为eth0和eth1),并配置/etc/network/interfaces如下:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
auto eth1

iface eth0 inet static
address 10.11.101.101
netmask 255.0.0.0

iface eth1 inet static
address 172.16.113.101
netmask 255.255.255.0
gateway 172.16.113.2
dns-nameservers 61.139.2.69

3.3.2 虚拟机镜像NTP安装

我们在系统中的时间服务均以nova-api(10.11.101.6) 节点为基准,因此将各个组件的时间服务器均指向这个IP地址。配置各节点的NTP服务主要涉及以下三部分。

安装NTP服务:

# apt-get install NTP

配置NTP服务,相关文件/etc/ntp.conf如下:

server 10.11.101.6 iburst

注意 10.11.101.6指向我们规划中的nova-api虚拟机,它作为系统的时间服务器。

重启NTP服务:

# service ntp restart

3.3.3 虚拟机镜像Kilo源安装

由于我们采用分布式结构安装各个控制节点,故在每个节点需添加Kilo软件源,具体添加步骤如下。

(1) 安装Ubuntu仓库密钥:

# apt-get install ubuntu-cloud-keyring

(2) 添加软件仓库:

# echo "deb http://ubuntu-cloud.archive.canonical.com/ubuntu trusty-updates/kilo main" > /etc/apt/sources.list.d/cloudarchive-kilo.list

(3) 更新系统软件包:

# apt-get update && apt-get dist-upgrade

(4) 提前安装python-mysqldb 模块(此模块是OpenStack控制服务访问数据库时所需要的):

# apt-get install python-mysqldb -y

3.4 OpenStack基本控制服务组件的安装与配置

OpenStack的控制服务组件主要有计算、网络、存储与管理这四大类,涉及十多个组件。但一个OpenStack系统的运行并不需要安装这么多组件。从简单开始,前面提到的6个基本组件就可以构建一个可靠的基础环境,因此我们称这6个组件为“基本控制服务”。

3.4.1 OpenStack基本控制服务组件简介

下面我们分别简要介绍一下这6个基本控制服务组件。

  • OpenStack基础公共服务:主要是MySQL数据库与RabbitMQ消息队列。

    • MySQL负责保存OpenStack系统中的各类数据。

    • RabbitMQ则作为通信枢纽完成OpenStack各组件间的消息交换工作。

  • OpenStack计算控制服务:主要是nova-api、nova-cert、nova-conductor、nova-consoleauth、nova-novncproxy、nova-spiceproxy和nova-scheduler等组件。

    • nova-api负责接受来自Nova client或Horizon的控制指令并完成虚拟机的创建、删除等各种管理工作。

    • nova-cert负责对来自EC2接口命令的用户身份提供认证服务。

    • nova-conductor 负责中转计算节点的数据库读写请求,以提高效率;同时也负责一些快照、备份等服务处理,从而减轻原来单一API服务的压力。

    • nova-consoleauth、nova-novncproxy和nova-spiceproxy负责为来自Horizon的Web VNC管理界面上提供认证与VNC服务。

    • nova-scheduler负责决定在哪台计算节点上创建虚拟机。

  • OpenStack验证服务:主要是Keystone服务,用于租户与服务验证。

  • OpenStack镜像服务:主要是Glance服务,负责提供创建虚拟机使用的操作系统镜像,包括glance-api与glance-registry这两个主要服务。

    • glance-api:负责接受云系统的镜像创建、删除服务及读取请求,并提供镜像数据服务。

    • glance-registry:负责云系统的镜像注册服务。

  • OpenStack仪表盘服务:Horizon服务,用于实现客户通过Web界面操作OpenStack系统。

3.4.2 MySQL服务器的安装与配置

MySQL保存云系统中所有的配置数据,这里的安装是最简单的实验性安装,而非生产环境安装。

1. 网络配置

在Ubuntu下IP地址配置文件为/etc/network/interfaces,其内容为:

# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.11.101.2
netmask 255.0.0.0

auto eth1
iface eth1 inet static
address 172.16.113.212
netmask 255.255.255.0
gateway 172.16.113.2
dns-nameservers 61.139.2.69

2. 软件安装

安装操作系统软件包的代码如下:

# apt-get install mariadb-server python-mysqldb

注意,在安装过程中,需输入MySQL数据库的root账户的密码,我们将该密码设置为OpenStack。

3. 服务配置

在Ubuntu系统中,MySQL服务配置文件为/etc/mysql/my.cnf,具体配置项如下(注意,以下配置仅仅用于实验环境,生产环境中各方面配置需要进一步处理):

[client]
port                   = 3306
socket                 = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket                 = /var/run/mysqld/mysqld.sock
nice                   = 0
[mysqld]
user                   = mysql
pid-file  = /var/run/mysqld/mysqld.pid
socket                 = /var/run/mysqld/mysqld.sock
port                   = 3306
basedir                = /usr
datadir                = /var/lib/mysql
tmpdir                 = /tmp
lc-messages-dir        = /usr/share/mysql
skip-external-locking
bind-address = 10.11.101.2
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
key_buffer             = 16M
max_allowed_packet     = 16M
thread_stack           = 192K
thread_cache_size      = 8
myisam-recover         = BACKUP
query_cache_limit      = 1M
query_cache_size       = 16M
log_error = /var/log/mysql/error.log
expire_logs_days       = 10
max_binlog_size        = 100M
[mysqldump]
quick
quote-names
max_allowed_packet     = 16M
[mysql]
[isamchk]
key_buffer             = 16M
!includedir /etc/mysql/conf.d/

4. 服务启动

启动服务的命令如下:

# service mysql restart

5. 运行验证

查看服务进程状态:

# ps -e | grep mysql

在结果中可以看到下面正在运行的进程:

26954 ?        00:00:00 mysqld_safe
27387 ?        00:07:37 mysqld

查看服务监听端口:

# netstat -lntp

在服务的监听端口中,可以看到MySQL向外提供的服务端口:

tcp        0      0 10.11.101.2:3306         0.0.0.0:*               LISTEN      27387/mysqld

查看服务日志记录,其中MySQL服务日志文件为/var/log/mysql/error.log:

150413 13:51:37 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
150413 13:51:37 InnoDB: The InnoDB memory heap is disabled
150413 13:51:37 InnoDB: Mutexes and rw_locks use GCC atomic builtins
150413 13:51:37 InnoDB: Compressed tables use zlib 1.2.8
150413 13:51:37 InnoDB: Using Linux native AIO
150413 13:51:37 InnoDB: Initializing buffer pool, size = 128.0M
150413 13:51:37 InnoDB: Completed initialization of buffer pool
150413 13:51:37 InnoDB: highest supported file format is Barracuda.
150413 13:51:37  InnoDB: Waiting for the background threads to start
150413 13:51:38 Percona XtraDB (http://www.percona.com) 5.5.40-MariaDB-36.1 started; log sequence number 42522283
150413 13:51:38 [Note] Plugin 'FEEDBACK' is disabled.
150413 13:51:38 [Note] Server socket created on IP: '10.11.101.2'.
150413 13:51:38 [Note] Event Scheduler: Loaded 0 events
150413 13:51:38 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.5.41-MariaDB-1ubuntu0.14.04.1'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  (Ubuntu)

6. 创建控制服务keystone、glance和nova的数据库

OpenStack各个组件均需要MySQL中的数据库配合,需要为各个服务创建相应的数据库。以下是创建keystone、glance和nova等数据库的过程:

# mysql -u root -popenstack;

CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystonedbUser'@'%' IDENTIFIED BY 'keystonedbPass';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystonedbUser'@'localhost' IDENTIFIED BY 'keystonedbPass';
CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glancedbUser'@'%' IDENTIFIED BY 'glancedbPass';
GRANT ALL PRIVILEGES ON glance.* TO 'glancedbUser'@'localhost' IDENTIFIED BY 'glancedbPass';
CREATE DATABASE nova;
GRANT ALL PRIVILEGES ON nova.* TO 'novadbUser'@'%' IDENTIFIED BY 'novadbPass';
GRANT ALL PRIVILEGES ON nova.* TO 'novadbUser'@'localhost' IDENTIFIED BY 'novadbPass';

上述脚本用于创建Keystone、Glance、Nova这3个组件运行时所需要的数据库;同时赋予数据库访问账户,如最后两行的意思是,用户可以在远程或本地(数据库服务器)主机上以用户名novadbUser与密码novadbPass访问名为nova的数据库。

3.4.3 RabbitMQ服务器的安装与配置

在OpenStack控制系统中,RabbitMQ为OpenStack整个控制系统提供消息队列服务。它和MySQL数据库服务一样,都属于控制系统基础服务。

1. 网络配置

Ubuntu下IP地址配置文件为/etc/network/interfaces,其内容如下:

# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.11.101.3
netmask 255.0.0.0

auto eth1
iface eth1 inet static
address 172.16.113.213
netmask 255.255.255.0
gateway 172.16.113.2
dns-nameservers 61.139.2.69

2. 软件安装

安装操作系统的软件包:

# apt-get install rabbitmq-server

修改系统默认用户guest的密码:

# rabbitmqctl change_password guest openstack

打开rabbitmq管理插件:

# rabbitmq-plugins enable rabbitmq_management

3. 服务启动

启动服务的命令如下:

# service rabbitmq-server restart

4. 运行验证

查看服务进程状态:

# ps -aux | grep rabbitmq-server

在结果中可以看到如下正在运行的进程:

rabbitmq 11745  0.0  0.0   4440   636 ?        S    Apr11   0:00 /bin/sh /usr/sbin/rabbitmq-server

查看服务监听端口:

# netstat -lntp

得到的结果如下:

tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN      11750/beam
tcp        0      0 0.0.0.0:25672           0.0.0.0:*               LISTEN      11750/beam
tcp6       0      0 :::5672                 :::*                    LISTEN      11750/beam
tcp6       0      0 :::4369                 :::*                    LISTEN      2017/epmd

注意 5672为RabbitMQ对外提供服务的监听端口,15672为对外提供的Web管理端口,25672与4369为RabbitMQ集群通信端口。

查看服务日志记录,其中服务启动日志/var/log/rabbitmq/startup_log的内容如下:

RabbitMQ 3.4.3. Copyright (C) 2007-2014 GoPivotal, Inc.
    ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
    ##  ##
    ##########  Logs: /var/log/rabbitmq/rabbit@Krabbitmq.log
    ######  ##        /var/log/rabbitmq/rabbit@Krabbitmq-sasl.log
    ##########
Starting broker... completed with 6 plugins.

查看服务运行状态日志/var/log/rabbitmq/rabbit@Krabbitmq.log,其内容如下:

=INFO REPORT==== 13-Apr-2015::14:01:31 ===
accepting AMQP connection <0.2301.0> (10.11.101.111:44190 -> 10.11.101.3:5672)

=INFO REPORT==== 13-Apr-2015::14:01:35 ===
accepting AMQP connection <0.2308.0> (10.11.101.111:44191 -> 10.11.101.3:5672)

3.4.4 Keystone服务器的安装与配置

Keystone负责为OpenStack控制系统提供用户以及各类公共服务的验证工作。

1. 网络配置

Ubuntu下IP地址配置文件为/etc/network/interfaces,其内容如下:

# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.11.101.4
netmask 255.0.0.0

auto eth1
iface eth1 inet static
address 172.16.113.214
netmask 255.255.255.0
gateway 172.16.113.2
dns-nameservers 61.139.2.69

2. 软件安装

安装操作系统的软件包:

# apt-get install keystone python-keystoneclient

3. 服务配置

Keystone服务配置文件为/etc/keystone/keystone.conf,其配置如下:

[DEFAULT]
admin_token = openstack
verbose = True
log_file = keystone.log
log_dir = /var/log/keystone
[database]
connection = mysql://keystonedbUser:keystonedbPass@10.11.101.2/keystone
[revoke]
driver = keystone.contrib.revoke.backends.sql.Revoke
[signing]
certfile = /etc/keystone/ssl/certs/signing_cert.pem
keyfile = /etc/keystone/ssl/private/signing_key.pem
ca_certs = /etc/keystone/ssl/certs/ca.pem
ca_key = /etc/keystone/ssl/private/cakey.pem
key_size = 2048
valid_days = 36500
cert_subject = /C=US/ST=Unset/L=Unset/O=Unset/CN=www.example.com
[ssl]
[token]
provider = keystone.token.providers.uuid.Provider
driver = keystone.token.persistence.backends.sql.Token
[trust]
[extra_headers]
Distribution = Ubuntu

4. 创建Keystone数据库中相关的表

创建Keystore数据库中相关表的代码如下:

# su -s /bin/sh -c "keystone-manage db_sync" keystone

5. 服务启动

启动服务的命令如下:

# service keystone restart

6. 增加定时清理token的cron脚本

正常情况下,Keystone将用户已经用过的token数据存储在MySQL数据库中。系统运行时间长了,数据库将变得越来越大,这将影响数据库的性能。因此,我们需要定期清理一些不需要的token数据记录,具体方法是创建一个周期运行的cron任务。

在/etc/crontab文件中添加cron任务:

20 *   * * *   root  /usr/bin/keystone-manage token_flush >> /var/log/keystone/keystone-tokenflush.log 2>&1

然后重启cron服务:

# service cron restart

7. 运行验证

查看服务进程状态:

# ps -e | grep keystone

在结果中可以看到如下正在运行的进程:

25265 ?        00:46:21 keystone-all
25271 ?        00:00:03 keystone-all
25272 ?        00:00:05 keystone-all
25273 ?        00:00:02 keystone-all
25274 ?        00:00:03 keystone-all

查看服务监听端口:

# netstat -lntp

在服务的监听端口中,可以看到Keystone向外提供的服务端口:

tcp        0      0 0.0.0.0:35357           0.0.0.0:*               LISTEN      25265/python
tcp        0      0 0.0.0.0:5000            0.0.0.0:*               LISTEN      25265/python

注意 35357为Keystone对外提供管理权限的身份认证监听端口,5000为Keystone对外提供身份认证的监听端口。

查看服务日志记录,其中日志记录文件为/var/log/keystone/keystone.log:

2015-04-13 14:40:24.595 28575 INFO keystone.common.environment.eventlet_server [-] Starting /usr/bin/keystone-all on 0.0.0.0:35357
2015-04-13 14:40:24.597 28575 INFO keystone.openstack.common.service [-] Starting 2 workers
2015-04-13 14:40:24.601 28575 INFO keystone.openstack.common.service [-] Started child 28581
2015-04-13 14:40:24.607 28581 INFO eventlet.wsgi.server [-] (28581) wsgi starting up on http://0.0.0.0:35357/
2015-04-13 14:40:24.610 28575 INFO keystone.openstack.common.service [-] Started child 28582
2015-04-13 14:40:24.615 28575 INFO keystone.common.environment.eventlet_server [-] Starting /usr/bin/keystone-all on 0.0.0.0:5000
2015-04-13 14:40:24.618 28582 INFO eventlet.wsgi.server [-] (28582) wsgi starting up on http://0.0.0.0:35357/
2015-04-13 14:40:24.619 28575 INFO keystone.openstack.common.service [-] Starting 2 workers
2015-04-13 14:40:24.623 28575 INFO keystone.openstack.common.service [-] Started child 28583
2015-04-13 14:40:24.633 28583 INFO eventlet.wsgi.server [-] (28583) wsgi starting up on http://0.0.0.0:5000/
2015-04-13 14:40:24.639 28584 INFO eventlet.wsgi.server [-] (28584) wsgi starting up on http://0.0.0.0:5000/
2015-04-13 14:40:24.632 28575 INFO keystone.openstack.common.service [-] Started child 28584

8. 查看租户信息

新建一个文件export_token,将以下两行代码写入该文件中:

export SERVICE_TOKEN=openstack
export SERVICE_ENDPOINT=http://10.11.101.4:35357/v2.0

SERVICE_TOKENSERVICE_ENDPOINT设置为当前环境变量以供后续使用:

# source export_token

查看系统租户:

# keystone tenant-list

由于系统现在还没有租户,故输出结果为一个空行。

3.4.5 租户、用户、角色、服务端点及用户身份环境变量

在进一步讲解操作之前,我们先介绍Keystone中租户(tenant)、用户(user)、角色(role)以及服务端点(service endpoint)的概念。

  • 租户与用户。在Keystone中,每个租户都是独立的资源组,用户是独立的用户名。用户可属于一个或多个租户,一个租户也可以有多个用户。而用户对租户的操作权限是由用户在租户所具有的角色来决定的。

  • 角色。对租户的操作是通过给用户赋予不同的角色来完成的,不同的角色在租户里面的权限不同。

    常用的角色为admin与_member_两种。在这两种角色的权限中,admin可以管理全局,_member_可以管理租户内部,即具备这个角色的人员可以在租户内部创建虚拟机。比如当赋给A用户admin权限时,则可以通过Horizon查看与管理云中所有的虚拟机、网络与存储信息;赋给A用户_member_权限时,则可以管理该用户所属组内的资源。

    注意 在OpenStack的不同版本中,使用的租户管理员角色名称不断变化,但基本上来说,这个角色的名称亦可以自己定义。即虽然官方文档使用user作为租户管理员默认的角色,但实际上我们仍可以使用member、_member、tenantManager等名称重新命名它。这些角色能起到什么作用,仍取决于policy.json文件中的定义。

  • 服务与端点。在OpenStack系统中,每种公共服务均有一个API服务,如glance-api、nova-api、cinder-api等,此服务主要用于接收各种请求,而这些请求均以基于HTTP或HTTPS的RESTful形式来提交。因而,系统中需要记录各种公共服务的RESTFul API的URL地址,这种地址信息在Keystone中是以某个服务的服务端点形式体现的。比如在图3-1所示的示例中,计算服务对应的URL地址是http://10.11.101.6:8774/v2/%(tenant_id)s

  • 用户身份环境变量。每一个操作OpenStack服务的用户,必须拥有合法的身份。在Linux环境中,这种身份通常以环境变量的形式表现,并最终输出到系统的环境变量中。比如,下面的环境变量记录admim用户的身份信息,通过export_admin文件形式记录,它表达了该用户在Keystone中登记的信息:

    export OS_TENANT_NAME=adminTenant
    export OS_USERNAME=admin
    export OS_PASSWORD=openstack
    export OS_AUTH_URL=http://10.11.101.4:5000/v2.0/
    
    

    上述环境表达了admin用户属于adminTenant租户,它的密码是openstack,这些用户信息需要提交给10.11.101.4:5000端口作验证,此IP与端口则指向云系统中的Keystone服务。

    当我们需要以admin用户来操作adminTenant租户时,需要将此环境变量输出到Linux系统中:

    # source export_admin
    
    

    这样,当我们使用nova list等命令查看虚拟机时,就能看到adminTenant租户下创建的虚拟机信息。当然,前提是我们在创建admin用户时,已经赋于它对adminTenant租户的user角色。

3.4.6 决定用户操作权限的policy.json文件

在OpenStack系统中,用户通过Keystone身份验证后能够做哪些操作的决定权则描述在policy.json文件中,此文件分散于每个组件的配置文件目录中,如/etc/nova 等目录下。

policy.json文件主要用user_idrole等方法来决定用户的权限能力范围,其内容如下:

"admin_or_owner":  "is_admin:True or project_id:%(project_id)s",
"default": "rule:admin_or_owner",

"cells_scheduler_filter:TargetCellFilter": "is_admin:True",

"compute:create": "",
"compute:create:attach_network": "",
"compute:create:attach_volume": "",
"compute:create:forced_host": "is_admin:True",
"compute:get_all": "",
"compute:get_all_tenants": "",
"compute:start": "rule:admin_or_owner",
"compute:stop": "rule:admin_or_owner",
"compute:unlock_override": "rule:admin_api",

基本上,policy.json使用如下3种方法来说明用户的能力。

  • project_id/user_id:用于限制租户内的成员共同操作还是以user_id为基础控制到每个人,如project_id:%(project_id)s这条语句中的project_id则代表租户,表达的条件是“具备相同租户id”的用户可以进行某种操作。

  • role:用于表示具备某种角色,如role:admin表示只有角色为admin的用户才能做的动作。

  • rule:用于表示用户需要满足某种条件方可做某种操作,如"compute:create:forced_host": "is_admin:True"则表示只有admin角色的用户才可以在指定的计算节点机器上创建虚拟机。

在很多时候,也会使用一个组合规则,如"admin_or_owner":"is_admin:True or project_id: %(project_id)s"则表示必须是admin或者租户内部的人员(具备相同的租户id)。

同时,我们也可以像在程序中使用变量那样来简化引用这种规则的过程,如:

"admin_or_owner":  "is_admin:True or project_id:%(project_id)s"

表示admin_or_owner将代表“是管理员或租户内部人员”这种权限,而我们可以用如下方式引用:

"compute:start": "rule:admin_or_owner",

即“是管理员或租户内部人员”才可以启动一台虚拟机。

通过重定义policy.json文件,可以达到更多限制用户权限的应用需要。

1. 创建租户、用户、角色及服务端点

操作Keystone时,同样需要验证操作者的身份。由于目前还没有创建用户,所以无法使用用户认证方式通过Keystone认证,只能使用我们配置在Keystone中的admin_token来表示身份。

新建一个文件export_token,将以下两行代码写入该文件中:

export SERVICE_TOKEN=openstack
export SERVICE_ENDPOINT=http://10.11.101.4:35357/v2.0

SERVICE_TOKENSERVICE_ENDPOINT设置为当前环境变量以供后续使用:

# source export_token

下面首先简要介绍一下如何创建租户、用户和角色。

创建adminTenant租户:

# keystone tenant-create --name adminTenant --description “admin tenant” --enabled true

创建admin用户:

# keystone user-create --tenant adminTenant --name admin --pass openstack --email admin@xinlixun.com --enabled true

创建admin角色:

# keystone role-create --name admin

adminTenant租户下为admin用户赋予admin角色:

# keystone user-role-add --user admin --role admin --tenant adminTenant

用以上的方法创建一系列租户、用户和角色,以及在相应的租户下为用户赋予一定的角色,具体如表3-1所示。

表3-1 创建的租户、用户和角色等

租户

用户

密码

邮箱

角色

serviceTenant

service_admin

service_pass

service@xinlixun.cn

admin

testTenant

testuser

testpass

testuser@xinlixun.cn

_member_

注意 serviceTenant是一个特殊的租户,它的用户主要用于OpenStack控制节点的服务配置。testTenant用于系统测试。

然后,创建服务及端点。

这里首先创建Keystone验证服务:

# keystone service-create --name=keystone --type=identity --description="Keystone"

创建Keystone服务的端点:

# keystone endpoint-create  --region RegionOne \
                            --service_id=$KEYSTONE_SERVICE_ID \
                            --publicurl http://10.11.101.4:5000/v2.0 \
                            --adminurl http://10.11.101.4:35357/v2.0 \
                            --internalurl http://10.11.101.4:5000/v2.0

接着创建Glance镜像服务:

# keystone service-create --name=glance --type=image --description="Glance"

创建Glance服务的端点:

# keystone endpoint-create  --region RegionOne \
                            --service_id=$GLANCE_SERVICE_ID \
                            --publicurl http:// 10.11.101.5:9292/v2 \
                            --adminurl http:// 10.11.101.5:9292/v2 \
                            --internalurl http:// 10.11.101.5:9292/v2

然后创建Nova计算服务:

# keystone service-create --name=nova --type=compute --description="Nova"

创建Nova服务的端点:

# keystone endpoint-create  --region RegionOne \
                            --service_id=$NOVA_SERVICE_ID \
                            --publicurl="http://10.11.101.6:8774/v2/%(tenant_id)s" \
                            --adminurl="http://10.11.101.6:8774/v2/%(tenant_id)s" \
                            --internalurl="http://10.11.101.6:8774/v2/%(tenant_id)s"

2. 作者提供的脚本

本书作者提供的脚本主要有两个文件:一是settings文件,用于记录一些基本信息;二是keystone.sh文件,用于自动生成租户、用户、服务等相关系统信息。settings文件需要设置成可执行的权限(权限设置为chmod 755 settings),其内容如下:

#!/bin/bash

# mysql
export MYSQL_SERVER_NAME="mysql"
export MYSQL_SERVER_IP="10.11.101.2"
export MYSQL_ROOT_PASS="openstack"

# rabbitmq
export RABBITMQ_SERVER_NAME="rabbitmq"
export RABBITMQ_SERVER_IP="10.11.101.3"
export RABBITMQ_SERVER_PASS="openstack"

# keystone
export KEYSTONE_SERVER_NAME="keystone"
export KEYSTONE_SERVER_IP="10.11.101.4"
export KEYSTONE_DB_ADMIN="keystonedbUser"
export KEYSTONE_DB_PASS="keystonedbPass"

# glance
export GLANCE_SERVER_NAME="glance"
export GLANCE_SERVER_IP="10.11.101.5"
export GLANCE_DB_ADMIN="glancedbUser"
export GLANCE_DB_PASS="glancedbPass"

# nova
export NOVA_SERVER_NAME="api"
export NOVA_SERVER_IP="10.11.101.6"
export NOVA_DB_ADMIN="novadbUser"
export NOVA_DB_PASS="novadbPass"

# Openstack ADMIN_TOKEN
export ADMIN_TOKEN="openstack"
export REGION="RegionOne"

# openstack keystone test user and tenant
export KEYSTONE_SYSTEM_ADMIN_USER_NAME="admin"
export KEYSTONE_SYSTEM_ADMIN_USER_PASS="openstack"
export KEYSTONE_SYSTEM_ADMIN_USER_EMAIL="admin@xinlixun.cn"
export KEYSTONE_SYSTEM_ADMIN_TENANT_NAME="adminTenant"
export KEYSTONE_SYSTEM_SERVICE_TENANT_NAME="serviceTenant"
export KEYSTONE_SYSTEM_TEST1_TENANT_NAME="testTenant"

export KEYSTONE_SYSTEM_TEST_USER_NAME="testuser"
export KEYSTONE_SYSTEM_TEST_USER_PASS="testpass"
export KEYSTONE_SYSTEM_TEST_USER_EMAIL="test@xinlixun.cn"

#-----------------------------------------------------
#keystone service user

export KEYSTONE_SERVICE_USER_NAME="service_admin"
export KEYSTONE_SERVICE_USER_PASS="service_pass"

export KEYSTONE_KEYSTONE_SERVICE_NAME="keystone"
export KEYSTONE_GLANCE_SERVICE_NAME="glance"
export KEYSTONE_NOVA_SERVICE_NAME="nova"

keystone.sh文件也需要设置成可执行的权限(chmod 755 keystone.sh),其内容如下:

#!/bin/bash
#keystone for kilo

. settings_v1.6.2_forkilo

# Initial data for Keystone using python-keystoneclient
# Target:
# To build a adminTenant includes many service and everyservice use
# admin/openstack user to autorize
#
# Tenant        User            Password        Roles
# ------------------------------------------------------------------
# adminTenant   admin           openstack      admin
# serviceTenant service_admin   service_pass   admin
# testTenant    testuser        testpass       _member_

# Tenant        service         type           description          Region
#-------------------------------------------------------------------
# serviceTenant keystone        identity       identity service     RegionOne
# serviceTenant glance          image          Image service        RegionOne
# serviceTenant nova            compute        Compute Service      RegionOne

# Keystone system env,support this scripts
export SERVICE_TOKEN=$ADMIN_TOKEN
export SERVICE_ENDPOINT="http://$KEYSTONE_SERVER_IP:35357/v2.0"
export KEYSTONE_REGION="$REGION"

function get_id () {
    echo `$@ | awk '/ id / { print $4 }'`
}

# Create Tenants
echo "############## create Tenant##############"

ADMIN_TENANT_ID=$(get_id keystone tenant-create --name=$KEYSTONE_SYSTEM_ADMIN_TENANT_NAME)
SERVICE_TENANT_ID=$(get_id keystone tenant-create --name=$KEYSTONE_SYSTEM_SERVICE_TENANT_NAME)

#following is for testing
TEST1_TENANT_ID=$(get_id keystone tenant-create --name=$KEYSTONE_SYSTEM_TEST1_TENANT_NAME)

########################################

# create users

echo "********create user***************"

ADMIN_USER_ID=$(get_id keystone user-create --name $KEYSTONE_SYSTEM_ADMIN_USER_NAME --pass=$KEYSTONE_SYSTEM_ADMIN_USER_PASS --email=$KEYSTONE_SYSTEM_ADMIN_USER_EMAIL)
TEST_USER_ID=$(get_id keystone user-create --name $KEYSTONE_SYSTEM_TEST_USER_NAME --pass=$KEYSTONE_SYSTEM_TEST_USER_PASS --email=$KEYSTONE_SYSTEM_TEST_USER_EMAIL --tenant-id $TEST1_TENANT_ID)

# Create Roles
echo "***********create roles************"

ADMIN_ROLE_ID=$(get_id keystone role-create --name=admin)

#the _member_ role already create by /etc/keystone/keystone.conf
MEMBER_ROLE_ID=$( keystone role-list | grep _member_ | awk '{print $2}')

echo "************GRANT admin user on admin role to all tenant except serviceTeant ***********"
echo "ADMIN_TENANT_ID:  " $ADMIN_TENANT_ID
echo "ADMIN_USER_ID:  " $ADMIN_USER_ID
echo "ADMIN_ROLE_ID:  " $ADMIN_ROLE_ID

echo "Let admin user could manage all the tenant: Add adminuser with adminRoles to all Tenants"
keystone user-role-add --user $ADMIN_USER_ID --tenant_id $ADMIN_TENANT_ID --role $ADMIN_ROLE_ID
keystone user-role-add --user $ADMIN_USER_ID --tenant_id $SERVICE_TENANT_ID --role $ADMIN_ROLE_ID
keystone user-role-add --user $ADMIN_USER_ID --tenant_id $TEST1_TENANT_ID --role $ADMIN_ROLE_ID

#########################################################################################################
echo "************create user service_admin on serviceTenant***********"

SERVICE_USER_ID=$(get_id keystone user-create --name $KEYSTONE_SERVICE_USER_NAME --pass=$KEYSTONE_SERVICE_USER_PASS --email=SERVICE@xinlixun.cn)
keystone user-role-add --tenant_id $SERVICE_TENANT_ID \
                       --user $SERVICE_USER_ID \
                       --role $ADMIN_ROLE_ID

#################################################################
# SERVICE IP,use to create endpoint

echo "************create service *********** to tenant"

NOVA_SERVICE_ID=$(get_id keystone service-create --name=$KEYSTONE_NOVA_SERVICE_NAME --type=compute --description="Nova")

GLANCE_SERVICE_ID=$(get_id keystone service-create --name=$KEYSTONE_GLANCE_SERVICE_NAME \
                                                   --type=image \
                                                   --description="Glance")

KEYSTONE_SERVICE_ID=$(get_id keystone service-create --name=$KEYSTONE_KEYSTONE_SERVICE_NAME \
                                                     --type=identity \
                                                     --description="Keystone")

echo "************create endpoint***********"

keystone endpoint-create --region $KEYSTONE_REGION \
                         --service_id=$NOVA_SERVICE_ID \
                         --publicurl="http://$NOVA_SERVER_IP:8774/v2/%(tenant_id)s" \
                         --adminurl="http://$NOVA_SERVER_IP:8774/v2/%(tenant_id)s" \
                         --internalurl="http://$NOVA_SERVER_IP:8774/v2/%(tenant_id)s"

keystone endpoint-create  --region $KEYSTONE_REGION \
                          --service_id=$GLANCE_SERVICE_ID \
                          --publicurl http://$GLANCE_SERVER_IP:9292/v2 \
                          --adminurl http://$GLANCE_SERVER_IP:9292/v2 \
                          --internalurl http://$GLANCE_SERVER_IP:9292/v2

keystone endpoint-create  --region $KEYSTONE_REGION \
                          --service_id=$KEYSTONE_SERVICE_ID \
                          --publicurl http://$KEYSTONE_SERVER_IP:5000/v2.0 \
                          --adminurl http://$KEYSTONE_SERVER_IP:35357/v2.0 \
                          --internalurl http://$KEYSTONE_SERVER_IP:5000/v2.0

echo "finished"

3.4.7 Glance服务器的安装与配置

Glance服务为OpenStack控制系统提供镜像服务,它主要用来管理和查询虚拟机所使用的镜像。通过Glance服务,不仅可以上传本地镜像至OpenStack服务器,还可将OpenStack系统的镜像下载至本地。Glance服务提供多种方式来存储系统镜像,其中本节主要使用最基本的本地文件存储方式。

1. 网络配置

Glance节点的IP地址配置(/etc/network/interfaces)如下:

# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.11.101.5
netmask 255.0.0.0

auto eth1
iface eth1 inet static
address 172.16.113.215
netmask 255.255.255.0
gateway 172.16.113.2
dns-nameservers 61.139.2.69

2. 软件安装

安装Glance相关的软件包:

# apt-get install glance python-glanceclient

3. 服务配置

Glance服务需要调整glance-api.conf、glance-registry.conf、glance-api-paste.ini以及glance-registry-paste.ini等几个配置文件,并创建glance数据库。

修改配置文件/etc/glance/glance-api.conf的内容,具体如下:

[DEFAULT]
verbose = True
bind_host = 0.0.0.0
bind_port = 9292
log_file = /var/log/glance/glance-api.log
backlog = 4096
container_formats = ami,ari,aki,bare,ovf,docker
registry_host = 0.0.0.0
registry_port = 9191
registry_client_protocol = http
notification_driver = noop
rabbit_host = localhost
rabbit_port = 5672
rabbit_use_ssl = false
rabbit_userid = guest
rabbit_password = openstack
rabbit_virtual_host = /
rabbit_notification_exchange = glance
rabbit_notification_topic = notifications
rabbit_durable_queues = False
...
delayed_delete = False
scrub_time = 43200
scrubber_datadir = /var/lib/glance/scrubber
image_cache_dir = /var/lib/glance/image-cache/
[oslo_policy]
[database]
backend = sqlalchemy
connection = mysql://glancedbUser:glancedbPass@10.11.101.2/glance
[oslo_concurrency]
[keystone_authtoken]
auth_host = 10.11.101.4
auth_port = 35357
auth_protocol = http
auth_uri = http://10.11.101.4:5000/v2.0
admin_tenant_name = serviceTenant
admin_user = service_admin
admin_password = service_pass
revocation_cache_time = 10
[paste_deploy]
config_file = /etc/glance/glance-api-paste.ini
flavor = keystone
[store_type_location_strategy]
[profiler]
[task]
[taskflow_executor]
[glance_store]
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
...

修改配置文件/etc/glance/glance-registry.conf的内容,具体如下:

[DEFAULT]
verbose = True
bind_host = 0.0.0.0
bind_port = 9191
log_file = /var/log/glance/glance-registry.log
backlog = 4096
api_limit_max = 1000
limit_param_default = 25
notification_driver = noop
rabbit_host = localhost
rabbit_port = 5672
rabbit_use_ssl = false
rabbit_userid = guest
rabbit_password = openstack
rabbit_virtual_host = /
rabbit_notification_exchange = glance
rabbit_notification_topic = notifications
rabbit_durable_queues = False
qpid_notification_exchange = glance
qpid_notification_topic = notifications
qpid_hostname = localhost
qpid_port = 5672
qpid_username =
qpid_password =
qpid_sasl_mechanisms =
qpid_reconnect_timeout = 0
qpid_reconnect_limit = 0
qpid_reconnect_interval_min = 0
qpid_reconnect_interval_max = 0
qpid_reconnect_interval = 0
qpid_heartbeat = 5
qpid_protocol = tcp
qpid_tcp_nodelay = True
[oslo_policy]
[database]
backend = sqlalchemy
connection = mysql://glancedbUser:glancedbPass@10.11.101.2/glance
[keystone_authtoken]
auth_host = 10.11.101.4
auth_port = 35357
auth_protocol = http
auth_uri = http://10.11.101.4:5000/v2.0
admin_tenant_name = serviceTenant
admin_user = service_admin
admin_password = service_pass
[paste_deploy]
config_file = /etc/glance/glance-registry-paste.ini
flavor = keystone
[profiler]

修改配置文件/etc/glance/glance-registry-paste.ini,在[filter:authtoken]部分加入以下配置:

service_port = 5000
service_host = 10.11.101.4
auth_port = 35357
auth_host = 10.11.101.4
auth_portocol = http
admin_tenant_name = serviceTenant
admin_user = service_admin
admin_password = service_pass

4. 创建glance数据库中相关的表

创建glance数据库中相关表的代码如下:

# su -s /bin/sh -c "glance-manage db_sync" glance

5. 服务启动

启动服务的代码如下:

# service glance-api restart && service glance-registry restart

6. 运行验证

查看服务进程状态:

# ps -e | grep glance

在结果中可以看到如下正在运行的进程:

25707 ?        00:43:49 glance-api
25726 ?        00:00:00 glance-registry
25736 ?        00:00:01 glance-registry
25737 ?        00:00:15 glance-api

查看Glance相关服务的监听端口:

# netstat -lntp

在输出结果中,可以看到Glance向外提供的服务端口:

tcp        0      0 0.0.0.0:9191            0.0.0.0:*               LISTEN      25726/python
tcp        0      0 0.0.0.0:9292            0.0.0.0:*               LISTEN      25707/python

查看glance-api服务日志/var/log/glance/glance-api.log:

2015-04-13 14:43:14.574 28527 INFO glance.common.wsgi [-] Starting 1 workers
2015-04-13 14:43:14.578 28527 INFO glance.common.wsgi [-] Started child 28533
2015-04-13 14:43:14.582 28533 INFO eventlet.wsgi.server [-] (28533) wsgi starting up on http://0.0.0.0:9292/

查看glance-registry服务日志/var/log/glance/glance-registry.log:

2015-04-13 14:44:22.419 28561 INFO glance.common.wsgi [-] Starting 1 workers
2015-04-13 14:44:22.425 28561 INFO glance.common.wsgi [-] Started child 28567
2015-04-13 14:44:22.428 28567 INFO eventlet.wsgi.server [-] (28567) wsgi starting up on http://0.0.0.0:9191/

7. 上传镜像

在使用Glance之前,需要通过Keystone认证获取到token,然后使用token访问Glance服务。前面在Keystone中已经通过脚本创建了glance账户,此处可以使用glance用户来通过Keystone认证。

(1) 设置export_admin文件,将以下几行代码写入该文件中:

export OS_TENANT_NAME=adminTenant
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://10.11.101.4:35357/v2.0/
export OS_REGION_NAME=RegionOne

(2) 将glance账户验证的相关信息设置为环境变量:

# source export_admin

(3) 下载网络上已经制作完整的OpenStack镜像:

wget http://uec-images.ubuntu.com/releases/12.04.2/release/ubuntu-12.04.2-server-cloudimg-amd64-disk1.img

(4) 上传镜像至glance-server中:

# glance image-create --is-public true --disk-format qcow2 --container-format bare --name "Ubuntu" < ubuntu-12.04.2-server-cloudimg-amd64-disk1.img

注意,这里使用了网络下载的镜像,也可上传本地镜像至Glance服务器。

8. 查看镜像

查看镜像的代码如下:

# glance image-list

3.4.8 Nova API节点的安装与配置

Nova API服务是OpenStack控制系统的核心计算服务,通过它来管理和控制整个OpenStack系统,以及调度和管理虚拟机。它提供了一系列API来控制和管理系统中的虚拟机,同时它也控制中心,通过它可以调用系统中的其他服务。

在Nova API服务器中,我们主要会同时安装以下服务。

  • nova api:该服务主要用于接收和响应外部请求,它支持OpenStack API、Amazon EC2 API等。

  • nova-cert:该服务主要用于Nova证书管理服务,用来为EC2服务提供身份验证。

  • nova-scheduler:该服务主要用于调度工作,在创建虚拟机时,由它调度分配的计算节点。

  • nova-conductor:该服务为计算节点访问数据库时的一个中间件,它防止计算节点的nova-compute服务直接访问数据库带来的性能问题。

  • nova-consoleauth:该服务主要用于授权用户访问和使用控制台。

  • nova-novncproxy:该服务主要用于为用户访问虚拟机提供一个VNC代理功能。

  • nova-spiceproxy:该服务主要用于为用户访问虚拟机提供一个SPICE协议代理功能。

1. 网络配置

Nova API节点的IP地址配置(/etc/network/interfaces)如下:

# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.11.101.6
netmask 255.0.0.0

auto eth1
iface eth1 inet static
address 172.16.113.216
netmask 255.255.255.0
gateway 172.16.113.2
dns-nameservers 61.139.2.69

2. 时间服务

如果Nova API控制服务器与计算服务器间的时间不一致且相差太大,会导致Nova API控制节点认为计算节点服务失效,意即API认为Compute节点服务处于不可用状态,这样如果我们发出创建虚拟机的指令,Scheduler就不会将虚拟机创建到不可用的计算节点上。

因此,在OpenStack安装中,会在Nova API节点上安装时间服务(NTP),计算节点则以Nova API节点上的时间为基准来校正自身的时间。

在我们的示范中,API与Compute节点的时间服务直接指向了国家时间服务中心的IP地址:210.72.145.44。

为了确保整个云系统中各个服务的时间一致,较好的做法是,建立独立的时间服务器,云系统中所有的服务器均以此为时间基准。

(1) 安装NTP服务:

# apt-get install NTP

(2) 配置NTP服务,相关配置文件/etc/ntp.conf如下:

server cn.pool.ntp.org iburst
restrict -4 default kod notrap nomodify
restrict -6 default kod notrap nomodify

(3) 更新时间:

# service ntp stop
# ntpdate 210.72.145.44

(4) 重启NTP服务:

# service ntp restart

注意,在制作虚拟机镜像时,所有的服务均以nova-api节点的时间为基础。

3. 软件安装

Nova控制节点部署相关的服务主要包括nova-api、nova-cert、nova-common、nova-conductor、nova-consoleauth、nova-novncproxy、nova-scheduler等。

安装nova控制节点服务的相关软件包:

# apt-get install nova-api nova-cert nova-conductor nova-consoleauth nova-novncproxy nova-spiceproxy nova-scheduler python-novaclient

4. 服务配置

此环境中的服务网络模式为nova-network模式的FlatDHCP网络,修改配置文件/etc/nova/ nova.conf的内容,具体如下:

[oslo_messaging_rabbit]
rabbit_host=10.11.101.3
rabbit_userid=guest
rabbit_password=openstack

[oslo_concurrency]
lock_path=/run/lock/nova

[DEFAULT]
logdir=/var/log/nova
state_path=/var/lib/nova
verbose=True
debug=False

api_paste_config=/etc/nova/api-paste.ini
compute_scheduler_driver=nova.scheduler.simple.SimpleScheduler

enabled_apis = ec2, osapi_compute, metadata
nova_url=http://10.11.101.6:8774/v1.1/
root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf

osapi_compute_workers=1

# Auth
use_deprecated_auth=false
auth_strategy=keystone

# Network settings
dhcpbridge_flagfile=/etc/nova/nova.conf
dhcpbridge=/usr/bin/nova-dhcpbridge
firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver
network_manager=nova.network.manager.FlatDHCPManager
flat_interface=eth1
flat_interface=eth2
flat_network_bridge=br100
flat_injected=False
force_dhcp_release=true

fixed_range=192.168.50.0/24
flat_network_dhcp_start=192.168.50.2
floating_range=60.12.206.32/27

network_size=1
multi_host=true

#metadata
metadata_host = 10.11.101.6
metadata_listen = 0.0.0.0
metadata_listen_port = 8775

# Compute #
compute_driver=libvirt.LibvirtDriver

# Cinder #
volume_api_class=nova.volume.cinder.API

vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = 172.16.113.216

#icehouse move keystone authtoken to nova.conf
[keystone_authtoken]
auth_uri = http://10.11.101.4:5000/v2.0
identity_uri = http://10.11.101.4:35357
admin_tenant_name = serviceTenant
admin_user = service_admin
admin_password = service_pass

[database]
connection=mysql://novadbUser:novadbPass@10.11.101.2/nova

[glance]
host = 10.11.101.5

修改配置文件/etc/nova/api-paste.ini,在[filter:authtoken]部分加入以下配置:

service_port = 5000
service_host = 10.11.101.4
auth_port = 35357
auth_host = 10.11.101.4
auth_portocol = http
admin_tenant_name = serviceTenant
admin_user = service_admin
admin_password = service_pass

5. 创建nova数据库中相关的表

创建nova数据库中相关的表:

# su -s /bin/sh -c "nova-manage db sync" nova

6. 服务启动

确保nova用户及组对/etc/nova及/var/lib/nova目录拥有完全的权限:

# chown --R nova:nova /etc/nova
# chown --R nova:nova /var/lib/nova

重启nova相关的服务:

# service nova-api  restart
# service nova-cert restart
# service nova-consoleauth restart
# service nova-scheduler restart
# service nova-conductor restart
# service nova-novncproxy restart
# service nova-spiceproxy restart

7. 运行验证

运行验证主要包括进程状态查看、服务端口监听与服务日志记录这几部分。

(1) 查看服务进程状态:

# ps -e | grep nova

在结果中可以看到如下正在运行的进程:

29074 ?        00:00:02 nova-api
29097 ?        00:00:04 nova-cert
29120 ?        00:01:27 nova-conductor
29141 ?        00:00:44 nova-consoleaut
29164 ?        00:00:01 nova-novncproxy
29175 ?        00:00:00 nova-api
29188 ?        00:00:05 nova-scheduler
29201 ?        00:00:44 nova-api
29209 ?        00:00:00 nova-api
29674 ?        00:00:00 nova-spicehtml5

(2) 查看nova控制服务监听端口:

# netstat -lntp

在输出结果中,可以看到nova向外提供的服务端口:

tcp       0     0 0.0.0.0:6080          0.0.0.0:*       LISTEN      3358/python
tcp       0     0 0.0.0.0:6082          0.0.0.0:*       LISTEN      3358/python
tcp       0     0 0.0.0.0:8773          0.0.0.0:*       LISTEN      3138/python
tcp       0     0 0.0.0.0:8774          0.0.0.0:*       LISTEN      3138/python
tcp       0     0 0.0.0.0:8775          0.0.0.0:*       LISTEN      3138/python

注意,Nova API各服务端口的作用如下所示。

  • 6080:nova-novncproxy服务,用于VNC连接。

  • 6082:nova-spiceproxy服务,用于SPICE连接。

  • 8773:nova-cert服务,主要用于EC2服务。

  • 8774:nova-api服务。

  • 8775:nova-api metadata服务。

(3) 查看nova控制服务日志记录,相关文件/var/log/nova/nova-api.log如下:

2015-04-13 14:50:39.061 958 INFO nova.wsgi [-] ec2 listening on 0.0.0.0:8773
2015-04-13 14:50:39.062 958 INFO nova.openstack.common.service [-] Starting 1 workers
2015-04-13 14:50:39.064 958 INFO nova.openstack.common.service [-] Started child 964
2015-04-13 14:50:39.072 964 INFO nova.ec2.wsgi.server [-] (964) wsgi starting up on http://0.0.0.0:8773/
2015-04-13 14:50:39.488 958 INFO nova.api.openstack [-] V3 API has been disabled by configuration
2015-04-13 14:50:39.741 958 INFO nova.api.openstack [-] V3 API has been disabled by configuration
2015-04-13 14:50:39.743 958 INFO nova.wsgi [-] osapi_compute listening on 0.0.0.0:8774
2015-04-13 14:50:39.744 958 INFO nova.openstack.common.service [-] Starting 1 workers
2015-04-13 14:50:39.747 958 INFO nova.openstack.common.service [-] Started child 965
2015-04-13 14:50:39.754 958 INFO nova.network.driver [-] Loading network driver 'nova.network.linux_net'
2015-04-13 14:50:39.753 965 INFO nova.osapi_compute.wsgi.server [-] (965) wsgi starting up on http://0.0.0.0:8774/
2015-04-13 14:50:40.028 958 INFO nova.wsgi [-] metadata listening on 0.0.0.0:8775
2015-04-13 14:50:40.029 958 INFO nova.openstack.common.service [-] Starting 1 workers
2015-04-13 14:50:40.033 958 INFO nova.openstack.common.service [-] Started child 972
2015-04-13 14:50:40.041 972 INFO nova.metadata.wsgi.server [-] (972) wsgi starting up on http://0.0.0.0:8775/

查看nova-scheduler服务日志记录/var/log/nova/nova-scheduler.log:

2015-04-13 14:56:25.582 1068 INFO nova.service [-] Starting scheduler node (version 2015.1-b3)
2015-04-13 14:56:25.627 1068 INFO oslo_messaging._drivers.impl_rabbit [req-5a100f45-1ec9-4906-af1b-3abb9230f742 - - - - -] Connecting to AMQP server on 10.11.101.3:5672
2015-04-13 14:56:25.658 1068 INFO oslo_messaging._drivers.impl_rabbit [req-5a100f45-1ec9-4906-af1b-3abb9230f742 - - - - -] Connected to AMQP server on 10.11.101.3:5672

8. 查看租户虚拟机信息

虽然目前系统还没有创建虚拟机,但我们可以使用nova 客户端执行相关命令来验证nova-api服务是否正常运行。

创建环境变量文件export_admin,其内容如下:

export OS_TENANT_NAME=adminTenant
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://10.11.101.4:5000/v2.0

然后设置当前环境的用户变量并访问Nava API服务:

# source export_admin
# nova list
+----+------+--------+------------+-------------+----------+
| ID | Name | Status | Task State | Power State | Networks |
+----+------+--------+------------+-------------+----------+
+----+------+--------+------------+-------------+----------+

3.4.9 Horizon服务器的安装与配置

Horizon服务用于为OpenStack提供一个Web管理界面。使用Horizon服务,可以完成大部分命令行操作,简化了云系统的管理工作。

1. 网络配置

Horizon节点的IP地址配置(/etc/network/interfaces)如下:

# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.11.101.10
netmask 255.0.0.0

auto eth1
iface eth1 inet static
address 172.16.113.210
netmask 255.255.255.0
gateway 172.16.113.2
dns-nameservers 61.139.2.69

2. 软件安装

安装Horizon相关的软件包:

# apt-get install openstack-dashboard apache2 libapache2-mod-wsgi memcached python-memcache

3. 服务配置

服务配置需要修改的配置文件/etc/openstack-dashboard/local_settings.py的部分内容如下:

......
WEBROOT = '/'
ALLOWED_HOSTS = ['*']
......
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
......
OPENSTACK_HOST = "10.11.101.4"
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v2.0" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "_member_"

4. 服务启动

启动服务的命令如下:

# service apache2 restart
# service memcached restart

5. 运行验证

运行验证主要包括进程状态查询、服务端口监听与服务日志记录这几部分。

(1) 查看服务进程状态:

# ps -e | grep apache2

在结果中可以看到如下正在运行的进程:

1490 ?        00:00:00 apache2
1672 ?        00:00:02 apache2
1673 ?        00:00:01 apache2
1674 ?        00:00:02 apache2
1675 ?        00:00:00 apache2
1676 ?        00:00:00 apache2

# ps -e | grep memcache

在结果中可以看到如下正在运行的进程:

882 ?        00:00:00 memcached

(2) 查看Horizon服务监听端口:

# netstat -lntp

在输出结果中,可以看到Horizon向外提供的服务端口:

tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN      882/memcached
tcp6       0      0 :::80                   :::*                    LISTEN      1490/apache2

注意,在上面的输出结果中可以看到Apache2服务为向外提供的服务端口,memcached服务的11211为内部服务端口。

(3) 查看Horizon服务的日志记录,相关文件/var/log/apache2/access.log如下:

192.168.111.21 - - [17/Apr/2015:13:29:27 +0800] "GET /horizon/i18n/js/horizon/ HTTP/1.1" 200 5627 "http://172.16.113.210/horizon/settings/None" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"
192.168.111.21 - - [17/Apr/2015:13:29:29 +0800] "GET /horizon/settings/None HTTP/1.1" 404 8091 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"

查看Apache2服务访问日志记录,相关文件/var/log/apache2/error.log如下:

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.11.101.10. Set the 'ServerName' directive globally to suppress this message
[Fri Apr 17 13:28:30.834517 2015] [mpm_event:notice] [pid 1490:tid 140262824945536] AH00489: Apache/2.4.7 (Ubuntu) mod_wsgi/3.4 Python/2.7.6 configured -- resuming normal operations
[Fri Apr 17 13:28:30.834547 2015] [core:notice] [pid 1490:tid 140262824945536] AH00094: Command line: '/usr/sbin/apache2'
[Fri Apr 17 00:28:47.989549 2015] [:error] [pid 1673:tid 140262704531200] Login successful for user "admin".

6. 访问Horizon Web页面

通过浏览器访问http://172.16.113.210/horizon,用户名为admin,密码为openstack,则可进入Horizon Web管理界面,并可进一步进行各种操作,如图3-2所示。

{%}

图 3-2 Horizon Web管理界面

3.5 OpenStack基本服务运行简要验证

通过上述安装后,正常情况下每个服务都是独立正常运行的,那么怎么知道各个服务间是如何相互协作运行的呢?

在没有创建虚拟机以前,可以通过nova 客户端软件来验证(以下操作在nova-api节点上进行):

# source export_admin
# nova image-list

输出结果如图3-3所示。

{%}

图 3-3 输出结果

注意,以上镜像为glance下的镜像。

通过使用nova image-list命令显示的镜像信息表明:

  • Nova 与 Keystone间运行协作正常;

  • Nova 与 Glance 间运行协作正常,Glance与Keystone间协作正常。

3.6 小结

本章主要介绍基于Kilo版本的OpenStack基本控制服务的多点部署。通过学习本章,我们基本可以部署一个分式的多节点的基础控制系统。同时通过安装与使用OopenStack基本控制服务,可以更加深入地了解控制系统的内部动作原理。

本章之所以选择最基础的6个组件,是因为对于初学者来说,先从基础组件来学习OpenStack将会有更好的帮助,同时在此基础之上学习其他组件也更加快速,且学习过程更加轻松。另一方面,对于很多希望学习与应用OpenStack作为企业云计算的企业来说,这6个组件构成的系统基本上可以满足虚拟化/私有云的应用要求。

3.7 参考资源

本章的参考资源详见http://docs.openstack.org/kilo/install-guide/install/apt/content/

目录