三、部署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
3.2、架构
3.2.1、工作原理
(1)首先User向Keystone提供自己的Credentials(凭证:用于确认用户身份的数据,EG. username/password)。
(2)Keystone根据User提供的Credentials从SQL Database中进行身份和权限校验,验证通过返回User一个Token和Endpoint 。
(3)User得到授权(Token)和Endpoint后根据自身权限操作OpenStack的资源
3.2.2、在各个组件中的作用
(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、访问流程
(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、常用操作
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;
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 token issue
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