摘要

在 OpenStack 的各个服务中,KeyStone 扮演着核心的身份认证角色。本节我们将部署 KeyStone 服务,为整个云平台建立起统一的“通行证”机制。

实验架构

实验架构
实验架构

  • 虚拟机1:控制节点
    • 操作系统: CentOS 7.9
    • 配置: 4 CPU,40GB+ 硬盘,8GB 内存
    • 角色: 控制节点、网络节点和对象存储节点
  • 虚拟机2:计算节点
    • 操作系统: CentOS 7.9
    • 配置: 2 CPU,40GB+ 硬盘,4GB 内存
    • 角色: 计算节点、网络节点、对象存储和块存储节点

KeyStone 组件简介

Keystone 是 OpenStack 的身份认证与权限管理组件,可以理解为整个 OpenStack 平台的“统一登录和门禁系统”。

用户在访问 Nova、Neutron、Glance 等服务之前,需要先通过 Keystone 验证身份;认证成功后,Keystone 会为用户签发 Token(令牌),其他组件根据该令牌判断用户是否具有相应的访问权限。Keystone 还负责管理 OpenStack 中的用户、项目、角色和服务目录,明确“谁可以访问哪些资源、具有什么权限,以及各个服务的访问地址”。

因此,在搭建 OpenStack 时,Keystone 通常是最先部署和配置的核心组件之一,后续 Nova、Glance、Neutron 等服务都需要在 Keystone 中完成服务注册、用户创建和 Endpoint 配置。

提示:什么是 Endpoint?

端点(Endpoint)本质上就是一个网络访问地址(URL)。在 OpenStack 中,不同的服务都会在 KeyStone 中注册自己的 Endpoint,方便其他组件或用户找到并调用它们。

环境准备

  1. 开启电脑上的 VMnet1 和 VMnet8 两块网卡;
  2. 在 VMware 中开启 controller 节点,并使用 MoboXTerm 进行连接;
  3. 执行以下命令对实验环境进行初始化:
curl -s http://192.168.192.205/scripts/env3-1-local.sh | bash

一、数据库创建和授权

在安装配置 KeyStone 前,需要先在 MariaDB 中为其创建专属数据库,并进行相应的权限配置。

连接到数据库服务器:

以 root 用户身份连接,输入在环境准备阶段设置的 MariaDB 密码。

mysql -u root -p

创建 keystone 数据库:

CREATE DATABASE keystone;

为 keystone 数据库授权:

执行以下命令,授予 keystone 用户相关权限:

GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone';

命令解释
  1. GRANT ALL PRIVILEGES

    • 意思是:授予所有权限。
    • 也就是赋予增、删、改、查、建表、删表等几乎所有的操作能力。
  2. ON keystone.*

    • 意思是:把权限作用在哪个地方?
    • 第一个 keystone:代表是名为 keystone 的数据库。
    • .*:代表这个数据库里的所有表。
  3. TO 'keystone'@'%'

    • 意思是:把权限给谁?
    • 第二个 'keystone':代表数据库系统的用户名。
    • @'%':这是一个安全限制,意思是“该用户能从所有网络位置访问”。
  4. IDENTIFIED BY 'keystone'

    • 意思是:验证身份的密码是什么?
    • 第三个 'keystone':代表这个用户的密码。(在实验环境中,为了好记,通常把密码设置得和组件名字一样;在企业生产环境,这里会是一串复杂的乱码密码)。
    • 特殊动作:在 MariaDB 中,如果这个用户之前不存在,加上这条 IDENTIFIED BY 语句,系统会自动创建这个用户并同时设置好密码。

退出数据库:

exit

二、安装并配置 KeyStone 组件

安装 keystone 相关软件包:

yum install openstack-keystone httpd mod_wsgi -y

修改配置文件 /etc/keystone/keystone.conf:

[database]
connection = mysql+pymysql://keystone:keystone@controller/keystone
[token]
provider = fernet

同步认证服务数据库:

初始化 KeyStone 数据库表结构:

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

验证数据库表:

检查同步是否成功,如果在返回的结果中看到了相应的表,则说明同步完成。

mysql -u keystone -p keystone -e "use keystone; show tables;"

初始化 Fernet 密钥存储库:

KeyStone 使用 Fernet 令牌来进行身份验证。我们需要先初始化这些令牌的密钥库和凭据加密密钥库。

keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

提示:什么是 Fernet 令牌?

Fernet 是一种安全、轻量级的令牌格式。它不需要像早期的令牌格式那样在数据库中大量存储,因此运行效率更高。这两条命令会自动生成用于加密令牌的密钥。

提示:Fernet 单词含义

Fernet(菲奈特)来源于意大利,本意是一种源自意大利的苦味草本利口酒(也可以理解为一种西式“药酒”)。

初始化 KeyStone 服务:

现在我们将初始化 KeyStone 的核心配置,相当于创建一个“超级管理员”。

keystone-manage bootstrap --bootstrap-password admin \
--bootstrap-admin-url http://controller:5000/v3 \
--bootstrap-public-url http://controller:5000/v3 \
--bootstrap-internal-url http://controller:5000/v3 \
--bootstrap-region-id RegionOne

命令解释
  • --bootstrap-password admin:把管理员(admin)的密码设置为 admin。
  • --bootstrap-*-url:设置身份认证服务的各个网络访问地址(端点)。
  • --bootstrap-region-id RegionOne:指定服务所在的区域为 RegionOne。

三、配置 Apache HTTP 服务

KeyStone 默认是一个 Python 编写的 Web 应用程序,在生产环境中,我们通常使用 Apache HTTP 服务(配合 mod_wsgi)来运行它,以获得更好的性能和稳定性。

1)配置 Apache 服务器名称:

编辑 /etc/httpd/conf/httpd.conf 文件,搜索 ServerName,并将其配置为 controller 节点。

你可以直接在文件末尾添加以下内容,或者找到被注释的 ServerName 修改:

ServerName controller

2)创建 KeyStone 的虚拟主机配置文件链接:

让 Apache 知道如何处理发给 KeyStone 的请求。在 /etc/httpd/conf.d/ 目录下创建一个指向 KeyStone WSGI 配置的链接:

ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

3)启动并设置 HTTP 服务开机自启:

systemctl start httpd
systemctl enable httpd
命令解释
  • systemctl start <服务名> :启动服务
  • systemctl enable <服务名> :设置服务为开机自动启动

验证状态是否为启动:

4)配置管理员环境变量:

为了方便在命令行中操作 OpenStack(不需要每次敲命令都输入长长的参数),我们将管理员的账号信息配置成临时环境变量。

直接在命令行中执行以下命令(注意:这里的密码是之前设置的 admin):

export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
环境变量的秘密

在终端中执行这些 export 命令后,当你运行 openstack 开头的命令时,系统会自动读取这些变量完成身份验证。这使得我们接下来的操作更加省力!

四、使用 bruno 验证

命令速查

检查完成情况

curl -s http://192.168.192.205/scripts/3.2.sh | bash