1. 程式人生 > >keystone系列五:keystone原始碼分析

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原始碼分析

六 keystone架構   6.1 Keystone API  Keystone API與Openstack其他服務的API類似,也是基於ReSTFul HTTP實現的。 Keystone API劃分為Admin API和Public API: Public API不僅實現獲取版本以及相應擴充

Glide 系列-2主流程原始碼分析(4.8.0)

Glide 是 Android 端比較常用的圖片載入框架,這裡我們就不再介紹它的基礎的使用方式。你可以通過檢視其官方文件學習其基礎使用。這裡,我們給出一個 Glide 的最基本的使用示例,並以此來研究這個整個過程發生了什麼: Glide.with(fragment).load(myU

keystone系列keystone部署及操作

一 前言 任何軟體的部署都是沒有技術含量的,任何就部署講部署的人都是江湖騙子。 部署的本質就是拷貝,貼上,回車。我們家養了條狗,它可以勝任這件事情。 我們搞技術的,一定不能迂腐:輕信或者一概不信。 輕信者的傻逼就像是隻學了上半冊的葵花寶典,上半冊教你欲練此功必先自宮,而下半冊說的則是不自宮其實也可

轉載GCC原始碼分析)——指令生成

一、前言   又有好久沒寫了,的確很忙。前篇介紹了GCC的pass格局,它是GCC中間語言部分的核心架構,也是貫穿整個編譯流程的核心。在完成優化處理之後,GCC必須做的最後一步就是生成最後的編譯結果,通常情況下就是彙編檔案(文字或者二進位制並不重要)。   前面也講到了,

keystone系列閘道器協議

一 靜態頁面和動態頁面 在瞭解了http協議後,我們知曉,一個web server的本質就是 瀏覽器傳送一個HTTP請求; 伺服器收到請求,生成一個HTML文件; 伺服器把HTML文件作為HTTP響應的Body傳送給瀏覽器; 瀏覽器收到HTTP響應,從HTTP Bod

MySQL系列innodb原始碼分析之表空間管理

innodb在實現表空間(table space)基於檔案IO之上構建的一層邏輯儲存空間管理,table space採用邏輯分層的結構:space、segment inode、extent和page.在實現層的邏輯使用了磁碟連結串列這種結構來管理邏輯關係。我們先來介紹磁碟連

Java分散式跟蹤系統Zipkin(Brave原始碼分析-Brave和SpringMVC整合

上一篇博文中,我們分析了Brave是如何在普通Web專案中使用的,這一篇博文我們繼續分析Brave和SpringMVC專案的整合方法及原理。 我們分兩個部分來介紹和SpringMVC的整合,及XML配置方式和Annotation註解方式 pom.xml新

MySQL系列innodb原始碼分析之重做日誌結構

在innodb的引擎實現中,為了實現事務的永續性,構建了重做日誌系統。重做日誌由兩部分組成:記憶體日誌緩衝區(redo log buffer)和重做日誌檔案。這樣設計的目的顯而易見,日誌緩衝區是為了加快寫日誌的速度,而重做日誌檔案為日誌資料提供持久化的作用。在innodb的

Vert.x系列)--ContextImpl原始碼分析

開發十年,就只剩下這套架構體系了! >>>   

LinkedList原始碼分析JDK原始碼分析系列

如果本文中有不正確的地方請指出由於沒有留言可以在公眾號新增我的好友共同討論。 1.介紹 LinkedList 是執行緒不安全的,允許元素為null的雙向連結串列。 2.繼承結構 我們來看一下LinkedList的繼承結構圖: 程式碼實現: public class LinkedList<E>

Ansible系列()playbook應用和roles自動化批量安裝示例

獲取 agg 真的 deb vhd under ice ddl ssh連接 html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,

Redis系列redis鍵管理和redis數據庫管理

切換數據庫 eight eid 鍵值對 ren 遷移 mage try hset 一、redis鍵管理 1 鍵重命名 rename oldKey newkey //格式rename oldKey newKey //若oldKey之前存在則被覆蓋set name ja

SpringBoot系列SpringBoot錯誤處理(數據驗證、處理錯誤頁、全局異常)

lin container sub exce asn valid 程序 validator iterator 1、概念: SpringBoot 錯誤處理 2、具體內容 在之前的程序裏面如果一旦出現了錯誤之後就會出現一堆的大白板,這個白板會有一些錯誤信息(雖然這些錯誤信息你可

SpringCloud系列Ribbon 負載均衡(Ribbon 基本使用、Ribbon 負載均衡、自定義 Ribbon 配置、禁用 Eureka 實現 Ribbon 調用)

control context .mm 別名 void 用戶 size ali ram 1、概念:Ribbon 負載均衡 2、具體內容 現在所有的服務已經通過了 Eureka 進行了註冊,那麽使用 Eureka 註冊的目的是希望所有的服務都統一歸屬到 Eureka 之中進

搜索引擎系列Lucene索引詳解(IndexWriter詳解、Document詳解、索引更新)

let integer 自己 textfield app tdi AS query rect 一、IndexWriter詳解 問題1:索引創建過程完成什麽事?     分詞、存儲到反向索引中 1. 回顧Lucene架構圖: 介紹我們編寫的應用程序要完成數據的收集,再將數據

Docker教程系列Docker上部署tomcat

order targe borde tab 網站 web 系列 pull true 1下載tomcat鏡像(7-jre8代表tomcat7和java jdk8,tomcat需要java環境,點擊下面連接可以查看可下載的版本) 查看可下載版本 docker pull

『PHP學習筆記』系列選擇排序

演算法原理: 選擇排序(Selection sort)是一種簡單直觀的排序演算法。 它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 求得一個數組的最大值的下標,並將這個最大值下標的單元跟最後一個單元

Android進階3Activity原始碼分析(2) —— Activity啟動和銷燬流程(8.0)

上篇文章講述了app從啟動建立Activity呼叫onCreate,onStart, onResume方法,這篇文章講述一下Activity啟動的另一個切入點:startActivity方法,啟動Activity。 通過上一篇文章,我們總結一下: 1:A

訊息中介軟體系列RabbitMQ的使用場景(非同步處理、應用解耦)

一、非同步處理 場景: 使用者註冊,寫入資料庫成功以後,傳送郵件和簡訊。 準備工作: 1)安裝RabbitMQ,參考前面的文章 2)新建一個名為RabbitMQAsyncProc的maven web工程,在pom.xml檔案裡面引入如下依賴 <project xmlns="http://maven.a

SpringBoot框架搭建系列()整合Redis

本次我們整合Redis 1、首先引入依賴 <!--redis--> <dependency> <groupId>org.springframework.boot</groupId>