-
源碼下載、依賴安裝
參考:http://www.oschina.net/question/565065_66271
http://www.aboutyun.com/thread-11404-1-1.html
-
安裝git、setuptools、pip、gcc等(yum install gcc python-devel -y)
Mysql: yum -y install mysql-devel mysql zlib zlib-devel openssl
Lxml: yum remove audit
yum install gcc
yum install libxslt-devel libxml2-devel
-
Git下載keystone源碼
git clone -b stable/icehouse https://github.com/openstack/keystone.git
git clone -b stable/icehouse https://github.com/openstack/python-keystoneclient.git
-
安裝keystone依賴、安裝keystone
pip install -r requirements.txt
python setup.py install
-
配置keystone數據庫連接、日志級別
mkdir -p /etc/keystone/
cp -r etc/keystone.conf /etc/keystone/
修改數據庫連接:
connection=mysql://keystone:openstack@controller0/keystone
修改日志配置:
debug=true
verbose=true
use_stderr=false
log_dir=/opt/stack/keystone/log
log_file=keystone.log
修改ADMIN_TOKEN:
ADMIN_TOKEN=$(openssl rand -hex 10)
echo $ADMIN_TOKEN
admin_token=38eb8c44ca677eec1d67
export OS_SERVICE_TOKEN=`echo $ADMIN_TOKEN`
export OS_SERVICE_ENDPOINT=http://controller0:35357/v2.0
-
安裝配置mysql、建庫、權限設置、數據庫初始化
安裝mysql:
yum install -y mysql mysql-server MySQL-python
配置mysql:
vi /etc/my.cnf
[mysqld]
bind-address = 0.0.0.0
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
啟動mysql,設置開機自啟:
service mysqld start
chkconfig mysqld on
設置mysql密碼:
mysql_secure_installation root/openstack
創建數據庫,設置權限:
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';"
初始化keystone數據表:
su -s /bin/sh -c "keystone-manage db_sync"
-
設置keystone開機自啟
keystone-all &
監聽端口分別是35357、5000,對應於admin、public的端口。
vi /etc/init.d/keystone
#!/bin/sh
# chkconfig: 35 70 30
# description: keystone
/opt/stack/keystone/bin/keystone-all
chmod +x /etc/init.d/keystone
chkconfig --level 35 keystone on
service keystone start
-
Keystone測試
創建租戶/Project:
keystone tenant-create --name=admin --description="Admin Tenant"
keystone tenant-create --name=service --description="Service Tenant"
創建管理員用戶:
keystone user-create --name=admin --pass=admin --email=admin@example.com
創建管理員角色:
keystone role-create --name=admin
關聯租戶-用戶-角色:
keystone user-role-add --user=admin --tenant=admin --role=admin
創建服務:
keystone service-create --name=keystone --type=identity --description="Keystone Identity Service"
創建服務的endpoints:
keystone endpoint-create \
> --service-id=$(keystone service-list | awk '/ identity / {print $2}') \
> --publicurl=http://controller0:5000/v2.0 \
> --internalurl=http://controller0:5000/v2.0 \
> --adminurl=http://controller0:35357/v2.0
-
驗證服務安裝是否正確
unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT
設置PKI:
keystone-manage pki_setup --keystone-user keystone --keystone-group keystone
chown -R keystone:keystone /etc/keystone/ssl
chmod -R o-rwx /etc/keystone/ssl
unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT
命令行方式獲取token:
keystone --os-username=admin --os-password=admin --os-auth-url=http://controller0:35357/v2.0 token-get
keystone --os-username=admin --os-password=admin --os-tenant-name=admin --os-auth-url=http://controller0:35357/v2.0 token-get
也可以使用接口方式獲取token(curl –i選項可以打印返回消息頭):
curl -d '{"auth": {"tenantName": "admin", "passwordCredentials":{"username": "admin", "password": "admin"}}}' -H "Content-type: application/json" http://10.20.0.88:35357/v2.0/tokens | python -mjson.tool
GET方法使用如下:
curl -H "Content-type: application/json" http://10.20.0.88:35357/v2.0/ | python -mjson.tool
命令行方式使用——指定用戶名密碼方式:
keystone --os-tenant-name admin --os-username admin --os-password admin --os-auth-url http://controller0:35357/v2.0 role-list
-
-
Keystone架構
-
keystone設計
-
默認regionOne,select * from endpoint;可知。可使用多region共享keystone、dashboard方案,根據地理位置不同分別部署獨立完整的openstack環境,包括控制節點、計算節點、網絡節點等,但同時多個region共享一個keystone、dashboard,這樣我們可以使用統一的賬戶信息與統一的管理平台。
-
-
Keystone源碼解讀
-
基礎知識
-
eventlet:
-
wsgi:
-
Web服務器與應用程序接口,是一個規范。讓應用程序運行在任何兼容wsgi的web服務器上。注意eventlet與wsgi的集成。
-
Wsgiref與webob:
http://www.cnblogs.com/btchenguang/archive/2012/08/31/2664895.html
http://www.verydemo.com/demo_c122_i18733.html
-
消息隊列、消息隊列框架、rpc、rpc回調:
-
-
源碼解讀、調試
-
keystone-paste.ini文件:該文件由application, filter, pipeline, composite等定義段落組成。composite是第一層調度者,它粗略地根據不同的url類型將請求分配到不同的pipeline上。每一個pipeline由若干filter和一個application組成。正如其名,filter按照其在pipeline中的先后順序依次對http請求進行過濾,包括對參數進行格式化處理等操作。application位於pipeline的末尾,每一個pipeline只有一個application。最終通過所有filter的請求被application進一步調度到系統實現上每一個模塊的路由層(routers),路由層根據HTTP請求方法和具體的請求路徑,將HTTP請求分發給對應的控制層(controllers),controllers集中實現業務邏輯,並通過調用更低的驅動層完成底層的工作,如數據庫的讀寫等等。這些構成了composite, pipeline, filter, application和keystone實現間的邏輯關系。keystone-paste.ini文件從一個高層次定義了keystone所需的composite會將哪些類型的url交由由哪些pipeline, 每一個pipeline由哪些filter和app組成,以及具體到每一個filter和app是由系統源碼的哪一個部分實現的,事實上,從下文的分析可以看出,每一個filter在實現上都對應着一個特定的類,而每一個application在實現上則對應着一個具體的方法。
-
當用戶以HTTP POST方式請求http://localhost:5000/v3/auth/tokens這個url時,意味着用戶希望進行身份認證,同時獲得keystone簽發的Token。當然,用戶需要在自己的HTTP請求中給出一些自己的身份信息,這樣keystone才能據以判斷該用戶是否是系統合法的用戶,並根據其擁有的角色和權限為其簽發token。
-
該application將會實現第二層路由(第一層由keystone-paste.ini文件中的composite字段實現),此次路由將具體的請求處理工作進一步分發到系統的各個模塊上,比如代碼中的assignment,auth, catalog等等。由具體的模塊根據請求的具體路徑和內容完成具體功能。
-
配置庫:
http://www.cnblogs.com/xinyuyuanm/archive/2013/05/19/3087323.html
-
請求處理流程
-
講的比較好:
http://demo.netfoucs.com/napolunyishi/article/details/42501579
-
POST- keystone-paste.ini- composite初步分發- pipeline處理流程- user_crud_extension-調用UserController-調用具體的Driver操作數據庫
-
-
-
Keystone高可靠性、高可用性設計
-
HAProxy+Apache+Keystone+DBCluster/memcache