Openstack 是目前世界上增长最快速的开源软件之一,提供了基础设施即服务 (IaaS) 解决方案,是除亚马逊 AWS 和微软的 Azure 之外的最重要的云计算产品。来自于一百多个国家的数万开发技术人员和云计算专家工作在 Openstack 社区,为包括公有云和私有云在内的云计算平台提供各种解决方案,制定相关的技术标准。
Openstack 由多个核心开源项目组成,主要有以下:
计算服务(Compute)- Nova
对象存储(Object Storage)- Swift
镜像服务(Image)- Glance
身份服务(Identity)- Keystone
网络服务(Network)- Neutron
随着 Openstack 不断发展,还有很多新的项目被加入,这里就不一一介绍了。(具体见参考资源一)。
身份服务(Identity)- Keystone 是 Openstack 核心开源项目中的最重要的组件之一,自从 Openstack Essex 发布的时候就被采用(具体见参考资源二)。
它是为 Openstack 的其他核心组件,诸如计算、存储等提供用户认证、令牌、策略和目录服务的,它本身并不提供这些功能,只是一个抽象层,类似于封装器,用来集成具体的插件,例如,PAM(Pluggable Authentication Module),LDAP 或者 OAuth。通过这些插件,它能够实现多种形式的身份验证。
Keystone 缺省是使用内置的 Eventlet 服务器来运行的,Eventlet 本身非常简单易用,但是它已经缺失了很多早已经实现的、基于互联网的网络服务器的安全功能,所以从安全性考虑,随着 Openstack 最新的版本 Kilo 发布以后,不建议使用 Eventlet 来启动 Keystone,推荐使用 Apache HTTPD。而对于使用 EventLet 的支持将从 Openstack 的 Mitaka 版本中彻底移除。
那如何使用 HTTPD 来运行 Keystone,过程如下:
注意:以下所有操作均在 Red Hat Enterprise Linux 7 上运行。
注意:必须要有 RHEL 的 yum repo 的支持。(具体见参考资源五)
yum install openstack-keystone python-openstackclient
Keystone 的配置文件一般是 /etc/keystone/keystone.conf
1.首先需要先产生一个随机数,用作初始配置时的管理员令牌
# openssl rand -hex 10 5eb4014ecffaa4f053b5
2.编辑/etc/keystone/keystone.conf,在 DEFAULT 段落定义刚刚得到的管理员令牌
[DEFAULT] … admin_token = ADMIN_TOKEN
3.在 token 段落定义令牌供应和后台驱动器
[token] … provider = keystone.token.providers.uuid.Provider driver = keystone.token.persistence.backends.sql.Token
4.在 signing 段落定义算法
[signing] … token_format = UUID
注意:假定使用 MariaDB(自 RHEL 7 以后,MariaDB 是 yum repo 中缺省数据库),并且已经安装好。如果没有安装,需要先行安装,并且配置相关文件,启动数据库服务
yum install mariadb-server MySQL-python … systemctl enable mariadb.service systemctl start mariadb.service
1.创建 Keystone 数据库
mysql -u root -p mysql> CREATE DATABASE keystone
2.创建 Keystone 用户并授权
mysql> GRANT ALL PRIVILEGES ON keystone.* TO ’keystone’@‘localhost’ IDENTIFIED BY ‘KEYSTONE_DBPASS’; mysql> GRANT ALL PRIVILEGES ON keystone.* TO ‘keystone’@‘%’ IDENTIFIED BY ‘KEYSTONE_DBPASS’; mysql> FLUSH PRIVILEGES;
1.编辑/etc/keystone/keystone.conf,在 database 段落定义数据库存取
[database] … connection = mysql://keystone:KEYSTONE_DBPASSWORD@/ CONTROLLER_NODE_IP/keystone?charset=utf8
注意: CONTROLLER_NODE_IP
需要设置成正确的控制节点的 IP 地址
2.同步 Keystone 数据库
keystone-manage db_sync
yum install httpd mod_wsgi
1.首先需要在正确的 HTTPD 的配置文件目录下面创建一个 wsgi-keystone.conf。
Listen 5000 Listen 35357 <VirtualHost *:5000> WSGIDaemonProcess keystone-public processes=5 threads=1 user= keystone group=keystone display-name=%{GROUP} WSGIProcessGroup keystone-public WSGIScriptAlias / /var/www/cgi-bin/keystone/main WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On <IfVersion >= 2.4> ErrorLogFormat "%{cu}t %M" </IfVersion> ErrorLog /var/log/httpd/keystone.log CustomLog /var/log/httpd/keystone_access.log combined </VirtualHost> <VirtualHost *:35357> WSGIDaemonProcess keystone-admin processes=5 threads=1 user= keystone group=keystone display-name=%{GROUP} WSGIProcessGroup keystone-admin WSGIScriptAlias / /var/www/cgi-bin/keystone/admin WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On <IfVersion >= 2.4> ErrorLogFormat "%{cu}t %M" </IfVersion> ErrorLog /var/log/httpd/keystone.log CustomLog /var/log/httpd/keystone_access.log combined </VirtualHost>
注意:一般情况下,HTTPD 的配置文件目录是 /etc/httpd/conf.d
,但也有例外的,需要结合具体系统安装而定。
注意:这个文件可以手工编写,或者从步骤一安装 Keystone 的软件源代码里面去拷贝一份,一般是在 /usr/share/keystone/wsgi-keystone.conf.
注意:用户和组在步骤一就已经被创建出来了,用户和组一定要设置正确;存放日志文件的路径一定要设置正确;进程数目是可以调节的,取决于系统的硬件资源多少。
2.创建目录用来存放 WSGI 组件
mkdir -p /var/www/cgi-bin/keystone
3.从步骤一中安装的 Keystone 软件源代码中把 WSGI 组件拷贝到新创建的目录中,一般是/usr/share/keystone/keystone.wsgi
cp /usr/share/keystone/keystone.wsgi /var/www/cgi-bin/keystone/admin cp /usr/share/keystone/keystone.wsgi /var/www/cgi-bin/keystone/main
4.给新创建的目录和文件正确的用户、组和权限
chown -R keystone:keystone /var/www/cgi-bin/keystone chmod 755 /var/www/cgi-bin/keystone/*
systemctl enable httpd.service systemctl start httpd.service systemctl status httpd.service ... httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since Wed 2015-07-15 17:50:06 CDT; ... CGroup: /system.slice/httpd.service 651 /usr/sbin/httpd -DFOREGROUND 653 (wsgi:keystone- -DFOREGROUND 654 (wsgi:keystone- -DFOREGROUND 656 (wsgi:keystone- -DFOREGROUND 658 (wsgi:keystone- -DFOREGROUND ...
到这一步结束,Keystone 的所有服务均已经正常启动。
注意:接下来的步骤并不是本文所重点关注的内容,即使使用 Eventlet 服务器也需要。考虑到文章的完整性,还是在这里加以阐述。
现在的 Keystone 还不能响应别的服务的请求,是因为数据库里面还没有任何信息,需要继续完成最后的配置工作。
1.设置 OS_URL 和 OS_TOKEN
export OS_URL=http://CONTROLLER_NODE_IP:35357/v2.0 export OS_TOKEN=ADMIN_TOKEN
注意: ADMIN_TOKEN 就是在步骤二中设置在 /etc/keystone/keystone.conf
2.创建服务实体和 API 端点
openstack service create --name keystone --description "Keystone Identity Service" identity +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | OpenStack Identity | | enabled | True | | id | 4ddaae90388b4ebc9d252ec2252d8d10 | | name | keystone | | type | identity | +-------------+----------------------------------+ openstack endpoint create / --publicurl http://CONTROLLER_NODE_IP:5000/v2.0 / --internalurl http://CONTROLLER_NODE_IP:5000/v2.0 / --adminurl http://CONTROLLER_NODE_IP:35357/v2.0 / --region RegionOne identity +--------------+------------------------------------------+ | Field | Value | +--------------+------------------------------------------+ | adminurl | http://CONTROLLER_NODE_IP:35357/v2.0 | | id | 4a9ffc04b8eb4848a49625a3df0170e5 | | internalurl | http://CONTROLLER_NODE_IP:5000/v2.0 | | publicurl | http://CONTROLLER_NODE_IP:5000/v2.0 | | region | RegionOne | | service_id | 4ddaae90388b4ebc9d252ec2252d8d10 | | service_name | keystone | | service_type | identity | +--------------+------------------------------------------+
创建 admin 项目
openstack project create --description "Admin Project" admin +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Admin Project | | enabled | True | | id | cf12a15c5ea84b019aec3dc45580896b | | name | admin | +-------------+----------------------------------+
创建 service 项目
openstack project create --description "Service Project" service +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Service Project | | enabled | True | | id | 55cbd79c0c014c8a95534ebd16213ca1 | | name | service | +-------------+----------------------------------+
创建 admin 用户
openstack user create --password ADMIN_PASSWORD admin +------------+----------------------------------+ | Field | Value | +------------+----------------------------------+ | email | None | | enabled | True | | id | 4d411f2291f34941b30eef9bd797505a | | name | admin | | username | admin | +------------+----------------------------------+
创建 admin 角色
openstack role create admin +-------+----------------------------------+ | Field | Value | +-------+----------------------------------+ | id | cd2cb9a39e874ea69e5d4b896eb16128 | | name | admin | +-------+----------------------------------+
把角色 admin 加入到项目 admin 和用户 admin 中。
openstack role add --project admin --user admin admin +-------+----------------------------------+ | Field | Value | +-------+----------------------------------+ | id | cd2cb9a39e874ea69e5d4b896eb16128 | | name | admin | +-------+----------------------------------+
如果还想创建别的数据,可以按需操作。
因为安全性的考虑,一般建议现在可以取消初始化配置的管理员安全令牌机制。
编辑文件/etc/keystone/keystone-paste.ini.
在 pipeline:public_api、pipeline:admin_api 和 pipeline:api_v3 这三个段落中删除 admin_token_auth.
复位 OS_TOKEN 和 OS_URL:
unset OS_TOKEN OS_URL
由于很多命令都需要带很长的参数,一般建议把这些环境变量写入到一个文件中。
创建 keystone_rc 文件,在其中加入以下的选项:
export OS_PROJECT_DOMAIN_ID=default export OS_USER_DOMAIN_ID=default export OS_PROJECT_NAME=admin export OS_TENANT_NAME=admin export OS_USERNAME=admin export OS_PASSWORD=ADMIN_PASSWORD export OS_AUTH_URL=http://CONTROLLER_NODE_IP:35357
装入 keystone_rc 文件:
source keystone_rc
执行以下命令验证 Keystone 否可以工作:
openstack token issue +------------+----------------------------------+ | Field | Value | +------------+----------------------------------+ | expires | 2015-08-26T04:25:58.669478Z | | id | de5be235afff46c4b3d225dfae06cf00 | | project_id | 1641ce674b7c4e99a1fb29760b1635f4 | | user_id | 6bed1eb1b2574aa1a6d189cf4278bb9f | +------------+----------------------------------+ openstack service list +----------------------------------+----------+----------+ | ID | Name | Type | +----------------------------------+----------+----------+ | a1cd48a281634e32afbd1977cd2e6e66 | keystone | identity | +----------------------------------+----------+----------+ openstacl project list +----------------------------------+---------+ | ID | Name | +----------------------------------+---------+ | 1641ce674b7c4e99a1fb29760b1635f4 | admin | | dcfadbae7e4a4928bfd100c07f6a1550 | service | +----------------------------------+---------+
至此,Keystone 可以正常和其他 Openstack 的核心组件一起工作了。
限于篇幅,还有一些细节未能在这里展开,例如,如何配置公钥机制 PKI(Public Key Infrastructure);如何配置 SSL。有兴趣的读者可以自己先行研究一下。
Openstack 的更新变化非常快,新旧功能的交替已经成为常态化,希望本文对工作学习在云计算领域的读者了解新动向有所裨益。