三、部署keystone(controller节点)

3.1.1、简介

3.1.1.1、作用

1.用户管理:验证用户身份信息合法性

2.认证服务:提供了其余所有组件的认证信息/令牌的管理,创建,修改等等,使用MySQL作为统一的数据库。

3.Keystone是Openstack用来进行身份验证(authN)及高级授权(authZ)的身份识别服务,目前支持基于口令的authN和用户服务授权。

3.1.1.2、概念

(1)租户(Project):个人或服务所拥有的资源集合。在一个Project(Tenant)中可以包含多个User,每一个User都会根据权限的划分来使用Project(Tenant)中的资源。

(2)用户(User):访问OpenStack的对象。用户拥有证书(credentials),且可能分配给一个或多个租户。经过验证后,会为每个单独的租户提供一个特定的令牌。

(3)证书(Credentials):确认用户身份的凭证。可以是用户名和密码、用户名和API Key和Token。

(4)令牌(Token):一个字符串表示,作为访问资源的令牌。Token包含了在指定范围和有效时间内可以被访问的资源,具有时效性。

(5)角色(Role):用于划分权限。可以通过给User指定Role,使User获得Role对应的操作权限。Keystone返回给User的Token包含了Role列表,被访问的Services会判断访问它的User和User提供的Token中所包含的Role。

(6)Policy:用来控制User对Project中资源(包括Services)的操作权限。对于Keystone service来说,Policy就是一个JSON文件,默认是/etc/keystone/policy.json。

(7)Authentication:确定用户身份的过程

(8)服务(Service):Openstack中运行的组件服务

(9)Endpoint:通过网络来访问和定位某个Openstack service的地址,通常是一个URL。分为三类:

  • admin url —>管理员用户使用 ,Port:35357
  • internal url —>openstack内部组件间互相通信(内部访问), Port:5000 (组件之间通信基于Restful api)
  • public url —> 其他用户访问地址(全局访问),Port:5000

OpenStack(Train版)-部署keystone(controller节点)_API

3.2、架构

3.2.1、工作原理

OpenStack(Train版)-部署keystone(controller节点)_bootstrap_02

(1)首先User向Keystone提供自己的Credentials(凭证:用于确认用户身份的数据,EG. username/password)。

(2)Keystone根据User提供的Credentials从SQL Database中进行身份和权限校验,验证通过返回User一个Token和Endpoint 。

(3)User得到授权(Token)和Endpoint后根据自身权限操作OpenStack的资源

3.2.2、在各个组件中的作用

OpenStack(Train版)-部署keystone(controller节点)_User_03

(1)User通过命令行或者API的方式登录后,提供自己的Credentials(凭证:用于确认用户身份的数据,EG. username/password)。

(2)Keystone根据User提供的Credentials从SQL Database中进行身份和权限校验,验证通过返回User一个Token和Endpoint。

(3)此后User所有的Request都会使用该Token进行身份验证。

(4)从以上过程可以看出,用户的角色管理在 Keystone 中是很重要的工作。在Keystone V3之前,用户的权限管理以每一个用户为单位,需要对每一个用户进行角色分配,并不存在一种对一组用户进行统一管理的方案,这给系统管理员带来了额外的工作和不便。此外,Keystone V3之前的版本中,资源分配是以 Tenant 为单位的,这不太符合现实世界中的层级关系。如一个公司在 Openstack 中拥有两个不同的项目,他需要管理两个Tenant来分别对应这两个项目,并对这两个 Tenant 中的用户分别分配角色。由于在 Tenant 之上并不存在一个更高层的概念,无法对 Tenant 进行统一的管理,所以这给多 Tenant 的用户带来了不便。为了解决这些问题,Keystone V3 提出了新的概念Domain和Group。

3.2.3、访问流程

OpenStack(Train版)-部署keystone(controller节点)_bootstrap_04

(1)User/API 想创建一个实例,首先会将自己的Credentials发给Keystone。认证成功后,keystone会颁给User/API一个临时的令牌(Token)和一个访问服务的Endpoint。

(2)User/API 把临时Token提交给Keystone,Keystone返回一个Tenant(Project)。

(3)User/API 向Keystone发送带有特定租户的凭证(交互权限),告诉Keystone User/API在哪个项目中,Keystone收到请求后,会发送一个项目的Token到User/API (访问权限),User/API 拿着Token和Endpoint找到可访问服务。

(4)服务向keystone进行认证,Token是否合法,它允许访问使用该服务(判断用户/API中role权限)?

(5)Keystone向服务提供额外的信息。User/API是允许方法服务,这个Token匹配请求,这个Token是User/API的

(6)服务执行User/API发起的请求,创建实例

(7)服务会将状态报告给用户/API。最后返回结果,实例已经创建

3.3、常用操作

OpenStack(Train版)-部署keystone(controller节点)_API_05

OpenStack(Train版)-部署keystone(controller节点)_User_06

3.4、部署安装-创建数据库

mysql -uroot -p123456

CREATE DATABASE keystone;

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

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

注:密码不可以设置过于简单,后面验证服务会报错。

3.5、安装组件

3.5.1、安装openstack-keystone httpd mod_wsgi

yum install openstack-keystone httpd mod_wsgi -y

3.5.2、安装openstack-keystone报错及解决方法

3.5.2.1、yum安装openstack-keystone报错(问题根源为更改了yum源,用默认系统自带的yum源不会有此问题)

错误:软件包:python2-qpid-proton-0.26.0-2.el7.x86_64 (centos-openstack-train)

需要:qpid-proton-c(x86-64) = 0.26.0-2.el7

可用: qpid-proton-c-0.14.0-2.el7.x86_64 (extras)

qpid-proton-c(x86-64) = 0.14.0-2.el7

可用: qpid-proton-c-0.26.0-2.el7.x86_64 (centos-openstack-train)

qpid-proton-c(x86-64) = 0.26.0-2.el7

正在安装: qpid-proton-c-0.37.0-1.el7.x86_64 (epel)

qpid-proton-c(x86-64) = 0.37.0-1.el7

您可以尝试添加 --skip-broken 选项来解决该问题

您可以尝试执行:rpm -Va --nofiles –nodigest


解决方法(所有节点上都需要执行):

yum install python-devel -y

wget ftp://ftp.pbone.net/mirror/vault.centos.org/7.8.2003/messaging/x86_64/qpid-proton/Packages/q/qpid-proton-c-0.28.0-1.el7.x86_64.rpm

wget ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/epel/testing/6.2019-05-29/x86_64/Packages/p/python2-qpid-proton-0.28.0-1.el7.x86_64.rpm

rpm -Uvh --replacepkgs python*.rpm --nodeps --force

rpm -Uvh --replacepkgs qpid-proton-c-0.28.0-1.el7.x86_64.rpm --nodeps --force

执行完以上命令重新执行yum安装openstack-keystone。


3.5.3、编辑/etc/keystone/keystone.conf文件

完成以下操作


[database]

# ...

connection = mysql+pymysql://keystone:keystone123@controller1/keystone

[token]

# ...

provider = fernet

3.5.4、初始化keystone数据库

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

验证:

登录数据库:

mysql -uroot -p123456


进入keystone数据库,可查看到新增很多表

use keystone;

show tables;

OpenStack(Train版)-部署keystone(controller节点)_API_07

3.5.5、创建令牌(与配置文件中[token]部分相关联)

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

keystone-manage credential_setup --keystone-user keystone --keystone-group ystone


3.5.6、引导身份服务

keystone-manage bootstrap --bootstrap-password admin123 \

--bootstrap-admin-url http://controller1:5000/v3/ \ #管理

--bootstrap-internal-url http://controller1:5000/v3/ \ #私有 keystone身份认证端口5000 v3版本

--bootstrap-public-url http://controller1:5000/v3/ \ #共有 url与url之间的对接

--bootstrap-region-id RegionOne

此步骤是初始化openstack,会把openstack的admin用户的信息写入到mysql的user表中,以及url等其他信息写入到mysql的相关表中;

admin-url是管理网(如公有云内部openstack管理网络),用于管理虚拟机的扩容或删除;如果共有网络和管理网是一个网络,则当业务量大时,会造成无法通过openstack的控制端扩容虚拟机,所以需要一个管理网。

internal-url是内部网络,进行数据传输,如虚拟机访问存储和数据库、zookeeper等中间件,这个网络是不能被外网访问的,只能用于企业内部访问。

public-url是共有网络,可以给用户访问的(如公有云) #但是此环境没有这些网络,则公用同一个网络。

5000端口是keystone提供认证的端口。

以下部分指的是openstack多节点的配置:

需要在haproxy服务器上添加一条listen;

各种网络的url需要指定controler节点的域名,一般是haproxy的vip的域名(高可用模式)。

3.5.7、配置HTTP服务器

编辑/etc/httpd/conf/httpd.conf文件并配置 ServerName选项以引用控制器节点

vim /etc/httpd/conf/httpd.conf

ServerName controller1


创建/usr/share/keystone/wsgi-keystone.conf文件的链接

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


启动 Apache HTTP 服务并将其配置为在系统启动时启动

systemctl enable httpd.service

systemctl start httpd.service


3.5.8、Apache启动失败案例

现象:

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.


将wsgi-keystone.conf软链接删掉apache可正常启动

原因:1、selinux未关闭;2、mod_wsgi未安装成功;3、wsgi-keystone.conf文件编写错误

3.5.9、通过设置适当的环境变量来配置管理帐户

vim admin-openrc

#!/bin/bash

export OS_USERNAME=admin

export OS_PASSWORD=admin123 #和3.2.6章节设置的密码保持一致。

export OS_PROJECT_NAME=admin

export OS_USER_DOMAIN_NAME=Default

export OS_PROJECT_DOMAIN_NAME=Default

export OS_AUTH_URL=http://controller1:5000/v3

export OS_IDENTITY_API_VERSION=3

验证:

source admin-openrc

openstack endpoint list

OpenStack(Train版)-部署keystone(controller节点)_User_08

openstack token issue

OpenStack(Train版)-部署keystone(controller节点)_bootstrap_09

3.5.10、创建域、项目、用户和角色

3.5.10.1、创建域

openstack domain create --description "An Example Domain" example

3.5.10.2、创建域报错案例

3.5.10.2.1、问题现象:Missing value auth-url required for auth plugin password

原因:配置的环境变量有问题。

解决方法:重新配置环境变量。

3.5.10.2.2、问题现象:ERROR Failed to discover available identity versions when contacting http://ct:5000/v3.

原因:apache服务异常。

解决方法:重新启动httpd。

3.5.10.2.3、问题现象:The request you have made requires authentication. (HTTP 401)

原因:部署安装环境时数据库配置的keystone密码,和引导服务设置的admin密码未生效,命令完全复制的官方文档“KEYSTONE_PASS、ADMIN_PASS”。

解决方法:

1、将keystone库删除重建,设置密码;

drop database keystone;

CREATE DATABASE keystone;

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

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


2、更新/etc/keystone/keystone.conf配置文件connection中的keystone密码;

[database]

# ...

connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone


3、初始化keystone数据库

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


4、初始化 Fernet 密钥存储库

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

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


5、引导身份服务

keystone-manage bootstrap --bootstrap-password admin123 \

--bootstrap-admin-url http://controller1:5000/v3/ \

--bootstrap-internal-url http://controller1:5000/v3/ \

--bootstrap-public-url http://controller1:5000/v3/ \

--bootstrap-region-id RegionOne




6、重启httpd服务。不重启的话会报:An unexpected error prevented the server from fulfilling your request.


3.5.10.3、创建service 项目

openstack project create --domain default --description "Service Project" service


3.5.10.4、创建myproject项目

openstack project create --domain default --description "Demo Project" myproject


3.5.10.5、创建myuser用户

openstack user create --domain default --password-prompt myuser

需设置密码。

3.5.10.6、创建myrole角色

openstack role create myrole


3.5.10.7、将myrole角色添加到myproject项目和myuser用户

openstack role add --project myproject --user myuser myrole

3.5.10.8、验证操作

3.5.10.8.1、取消设置临时变量OS_AUTH_URL和OS_PASSWORD 环境变量

unset OS_AUTH_URL OS_PASSWORD


3.5.10.8.2、作为admin用户,请求一个身份验证令牌

openstack --os-auth-url http://controller1:5000/v3 \

--os-project-domain-name Default --os-user-domain-name Default \

--os-project-name admin --os-username admin token issue

使用admin用户的密码

3.5.10.8.3、作为myuser在上一节中创建的用户,请求一个身份验证令牌

openstack --os-auth-url http://controller1:5000/v3 \

--os-project-domain-name Default --os-user-domain-name Default \

--os-project-name myproject --os-username myuser token issue

使用myuser用户的密码

3.5.11、创建环境变量脚本

3.5.11.1、分别使用admin和myuser创建环境变量脚本

vim admin-openrc

#!/bin/bash

export OS_PROJECT_DOMAIN_NAME=Default

export OS_USER_DOMAIN_NAME=Default

export OS_PROJECT_NAME=admin

export OS_USERNAME=admin

export OS_PASSWORD=admin123

export OS_AUTH_URL=http://controller1:5000/v3

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2

vim demo-openrc

#!/bin/bash

export OS_PROJECT_DOMAIN_NAME=Default

export OS_USER_DOMAIN_NAME=Default

export OS_PROJECT_NAME=myproject

export OS_USERNAME=myuser

export OS_PASSWORD=myuser123

export OS_AUTH_URL=http://controller1:5000/v3

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2


3.5.11.2、加载admin-openrc脚本测试

3.5.11.2.1、加载脚本

. admin-openrc


3.5.11.2.2、请求身份验证令牌

openstack token issue

openstack user list

3.5.11.2.3、取消环境变量

unset OS_AUTH_URL OS_PASSWORD

3.5.11.3、加载demo-openrc脚本测试

3.5.11.3.1、加载脚本

. demo-openrc

3.5.11.3.2、请求身份验证令牌

openstack token issue

openstack user list

3.5.11.3.3、取消环境变量

unset OS_AUTH_URL OS_PASSWORD