keystone系列五:keystone源码分析
六 keystone架构
6.1 Keystone API
Keystone API与Openstack其他服务的API类似,也是基于ReSTFul HTTP实现的。
Keystone API划分为Admin API和Public API:
- Public API不仅实现获取版本以及相应扩展信息的操作,同时包括获取Token以及Token租户信息的操作;
- Admin API主要提供服务开发者使用,不仅可以完成Public API的操作,同时对User、Tenant、Role和Service Endpoint进行管理操作。
6.2 Router
Keystone Router主要实现上层API和底层服务的映射和转换功能,包括四种Router类型。
(1) AdminRouter
负责将Admin API请求映射为相应的行为操作并转发至底层相应的服务执行;
(2) PublicRouter
与AdminRouter类似;
(3) PublicVersionRouter
对系统版本的请求API进行映射操作;
(4) AdminVersionRouter
与PublicVersionRouter类似。
6.3 Services
Keystone Service接收上层不同Router发来的操作请求,并根据不同后端驱动完成相应操作,主要包括四种类型;
(1) Identity Service
Identity Service提供关于用户和用户组的授权认证及相关数据。
Keystone-10.0.0支持ldap.core.Identity,Sql.Identity两种后端驱动,系统默认的是Sql.Identity;
Users:
用户这一概念在openstack中实际上是用来标识一个使用者(an individual API consumer) 一个用户必须被一个具体的domain拥有 所有的用户名不是全局唯一的,在同一个domain中用户名才唯一 Groups: 用户组是一个包含了一系列用户的容器,一个group必须被一个具体的domain拥有 所有的组名不是全局唯一的,在同一domain种组名才唯一
users和groups
(2) Resource Service
Resouse服务提供关于projects和domains的数据
projects
Projects(在v2.0中称之为Tenants)
在openstack中project代表资源的结合
一个project必须被一个具体的domain所拥有
所有的project都不是全局唯一的,仅仅在一个domain中project唯一
新建一个project没有指定domain,它将被添加到默认的domain中即default Domains
Domains是一个更高级别的包含n个projects-users-groups的容器。
默认的Domains名为Default
projects和domains
Domain名,在所有的domains中全局唯一
Role名.在所有的domains中全局唯一
User名,仅仅在它自己所在的domain中唯一
Project名,仅仅在它自己所在的domain中唯一
Group名,仅仅在它自己所在的domain中唯一 基于这些容器结构,domains代表了openstack资源的管理方式,只要某一assignment(project-user-role)被授予权限,一个domain中的用户就可以访问另外一个domain中的资源。
在v3版本中的唯一性概念
(3) Assignment Service
Assignment Service提供role及role assignments的数据
Roles
role角色标识了一个用户可以获得的权限级别
可以在domain或project级别授予role。
可以分配给单个用户或组级别role。
role名称是全局唯一的。 Role Assignments A 3-tuple that has a Role, a Resource and an Identity. Resource指的是project
Identity指的是user
Role指的是role
即project-user-role
roles和role assignments
(4) Token Service
Token Service提供认证和管理令牌token的功能,用户的credentials认证通过后就得到token
Keystone-10.0.0对于Token Service
支持Kvs.Token,Memcache.Token,Memcache_pool.Token,Sql.Token四种后端驱动,系统默认的是kvs.Token
(5) Catalog Service
Catalog Service提供service和Endpoint相关的管理操作(service即openstack所有服务,endpont即访问每个服务的url)
keystone-10.0.0对Catalog Service支持两种后端驱动:Sql.Catalog、Templated.Catalog两种后端驱动,系统默认的是templated.Catalog;
(6) Policy Service
Policy Service提供一个基于规则的授权驱动和规则管理
keystone-10.0.0对Policy Service支持两种后端驱动:rules.Policy,sql.Policy,默认使用sql.Policy
6.4 Backend Driver
Backend Driver具有多种类型,不同的Service选择不同的Backend Driver。
官方http://docs.openstack.org/developer/keystone/architecture.html#groups
七 keystone管理这些概念的方法
组件名称 | 管理对象 | 生成方法 | 保存方式 | 配置项 |
identity | user,以及 user group | - | sql, ldap.core |
[identity] driver = keystone.identity.backends.[sql|ldap.core].Identity |
token | 用户的临时 token | pki,pkiz,uuid | sql, kvs,memcached |
[token] driver = keystone.token.persistence.backends.[sql|kvs|memcache|memcache_pool].Token provider=keystone.token.providers.[pkiz|pki|uuid].Provider |
credential | EC2 credential | sql |
[credential] driver = keystone.credential.backends.sql.Credential provider=keystone.token.providers.[core|fernet].Provider |
|
catalog | region,service,endpoint | sql|templated |
[catalog] driver = keystone.catalog.backends.[sql|templated].Catalog |
|
assignment | tenant,domain,role 以及它们与 user 之间的关系 | external, password, token | sql |
[assignment] methods = external, password, token password = keystone.auth.plugins.password.Password |
trust | trust | sql |
[trust] driver = keystone.trust.backends.[sql].Trust |
|
policy | Keystone service 的用户鉴权策略 | ruels|sql |
[default] policy_file = policy.json [policy] driver = keystone.policy.backends.[ruels|sql].Policy |
八 keystone-10.0.0代码结构展示
keystone-manage 是个 CLI 工具,它通过和 Keystone service 交互来做一些无法使用 Keystone REST API 来进行的操作,包括:
- db_sync: Sync the database.
- db_version: Print the current migration version of the database.
- mapping_purge: Purge the identity mapping table.
- pki_setup: Initialize the certificates used to sign tokens.
- saml_idp_metadata: Generate identity provider metadata.
- ssl_setup: Generate certificates for SSL.
- token_flush: Purge expired tokens.
每个Keystone 组件,比如 catalog, token 等都有一个单独的目录。
每个组件目录中:
routes.py 定义了该组件的 routes (routes 见 探索 OpenStack 之(11):cinder-api Service 启动过程分析 以及 WSGI / Paste deploy / Router 等介绍)。其中identity 和 assignment 分别定义了 admin 和 public 使用的 routes,分别供 admin service 和 public service 使用。
controller.py 文件定义了该组件所管理的对象,比如 assignment 的controller.py 文件定义了 Tenant、Role、Project 等类。
core.py 定了了两个类 Manager 和 Driver。Manager 类对外提供该组件操作具体对象的方法入口; Driver 类定义了该组件需要其Driver实现类所提供的接口。
backend 目录下的每个文件是每个具体driver 的实现
下载keystone-10.0.0演示www.openstack.org
九 keystone服务启动
Keystone is an HTTP front-end to several services. Like other OpenStack applications, this is done using python WSGI interfaces and applications are configured together using Paste. The application’s HTTP endpoints are made up of pipelines of WSGI middleware。。。
详见:http://docs.openstack.org/developer/keystone/architecture.html
/usr/bin/keystone-all 会启动 keystone 的两个service:admin and main,它们分别对应 /etc/keystone/keystone-paste.ini 文件中的两个composite:
可见 admin service 提供给administrator 使用;main 提供给 public 使用。它们分别都有 V2.0 和 V3 版本,只是目前的 keystone Cli 只支持 V2.0.比较下 admin 和 public:
名称 | middlewares | factory | 功能区别 |
admin | 比 public 多 s3_extension | keystone.service:public_app_factory |
从 factory 函数来看, admin service 比 public service 多了 identity 管理功能, 以及 assignment 的admin/public 区别: 1. admin 多了对 GET /users/{user_id} 的支持,多了 get_all_projects, get_project,get_user_roles 等功能 2. keystone 对 admin service 提供 admin extensions, 比如 OS-KSADM 等;对 public service 提供 public extensions。 简单总结一下, public service 主要提供了身份验证和目录服务功能;admin service 增加了 tenant、user、role、user group 的管理功能。 |
public |
sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body_v2 json_body ec2_extension user_crud_extension |
keystone.service:admin_app_factory |
/usr/bin/keystone-all 会启动 admin 和 public 两个 service,分别绑定不同 host 和 端口。默认的话,绑定host 都是 0.0.0.0; admin 的绑定端口是 35357 (admin_port), public 的绑定端口是 5000 (public_port)。因此,给 admin 使用的 OS_AUTH_URL 为 http://controller:35357/v2.0, 给 public 使用的 OS_AUTH_URL=http://controller:5000/v2.0
keystone详细说明
WSGI server的父进程(50511号进程)开启两个socket去分别监听本环境的5000和35357号端口,
其中5000号端口是为main的WSGI server提供的,35357号端口为admin的WSGI server提供的。
即WSGI server的父进程接收到5000号端口的HTTP请求时,则将把该请求转发给为main开启的WSGI server去处理,
而WSGI server的父进程接收到35357号端口的HTTP请求时,则将把该请求转发给为admin开启的WSGI server去处理。
vim /etc/keystone/keystone-paste.ini
日志
2016-09-14 11:53:01.037 12698 INFO keystone.common.wsgi [req-07b28d5b-084c-467e-b45a-a4c8a52b7e96
9ff041112e454cca9b54bf117a80ca29 15426931fe4746d08736c5e5c1da6b1c
- 6e495643fb014e5e8a3992c69d80d234 6e495643fb014e5e8a3992c69d80d234]
GET http://controller02:35357/v3/auth/tokens
(1) type = composite
这个类型的section会把URL请求分发到对应的Application,use表明具体的分发方式,比如”egg:Paste#urlmap”表示使用Paste包中的urlmap模块,这个section里的其他形式如”key = value”的行是使用urlmap进行分发时的参数。
(2) type = app
一个app就是一个具体的WSGI Application。
(3) type = filter-app
接收一个请求后,会首先调用filter-app中的use所指定的app进行过滤,如果这个请求没有被过滤,就会转发到next所指定的app进行下一步的处理。
(4) type = filter
与filter-app类型的区别只是没有next。
(5) type = pipeline
pipeline由一系列filter组成。这个filter链条的末尾是一个app。pipeline类型主要是对filter-app进行了简化,
否则,如果多个filter,就需要多个filter-app,然后使用next进行连接。OpenStack的paste的deploy的配置文件主要采用的pipeline的方式。
因为url为http://192.168.118.1:5000/v2.0/tokens,因为基本url的后面接的信息为/v2.0,所以将到public_api的section作相应操作。
keystone系列五:keystone源码分析的更多相关文章
- java多线程系列(九)---ArrayBlockingQueue源码分析
java多线程系列(九)---ArrayBlockingQueue源码分析 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 j ...
- SequoiaDB 系列之七 :源码分析之catalog节点
这一篇紧接着上一篇SequoiaDB 系列之六 :源码分析之coord节点来讲 在上一篇中,分析了coord转发数据包到catalog节点(也有可能是data节点,视情况而定).这一次,我们继续分析上 ...
- SequoiaDB 系列之六 :源码分析之coord节点
好久不见. 在上一篇SequoiaDB 系列之五 :源码分析之main函数,有讲述进程开始运行时,会根据自身的角色,来初始化不同的CB(控制块,control block). 在之前的一篇Sequ ...
- Java集合系列[4]----LinkedHashMap源码分析
这篇文章我们开始分析LinkedHashMap的源码,LinkedHashMap继承了HashMap,也就是说LinkedHashMap是在HashMap的基础上扩展而来的,因此在看LinkedHas ...
- Java并发系列[2]----AbstractQueuedSynchronizer源码分析之独占模式
在上一篇<Java并发系列[1]----AbstractQueuedSynchronizer源码分析之概要分析>中我们介绍了AbstractQueuedSynchronizer基本的一些概 ...
- Java并发系列[3]----AbstractQueuedSynchronizer源码分析之共享模式
通过上一篇的分析,我们知道了独占模式获取锁有三种方式,分别是不响应线程中断获取,响应线程中断获取,设置超时时间获取.在共享模式下获取锁的方式也是这三种,而且基本上都是大同小异,我们搞清楚了一种就能很快 ...
- Java并发系列[5]----ReentrantLock源码分析
在Java5.0之前,协调对共享对象的访问可以使用的机制只有synchronized和volatile.我们知道synchronized关键字实现了内置锁,而volatile关键字保证了多线程的内存可 ...
- java集合系列之LinkedList源码分析
java集合系列之LinkedList源码分析 LinkedList数据结构简介 LinkedList底层是通过双端双向链表实现的,其基本数据结构如下,每一个节点类为Node对象,每个Node节点包含 ...
- java集合系列之ArrayList源码分析
java集合系列之ArrayList源码分析(基于jdk1.8) ArrayList简介 ArrayList时List接口的一个非常重要的实现子类,它的底层是通过动态数组实现的,因此它具备查询速度快, ...
- 自定义View系列教程04--Draw源码分析及其实践
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
随机推荐
- JqGrid: Add,Edit,Del in asp.net
https://github.com/1rosehip/jplist https://github.com/free-jqgrid/jqGrid https://plugins.jquery.com/ ...
- 浏览器兼容性问题——IE不支持却很实用的CSS属性Outline和Child
1. Outline(适用范围:鼠标悬浮hover加外边框) 我们在布局的时候,常常会因为添加边框border影响宽高的布局. 那么,outline是完美的替代品,因为它可以在不影响文档流的情况下呈现 ...
- SD从零开始62-63,不完全日志,业务伙伴及业务伙伴确定
[原创] SD从零开始62 不完全日志 不完全日志Incompletion log 一个不完全日志是销售凭证中对你公司重要的而还没有在系统中输入的所有数据的清单: 你可以在配置中为不完全日志定义这些数 ...
- mybatis学习系列一(mybatis简介/使用)
1mybatis简介(1) 1.1工具:jbbc,jdbctemplate 功能简单,sql语句编写在java代码里面,硬编码高耦合的方式 1.2 框架:整体解决方案 1.2.1 Hibernate: ...
- python2 与 python3 如何实现共存
1.现在我本机系统已内置python2.6 2.下载进行源码安装 复制链接下载到 /root/mypackage,解压 接着 mkdir /usr/local/python3 然后在解压后的文件夹内执 ...
- 洗礼灵魂,修炼python(36)--面向对象编程(6)—类的相关内置函数issubclass,hasattr等
啥?我靠,类也有内置函数?哈哈,确实有的.有哪些呢?请往下看 issubclass(cls, class_or_tuple, /) 1.基本属性: 方法全是特殊方法 2.使用方法:判断一个类是否由另一 ...
- linux内存源码分析 - SLAB分配器概述【转】
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...
- Django电商项目---完成登录验证和用户中心(个人信息)day3
登录验证的实现 背景说明: 用户在商品界面选择商品后,在点击购物车或者结算订单之前 需要完成用户的登录验证,这里用装饰器来完成 创建装饰器类: df_user/user_decorator.py ...
- HTML 中点击<a>标签,页面跳转执行过程
HTML链接使用的是<a>标签 点击超链接,后台的执行大致如下: <a href="https://www.baidu.com">超链接</a> ...
- zTree异步加载展开第一级节点
在 setting 中的 callback 中加上 onAsyncSuccess:onAsyncSuccess 回调函数 , 然后实现回调函数 var isFirst = true;function ...