[ Openstack ] OpenStack-Mitaka 高可用之 認證服務(keystone)


 目錄

    Openstack-Mitaka 高可用之 概述
    Openstack-Mitaka 高可用之 環境初始化
    Openstack-Mitaka 高可用之 Mariadb-Galera集群部署
    Openstack-Mitaka 高可用之 Rabbitmq-server 集群部署
    Openstack-Mitaka 高可用之 memcache
    Openstack-Mitaka 高可用之 Pacemaker+corosync+pcs高可用集群
    Openstack-Mitaka 高可用之 認證服務(keystone)
    OpenStack-Mitaka 高可用之 鏡像服務(glance)
    Openstack-Mitaka 高可用之 計算服務(Nova)
    Openstack-Mitaka 高可用之 網絡服務(Neutron)
    Openstack-Mitaka 高可用之 Dashboard
    Openstack-Mitaka 高可用之 啟動一個實例
    Openstack-Mitaka 高可用之 測試

 

 Identity 服務簡介

Identity為認證管理,授權管理和服務目錄服務管理提供單點整合。其它Openstack服務將身份認證服務當作統一API來使用。
當某個Openstack服務收到來自用戶的請求時,該服務會直接詢問Identitiy服務,驗證該用戶是否有權限進行此次請求。

keystone各組件概念:
    (1)用戶:使用openstack雲服務的用戶、系統或者服務,身份服務驗證用戶提交的請求。用戶需要登錄,然后可能會分配令牌已訪問資源。多用戶可以直接分配給特定的租戶,並且表現的就像他們包含該租戶內。
    (2)認證信息:確認用戶身份的數據。比如用戶名和密碼,用戶名和API鍵,或者身份服務提供的認證令牌
    (3)認證:確認用戶身份的過程。Openstack身份服務通過驗證用戶提供的認證信息確認請求,當認證信息被驗證后,Openstack認證服務發給用戶認證令牌,在后續的請求中用戶將使用該令牌。
    (4)令牌:文本形式的字母-數字字符串,使用該字符串訪問Openstack的API和資源。令牌在有限的時間內是有效的,可能在任何時間被取消。
    (5)租戶:分組或隔離資源容器,租戶也用於分組或隔離身份對象。基於服務操作者,租戶可能映射為客戶、組織或項目
    (6)服務:一個openstack服務提供了一個或多個端點,在端點內用戶可以訪問資源或者執行操作。
    (7)角色:定義了執行特定操作的用戶權限的集合。在身份服務中,發給用戶的令牌包括角色的列表。被用戶訪問的服務確定如何解釋用戶擁有的角色和每個角色可以訪問的操作和資源。
    (8)keystone客戶端:openstack身份服務API的命令行接口。

 

Keystone 拓撲圖

 

keystone驗證的過程:

 

 keystone安裝和配置

 在配置opnstack身份認證前,必須創建一個數據庫和管理員令牌

用 galera用戶連接到mariadb集群創建數據庫

[root@controller1 ~]# mysql -ugalera -pgalera -h 192.168.0.10

MariaDB [(none)]> CREATE DATABASE keystone;
Query OK, 1 row affected (0.10 sec)

對庫授權並新增用戶keystone
MariaDB [(none)]> grant all privileges on keystone.* to 'keystone'@'%' identified by 'keystone';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> grant all privileges on keystone.* to 'keystone'@'localhost' identified by 'keystone';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

生成一個隨機值在初始的配置中作為管理員的令牌

[root@controller1 ~]# openssl rand -hex 10
8c67dd7baaf367136f01

 

安裝配置組件:

三個節點安裝:

 

# yum install openstack-keystone httpd mod_wsgi  python-openstackclient -y

編輯配置文件:
[root@controller1 ~]# vim /etc/keystone/keystone.conf
[DEFAULT]
...
admin_token = ADMIN_TOKEN

# ADMIN_TOKEN 替換為openssl 生成的隨機字符串,例如:
admin_token = 8c67dd7baaf367136f01

在[database] 部分,配置數據庫訪問
[database]
...
connection = mysql+pymysql://keystone:keystone@controller/keystone
# 注意這里 controller 已經在/etc/hosts 中解析為 vip 地址

在``[token]``部分,配置Fernet UUID令牌的提供者。
[token]
...
provider = fernet
初始化身份認證服務的數據庫:
# su -s /bin/sh -c "keystone-manage db_sync" keystone
初始化Fernet keys:
# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone

將初始化后的key拷貝到其他controller節點,否則在haproxy調取的時候會報錯
 
[root@controller1 /etc/keystone]# scp -r fernet-keys/ controller2:/etc/keystone/
1                                                                                                                          100%   44     0.0KB/s   00:00    
0                                                                                                                          100%   44     0.0KB/s   00:00    
[root@controller1 /etc/keystone]# scp -r fernet-keys/ controller3:/etc/keystone/
1                                                                                                                          100%   44     0.0KB/s   00:00    
0

注意權限問題
# chown -R keystone:keystone fernet-keys/

 

 配置 apache 服務器

修改文件 /etc/httpd/conf/httpd.conf 中ServerName 為本地管理地址
Listen 192.168.0.11:80
…
ServerName controller1

用下面的內容創建文件 /etc/httpd/conf.d/wsgi-keystone.conf,記得修改監聽到本地,這樣haproxy監聽的vip才能啟動
Listen 5000
Listen 35357
<VirtualHost *:5000>
    WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-public
    WSGIScriptAlias / /usr/bin/keystone-wsgi-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    ErrorLogFormat "%{cu}t %M"
    ErrorLog /var/log/httpd/keystone-error.log
    CustomLog /var/log/httpd/keystone-access.log combined
<Directory /usr/bin>
        Require all granted
    </Directory>
</VirtualHost>
<VirtualHost *:35357>
    WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-admin
    WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    ErrorLogFormat "%{cu}t %M"
    ErrorLog /var/log/httpd/keystone-error.log
    CustomLog /var/log/httpd/keystone-access.log combined
<Directory /usr/bin>
        Require all granted
    </Directory>
</VirtualHost>


檢查http是否有語法報錯
[root@controller1 ~]# httpd -t
Syntax OK

將 /etc/keystone/keystone.conf 、 /etc/httpd/conf.d/wsgi-keystone.conf 拷貝到controller2 controller3

[root@controller1 ~]# scp /etc/keystone/keystone.conf controller2:/etc/keystone/
keystone.conf                                                                                                              100%  111KB 111.1KB/s   00:00    
[root@controller1 ~]# scp /etc/keystone/keystone.conf controller3:/etc/keystone/
keystone.conf                                                                                                              100%  111KB 111.1KB/s   00:00    
[root@controller1 ~]# scp /etc/httpd/conf.d/wsgi-keystone.conf controller2:/etc/httpd/conf.d/
wsgi-keystone.conf                                                                                                         100% 1039     1.0KB/s   00:00    
[root@controller1 ~]# scp /etc/httpd/conf.d/wsgi-keystone.conf controller3:/etc/httpd/conf.d/
wsgi-keystone.conf                                                                                                         100% 1039     1.0KB/s   00:00 

初始化Fernet keys

這里有個天坑。每個節點都需要生成fernet keys  但是三個節點的 fernet keys 必須保持一致,否則認證的時候會報錯。

# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone

將controller1節點的fernet keys 覆蓋其他節點的keys,注意權限問題。
[root@controller1 keystone]# scp -r fernet-keys controller2:/etc/keystone/
1                                                                                                                          100%   44     0.0KB/s   00:00    
0                                                                                                                          100%   44     0.0KB/s   00:00    
[root@controller1 keystone]# scp -r fernet-keys controller3:/etc/keystone/
1                                                                                                                          100%   44     0.0KB/s   00:00    
0                                                                                                                          100%   44     0.0KB/s   00:00

# chown -R keystone:keystone fernet-keys/

再次重啟httpd服務。
# systemctl restart httpd

這篇文章說的很清楚。
http://blog.csdn.net/quqi99/article/details/52373086

記得修改/etc/httpd/conf/httpd.conf 中的 ServerName

三個節點執行啟動服務:

# systemctl enable httpd ; systemctl restart httpd

將啟動的http,共兩個端口35357、5000加入到haproxy中:

listen galera_cluster
    mode tcp
    bind 192.168.0.10:3306
    balance source
    option mysql-check user haproxy
    server controller1 192.168.0.11:3306 check inter 2000 rise 3 fall 3
    server controller2 192.168.0.12:3306 check inter 2000 rise 3 fall 3
    server controller3 192.168.0.13:3306 check inter 2000 rise 3 fall 3

listen keystone_admin_cluster
    mode http
    bind  192.168.0.10:35357
    balance source        # 認證服務必須使用源地址綁定的輪詢算法,因為認證信息是在本地填寫的。 
    server controller1 192.168.0.11:35357 check inter 2000 rise 3 fall 3
    server controller2 192.168.0.12:35357 check inter 2000 rise 3 fall 3
    server controller3 192.168.0.13:35357 check inter 2000 rise 3 fall 3
listen keystone_public_internal_cluster
    mode http
    bind  192.168.0.10:5000
    balance source
    server controller1 192.168.0.11:5000 check inter 2000 rise 3 fall 3
    server controller2 192.168.0.12:5000 check inter 2000 rise 3 fall 3
    server controller3 192.168.0.13:5000 check inter 2000 rise 3 fall 3



嘗試啟動並查看監聽
[root@controller1 ~]# systemctl restart haproxy 
[root@controller1 ~]# netstat -ntplu | grep ha
tcp        0      0 192.168.0.10:5672       0.0.0.0:*               LISTEN      34219/haproxy       
tcp        0      0 192.168.0.10:3306       0.0.0.0:*               LISTEN      34219/haproxy       
tcp        0      0 192.168.0.10:35357      0.0.0.0:*               LISTEN      34219/haproxy       
udp        0      0 0.0.0.0:50050           0.0.0.0:*                           34218/haproxy

將修改后的haproxy拷貝到其他controller節點,所有的controller節點的haproxy.cfg必須保持一致。

 

創建服務實體和API端點

配置認證令牌,最好在三個節點都執行:
[root@controller1 ~]# export OS_TOKEN=8c67dd7baaf367136f01
[root@controller1 ~]# export OS_URL=http://controller:35357/v3
[root@controller1 ~]# export OS_IDENTITY_API_VERSION=3

創建服務實體和身份認證服務:
[root@controller1 ~]# openstack service create   --name keystone --description "OpenStack Identity" identity

創建認證服務的API端點
身份認證服務管理了一個與環境相關的API端點目錄,服務使用這個目錄來決定如何與環境中的其他服務進行通信

以下操作在任意一個controller節點執行:

# openstack endpoint create --region RegionOne   identity public http://controller:5000/v3
# openstack endpoint create --region RegionOne   identity internal http://controller:5000/v3
# openstack endpoint create --region RegionOne   identity admin http://controller:35357/v3
# openstack domain create --description "Default Domain" default
# openstack project create --domain default   --description "Admin Project" admin
# openstack user create --domain default   --password-prompt admin        # 創建admin用戶,密碼設置為 admin
# openstack role create admin
# openstack role add --project admin --user admin admin
# openstack project create --domain default   --description "Service Project" service
# openstack project create --domain default   --description "Demo Project" demo
# openstack user create --domain default   --password-prompt demo        # 創建demo用戶,密碼設置為 demo
# openstack role create user
# openstack role add --project demo --user demo user

驗證:

# unset OS_TOKEN OS_URL
# openstack --os-auth-url http://controller:35357/v3   --os-project-domain-name default --os-user-domain-name default   --os-project-name admin --os-username admin token issue
密碼:admin
# openstack --os-auth-url http://controller:5000/v3   --os-project-domain-name default --os-user-domain-name default   --os-project-name demo --os-username demo token issue
密碼:demo

創建admin用戶認證信息腳本

[root@controller1 ~]# vim admin-openrc
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

創建demo用戶認證信息腳本

[root@controller1 ~]# vim demo-openrc 
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=demo
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

拷貝到其他節點上做備份:

[root@controller1 ~]# scp admin-openrc demo-openrc controller2:/root/
admin-openrc                                                                                                               100%  261     0.3KB/s   00:00    
demo-openrc                                                                                                                100%  257     0.3KB/s   00:00    
[root@controller1 ~]# scp admin-openrc demo-openrc controller3:/root/
admin-openrc                                                                                                               100%  261     0.3KB/s   00:00    
demo-openrc                                                                                                                100%  257     0.3KB/s   00:00

使用腳本

[root@controller1 ~]# . admin-openrc 
請求認證令牌
[root@controller1 ~]# openstack token issue

成功。keystone部署成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM