openstack云計(jì)算keystone架構(gòu)源碼分析
keystone架構(gòu)
Keystone API
Keystone API與Openstack其他服務(wù)的API類(lèi)似,也是基于ReSTFul HTTP實(shí)現(xiàn)的。
Keystone API劃分為Admin API和Public API:
- Public API不僅實(shí)現(xiàn)獲取版本以及相應(yīng)擴(kuò)展信息的操作,同時(shí)包括獲取Token以及Token租戶(hù)信息的操作;
- Admin API主要提供服務(wù)開(kāi)發(fā)者使用,不僅可以完成Public API的操作,同時(shí)對(duì)User、Tenant、Role和Service Endpoint進(jìn)行管理操作。
Router
Keystone Router主要實(shí)現(xiàn)上層API和底層服務(wù)的映射和轉(zhuǎn)換功能,包括四種Router類(lèi)型。
(1) AdminRouter負(fù)責(zé)將Admin API請(qǐng)求映射為相應(yīng)的行為操作并轉(zhuǎn)發(fā)至底層相應(yīng)的服務(wù)執(zhí)行;
(2) PublicRouter與AdminRouter類(lèi)似;
(3) PublicVersionRouter對(duì)系統(tǒng)版本的請(qǐng)求API進(jìn)行映射操作;
(4) AdminVersionRouter與PublicVersionRouter類(lèi)似。
Services
Keystone Service接收上層不同Router發(fā)來(lái)的操作請(qǐng)求,并根據(jù)不同后端驅(qū)動(dòng)完成相應(yīng)操作,主要包括四種類(lèi)型;
(1) Identity Service
Identity Service提供關(guān)于用戶(hù)和用戶(hù)組的授權(quán)認(rèn)證及相關(guān)數(shù)據(jù)。
Keystone-10.0.0支持ldap.core.Identity,Sql.Identity兩種后端驅(qū)動(dòng),系統(tǒng)默認(rèn)的是Sql.Identity;
Users:
用戶(hù)這一概念在openstack中實(shí)際上是用來(lái)標(biāo)識(shí)一個(gè)使用者(an individual API consumer)
一個(gè)用戶(hù)必須被一個(gè)具體的domain擁有
所有的用戶(hù)名不是全局唯一的,在同一個(gè)domain中用戶(hù)名才唯一
Groups:
用戶(hù)組是一個(gè)包含了一系列用戶(hù)的容器,一個(gè)group必須被一個(gè)具體的domain擁有
所有的組名不是全局唯一的,在同一domain種組名才唯一
(2) Resource Service
Resouse服務(wù)提供關(guān)于projects和domains的數(shù)據(jù)
projects
Projects(在v2.0中稱(chēng)之為T(mén)enants)在openstack中project代表資源的結(jié)合
一個(gè)project必須被一個(gè)具體的domain所擁有
所有的project都不是全局唯一的,僅僅在一個(gè)domain中project唯一
新建一個(gè)project沒(méi)有指定domain,它將被添加到默認(rèn)的domain中即default
Domains
Domains是一個(gè)更高級(jí)別的包含n個(gè)projects-users-groups的容器。
默認(rèn)的Domains名為Default
在v3版本中的唯一性概念
Domain名,在所有的domains中全局唯一
Role名.在所有的domains中全局唯一
User名,僅僅在它自己所在的domain中唯一
Project名,僅僅在它自己所在的domain中唯一
Group名,僅僅在它自己所在的domain中唯一
基于這些容器結(jié)構(gòu),domains代表了openstack資源的管理方式,只要某一assignment(project-user-role)被授予權(quán)限,一個(gè)domain中的用戶(hù)就可以訪(fǎng)問(wèn)另外一個(gè)domain中的資源。
(3) Assignment Service
Assignment Service提供role及role assignments的數(shù)據(jù)
Roles
role角色標(biāo)識(shí)了一個(gè)用戶(hù)可以獲得的權(quán)限級(jí)別
可以在domain或project級(jí)別授予role。
可以分配給單個(gè)用戶(hù)或組級(jí)別role。
role名稱(chēng)是全局唯一的。
Role Assignments
A 3-tuple that has a Role, a Resource and an Identity.
Resource指的是project
Identity指的是user
Role指的是role即project-user-role
(4) Token Service
Token Service提供認(rèn)證和管理令牌token的功能,用戶(hù)的credentials認(rèn)證通過(guò)后就得到token
Keystone-10.0.0對(duì)于Token Service支持Kvs.Token,Memcache.Token,
Memcache_pool.Token,Sql.Token四種后端驅(qū)動(dòng),系統(tǒng)默認(rèn)的是kvs.Token
(5) Catalog Service
Catalog Service提供service和Endpoint相關(guān)的管理操作(service即openstack所有服務(wù),endpont即訪(fǎng)問(wèn)每個(gè)服務(wù)的url)
keystone-10.0.0對(duì)Catalog Service支持兩種后端驅(qū)動(dòng):Sql.Catalog、Templated.Catalog兩種后端驅(qū)動(dòng),系統(tǒng)默認(rèn)的是templated.Catalog;
(6) Policy ServicePolicy Service
提供一個(gè)基于規(guī)則的授權(quán)驅(qū)動(dòng)和規(guī)則管理
keystone-10.0.0對(duì)Policy Service支持兩種后端驅(qū)動(dòng):rules.Policy,sql.Policy,默認(rèn)使用sql.Policy
Backend Driver
Backend Driver具有多種類(lèi)型,不同的Service選擇不同的Backend Driver。
官方https://docs.openstack.org/keystone/latest/#groups
keystone管理這些概念的方法
組件名稱(chēng) | 管理對(duì)象 | 生成方法 | 保存方式 | 配置項(xiàng) |
identity | user,以及 user group | - | sql, ldap.core | [identity] driver = keystone.identity.backends.[sql|ldap.core].Identity |
token | 用戶(hù)的臨時(shí) 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 之間的關(guān)系 | 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 的用戶(hù)鑒權(quán)策略 | ruels|sql | [default] policy_file = policy.json [policy] driver = keystone.policy.backends.[ruels|sql].Policy |
keystone-10.0.0代碼結(jié)構(gòu)展示
keystone-manage 是個(gè) CLI 工具,它通過(guò)和 Keystone service 交互來(lái)做一些無(wú)法使用 Keystone REST API 來(lái)進(jìn)行的操作,包括:
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.
每個(gè)Keystone 組件,比如 catalog, token 等都有一個(gè)單獨(dú)的目錄。
每個(gè)組件目錄中:
routes.py 定義了該組件的 routes (routes 見(jiàn) 探索 OpenStack 之(11):cinder-api Service 啟動(dòng)過(guò)程分析 以及 WSGI / Paste deploy / Router 等介紹)。
其中identity 和 assignment 分別定義了 admin 和 public 使用的 routes,分別供 admin service 和 public service 使用。
controller.py 文件定義了該組件所管理的對(duì)象,比如 assignment 的controller.py 文件定義了 Tenant、Role、Project 等類(lèi)。
core.py 定了了兩個(gè)類(lèi) Manager 和 Driver。Manager 類(lèi)對(duì)外提供該組件操作具體對(duì)象的方法入口;
Driver 類(lèi)定義了該組件需要其Driver實(shí)現(xiàn)類(lèi)所提供的接口。
backend 目錄下的每個(gè)文件是每個(gè)具體driver 的實(shí)現(xiàn)
下載keystone-10.0.0演示https://www.openstack.org/
keystone服務(wù)啟動(dòng)
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 usingPaste. The application’s HTTP endpoints are made up of pipelines of WSGI middleware。。。
詳見(jiàn):https://docs.openstack.org/keystone/latest/
/usr/bin/keystone-all 會(huì)啟動(dòng) keystone 的兩個(gè)service:admin and main,它們分別對(duì)應(yīng) /etc/keystone/keystone-paste.ini文件中的兩個(gè)composite:
可見(jiàn) admin service 提供給administrator 使用;main 提供給 public 使用。
它們分別都有 V2.0 和 V3 版本,只是目前的 keystone Cli 只支持 V2.0.比較下 admin 和 public:
名稱(chēng) | middlewares | factory | 功能區(qū)別 |
admin | 比 public 多s3_extension | keystone.service:public_app_factory | 從 factory 函數(shù)來(lái)看, admin service 比 public service 多了identity 管理功能, 以及 assignment 的admin/public 區(qū)別: 1. admin 多了對(duì) GET/users/{user_id} 的支持,多了get_all_projects,get_project,get_user_roles 等功能 2. keystone 對(duì) admin service 提供 admin extensions, 比如OS-KSADM等;對(duì) public service 提供 public extensions。 簡(jiǎn)單總結(jié)一下, public service 主要提供了身份驗(yàn)證和目錄服務(wù)功能;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 會(huì)啟動(dòng) admin 和 public 兩個(gè) service,分別綁定不同 host 和 端口。
默認(rèn)的話(huà),綁定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詳細(xì)說(shuō)明
WSGI server的父進(jìn)程(50511號(hào)進(jìn)程)開(kāi)啟兩個(gè)socket去分別監(jiān)聽(tīng)本環(huán)境的5000和35357號(hào)端口,
其中5000號(hào)端口是為main的WSGI server提供的,35357號(hào)端口為admin的WSGI server提供的。
即WSGI server的父進(jìn)程接收到5000號(hào)端口的HTTP請(qǐng)求時(shí),則將把該請(qǐng)求轉(zhuǎn)發(fā)給為main開(kāi)啟的WSGI server去處理,
而WSGI server的父進(jìn)程接收到35357號(hào)端口的HTTP請(qǐng)求時(shí),則將把該請(qǐng)求轉(zhuǎn)發(fā)給為admin開(kāi)啟的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
這個(gè)類(lèi)型的section會(huì)把URL請(qǐng)求分發(fā)到對(duì)應(yīng)的Application,use表明具體的分發(fā)方式,比如”egg:Paste#urlmap”表示使用Paste包中的urlmap模塊,這個(gè)section里的其他形式如”key = value”的行是使用urlmap進(jìn)行分發(fā)時(shí)的參數(shù)。
(2) type = app
一個(gè)app就是一個(gè)具體的WSGI Application。
(3) type = filter-app
接收一個(gè)請(qǐng)求后,會(huì)首先調(diào)用filter-app中的use所指定的app進(jìn)行過(guò)濾,如果這個(gè)請(qǐng)求沒(méi)有被過(guò)濾,就會(huì)轉(zhuǎn)發(fā)到next所指定的app進(jìn)行下一步的處理。
(4) type = filter
與filter-app類(lèi)型的區(qū)別只是沒(méi)有next。
(5) type = pipeline
pipeline由一系列filter組成。
這個(gè)filter鏈條的末尾是一個(gè)app。pipeline類(lèi)型主要是對(duì)filter-app進(jìn)行了簡(jiǎn)化,否則,如果多個(gè)filter,就需要多個(gè)filter-app,然后使用next進(jìn)行連接。OpenStack的paste的deploy的配置文件
主要采用的pipeline的方式。
因?yàn)閡rl為http://192.168.118.1:5000/v2.0/tokens,因?yàn)榛緐rl的后面接的信息為/v2.0,所以將到public_api的section作相應(yīng)操作。
以上就是openstack云計(jì)算keystone架構(gòu)源碼分析的詳細(xì)內(nèi)容,更多關(guān)于openstack云計(jì)算keystone架構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
CentOS 6.4下安裝部署OpenStack云計(jì)算平臺(tái)的方法
現(xiàn)在好多公司都使用Openstack,所以也想著學(xué)習(xí)下用OpenStack云計(jì)算平臺(tái),這篇文章給加詳細(xì)介紹了CentOS 6.4下安裝部署OpenStack云計(jì)算平臺(tái)的方法,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-10-10簡(jiǎn)單談?wù)凮penStack中的網(wǎng)絡(luò)隔離
這篇文章主要介紹了簡(jiǎn)單談?wù)凮penStack中的網(wǎng)絡(luò)隔離的相關(guān)資料,需要的朋友可以參考下2017-03-03什么是OpenStack 開(kāi)源的云計(jì)算管理平臺(tái)項(xiàng)目
OpenStack是一個(gè)開(kāi)源的云計(jì)算管理平臺(tái)項(xiàng)目,由幾個(gè)主要的組件組合起來(lái)完成具體工作。OpenStack支持幾乎所有類(lèi)型的云環(huán)境,項(xiàng)目目標(biāo)是提供實(shí)施簡(jiǎn)單、可大規(guī)模擴(kuò)展、豐富、標(biāo)準(zhǔn)統(tǒng)一的云計(jì)算管理平臺(tái)2016-11-11Openstack 啟動(dòng)instance ''hvm''錯(cuò)誤問(wèn)題解決辦法
這篇文章主要介紹了Openstack 啟動(dòng)instance 'hvm'錯(cuò)誤問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11Openstack各組件邏輯關(guān)系及運(yùn)行流程解析
這篇文章主要為大家介紹了Openstack各組件邏輯關(guān)系及運(yùn)行流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04Openstack安裝過(guò)程中遇到的問(wèn)題匯總
本文給大家分享的是作者在Centos7中安裝openstack過(guò)程中出現(xiàn)的一些問(wèn)題的匯總,以及解決的方法,有需要的小伙伴可以參考下2017-04-04OpenStack 工作流workflows使用原理詳細(xì)介紹
這篇文章主要介紹了OpenStack 工作流workflows使用原理詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-11-11java.util.ConcurrentModificationException 解決方法
這篇文章主要介紹了 java.util.ConcurrentModificationException 解決方法的相關(guān)資料,需要的朋友可以參考下2016-11-11