OpenStack(Train)——Keystone

什么是Keystone?

Keystone是OpenStack的组件之一,用于为OpenStack家族中的其他组件成员提供统一的认证服务,包括身份验证、令牌发放和校验、服务列表、用户权限定义等。

基础概念

  • 身份:指的是访问者的身份信息。在OpenStack中,身份用“用户”来表示。这些用户信息可以存在Keystone自己的数据库,也可以存在外部。
  • 认证:指的是对访问者身份的验证(validate),确认访问者是否合法。认证可通过密码或者Token进行。
  • 授权:指的是OpenStack通过角色(Role),再结合具体模块(如Nova)的策略(Policy)机制,来限定访问者可以访问的资源(如查看、新建虚拟机)。
  • 域(Domain):

        域是项目(租户)、用户及用户组的集合,是为了跟其他项目(租户)、用户及用户组隔离开来而提出来的抽象。这样一来,不同的域就可以有名字相同的租户、用户或用户组而不用担心冲突(UUID跨域唯一)。例如,一个云可以有多个域,每个域可以代表一个公司,也可以代表一个部门。

        因为项目(租户)和域都是角色赋予(assigned on)的实体,因此统称为Targets。

        域是可以在单个身份域中定义的项目(租户)和用户的集合。域可以映射到个人、公司或云服务运营商。Keystone API的版本3中支持域。如果没有创建域,所有项目和用户都使用default域。

        域是Keystone中的一个全局概念,域的名字在Keystone中必须是全局唯一的,Keystone提供一个名为“Default”的默认域。域可以包括多个Project(项目/租户),User(用户),Groups(组),Roles(角色)。

  • 项目(Project/Tenant)

        在Keystone中,项目(租户)是对资源(如虚拟机、镜像)的集合(group)和隔离(isolate)的抽象(abstraction)。从这个定义,可以看出两点:

  1. 项目(租户)是一种抽象,它的出现只是为了方便对资源进行管理;
  2. 一个项目(租户)表示一个隔离的资源集合,不与其他项目(租户)共享资源;

        那谁来使用项目(租户)的资源呢?用户和用户组。通过角色赋予(role assignment),用户或用户组就可以访问或操作项目(租户)的一些资源。具体能访问或操作的资源类型取决于他们被赋予的角色。

        用户及其拥有的资源的集合。根据云提供商,这可用于映射客户、账户或组织的单元。OpenStack Platform附带了两个项目,名为admin和services。这两个项目属于default域。

        Keystone在v3.0的版本开始将v2.0中的Tenant(租户)改为了Project(项目),这更符合在实际使用中的认知。项目必须属于某个域,所以在域内的项目名称必须是唯一的,但是不同的域内可以有相同名称的项目名。如果项目没有分配指定域,那么会自动分配到默认域中。项目是资源的集合,也就是说可以对项目所能使用的资源进行限制,包括vCPU,Memory。vDisk,Floating IP等。

  • 用户(Users)和用户组(Group)(Actor)

        用户和用户组是访问由项目(租户)和域隔离开来的资源的实体(entity)。用户组是用户的集合,而用户是最终使用云资源的个体。用户和用户组统称为Actors,表示它们是被赋予(assigned to)角色的实体。

  • 角色(Role)

        角色用于表示授权。一个Actor可以有多个角色。

        定义一组特权,从而能够对OpenStack服务执行特定的操作。默认admin角色提供整个OpenStack环境的管理特权。

        角色也是Keystone中的一个全局的概念。角色可以分配给用户以及组,不同角色的用户拥有不同的API访问权限。

  • 凭证(Credidential)

        用户身份的确认数据,例如,用户名和密码,或者是一个由Identity(身份)服务提供的授权令牌。

        是Keystone验证用户身份时需要的身份验证数据。此信息包含用户名、密码、项目名称、Keystone端点和地区名称。通过利用此信息,在用户发出访问服务的请求时,Keystone提供身份验证令牌,让用户能够访问该服务。

  •  令牌(Token)

        令牌(Token)用于认证和授权,当用户认证成功后就可以得到一个Token,接下来的请求就可以直接使用该Token而不是用户名密码进行认证;同时,Token也包含了用户在云上的授权信息(如用户能访问的租户、域)。一个Token拥有一个ID和一个载体(payload)。不过,随请求一起发送的一般只有Token ID,然后OpenStack在认证Token的时候再把Token载体取出来。

  • 服务目录(Service Catalog)

        在OpenStack中服务目录尤其重要,它包含了不同云服务(如Nova)的URLs和端点(Endpoints)。没有服务目录,用户和应用不知道如何路由请求到正确的服务。服务目录可以拆分成端点列表,每一个端点能够进一步拆分成admin URL,internal URL和public URL。这些URL可以相同。

  • 端点(Endpoint):服务的实例(URL入口)

用户-角色-服务交互图

基本架构

验证流程

创建虚拟机流程

流程解释

  1. 用户向Keystone发送用户名和密码,通过验证后,Keystone会返回一个临时token和一个service catalog的列表。
  2. 用户用这个临时token向catalog列表中Keystone的endpoint请求用户对应的tenant信息,Keystone验证token通过后会返回用户对应的tenant列表。
  3. 用户从列表中选取tenant,再次向Keystone请求,Keystone验证通过后,返回与该tenant相关的catalog信息和token。
  4. 用户用该token以及tenant/user信息向catalog中的nova服务器端点请求开启虚机服务。nova向Keystone请求验证:a.token是否合法?b.这个租户/用户是否有权限来向nova请求服务?
  5. Keystone返回给nova:a.租户-用户具备访问nova的权限。b.token合法。c.token属于该租户-用户。
  6. nova根据自己的规则判断用户是否具备开启虚机的权限。如果具备,启动虚机。并向用户报告状态。

环境

网络拓扑

Net0:10.20.0.0/24 openstack管理网络

Net1:172.16.0.10/24  publicIP 

Net2: 192.168.4.0/24 虚拟机通信网络

问题1

虚拟机安装完成后yum报错:

One of the configured repositories failed (未知),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:
     1. Contact the upstream for the repository and get them to fix the problem.
     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).
     3. Run the command with the repository temporarily disabled
            yum --disablerepo=<repoid> ...
     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable <repoid>
        or
            subscription-manager repos --disable=<repoid>
     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:
            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true
Cannot find a valid baseurl for repo: advanced-virtualization/7/x86_64

解决:根据最后一行报错放开/etc/yum.repos.d/advanced-virtualization.repo中的baseurl,将mirrorlist注释

问题2

安装MySQL

yum install -y mysql mysql-server MySQL-python

MySQL安装完成后执行 systemctl start mysqld.service报错“Failed to start mysqld.service: Unit not found.”

解决:参考(CentOS7安装MySQL报错,解决Failed to start mysqld.service: Unit not found

### 首先需要安装mariadb-server

 yum install -y mariadb-server

### 启动服务

 systemctl start mariadb.service

### 添加到开机启动

 systemctl enable mariadb.service

问题3

systemctl enable mysqld.service 报错  Failed to execute operation: Too many levels of symbolic links

解决:参考(Centos7自动启动问题处置

Keystone安装

  • 安装keystone 包
yum install openstack-keystone python-keystoneclient httpd mod_wsgi -y

问题4

错误:软件包:python2-qpid-proton-0.26.0-2.el7.x86_64 (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
          可用: 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 (openstack-train)
              qpid-proton-c(x86-64) = 0.26.0-2.el7
 您可以尝试添加 --skip-broken 选项来解决该问题
 您可以尝试执行:rpm -Va --nofiles --nodigest

解决:参考(安装openstack的Keystone组件出现错误

  • 为keystone 设置admin 账户的 tokn
ADMIN_TOKEN=$(openssl rand -hex 10)
echo $ADMIN_TOKEN
openstack-config --set /etc/keystone/keystone.conf DEFAULT admin_token $ADMIN_TOKEN

通过openstack-util设置配置文件/etc/keystone/keystone.conf 中的参数admin_token为上述新建的token 

  • 配置数据连接
openstack-config --set /etc/keystone/keystone.conf sql connection mysql://keystone:openstack@controller0/keystone
openstack-config --set /etc/keystone/keystone.conf DEFAULT debug True
openstack-config --set /etc/keystone/keystone.conf DEFAULT verbose True

格式:

mysql://USER:PASS@IP/DB
  • 设置Keystone 用 fernet tokens
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
  • 为keystone设置数据库

方式一:

mysql -uroot -popenstack -e "CREATE DATABASE keystone;"
mysql -uroot -popenstack -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'openstack';"
mysql -uroot -popenstack -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'controller0' IDENTIFIED BY 'openstack';"
mysql -uroot -popenstack -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'openstack';"

方式二:

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

方式三:

openstack-db --init --service keystone --password openstack
  • 启动Apache http服务
#systemctl restart httpd.service
#systemctl enable httpd.service
#systemctl status httpd.service

问题5:

启动后查看日志启动状态 /var/log/keystone/keystone.log 显示数据库报错,查看mysql数据库中并没有keystone数据库。

解决:手动执行上述方式一,后执行方式二构建数据库,解决。

  • 通过设置环境变量来配置管理账户

其中OS_PASSWORD为上述设置的mysql密码

问题6:

__init__() got an unexpected keyword argument 'token'

解决:unset OS_TOKEN

创建域、项目(租户)、用户、角色

创建An Example Domain域:

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

 添加到环境的每个服务的唯一用户,创建项目service:

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

创建项目myproject:

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

 创建用户myuser:

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

 

创建角色myrole:

#openstack role create myrole

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

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

 验证

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

#unset OS_AUTH_URL OS_PASSWORD

作为用户,请求身份验证令牌:admin:

#openstack --os-auth-url http://controller:5000/v3 \
--os-project-domain-name Default --os-user-domain-name Default \
--os-project-name admin --os-username admin token issue

 请求身份验证令牌:myuser:

#openstack --os-auth-url http://controller:5000/v3 \
--os-project-domain-name Default --os-user-domain-name Default \
--os-project-name myproject --os-username myuser token issue

 

参考:OpenStack-T版Keystone服务

 OpenStack概述

说明:学习记录帖,感谢本文参考的所有博文作者

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值