一、搭建高可用OpenStack(Queen版)叢集之部署認證服務(Keystone)控制節點叢集
一、Identity 服務簡介
1、Identity概述
Identity為認證管理,授權管理和服務目錄服務管理提供單點整合。其它Openstack服務将身份認證服務當作統一API來使用。
當某個Openstack服務收到來自使用者的請求時,該服務會直接詢問Identitiy服務,驗證該使用者是否有權限進行此次請求。
2、keystone各元件概念
- 使用者:使用openstack雲服務的使用者、系統或者服務,身份服務驗證使用者送出的請求。使用者需要登入,然後可能會配置設定令牌已通路資源。多使用者可以直接配置設定給特定的租戶,并且表現的就像他們包含該租戶内。
- 認證資訊:确認使用者身份的資料。比如使用者名和密碼,使用者名和API鍵,或者身份服務提供的認證令牌
- 認證:确認使用者身份的過程。Openstack身份服務通過驗證使用者提供的認證資訊确認請求,當認證資訊被驗證後,Openstack認證服務發給使用者認證令牌,在後續的請求中使用者将使用該令牌。
- 令牌:文本形式的字母-數字字元串,使用該字元串通路Openstack的API和資源。令牌在有限的時間内是有效的,可能在任何時間被取消。
- 租戶:分組或隔離資源容器,租戶也用于分組或隔離身份對象。基于服務操作者,租戶可能映射為客戶、組織或項目
- 服務:一個openstack服務提供了一個或多個端點,在端點内使用者可以通路資源或者執行操作。
- 角色:定義了執行特定操作的使用者權限的集合。在身份服務中,發給使用者的令牌包括角色的清單。被使用者通路的服務确定如何解釋使用者擁有的角色和每個角色可以通路的操作和資源。
- keystone用戶端:openstack身份服務API的指令行接口。
3、Keystone 拓撲圖

4、keystone驗證的過程
認證方式(兩種):使用者名/密碼;基于令牌(Token)
二、部署認證服務(Keystone)叢集
1、建立keystone資料庫(任意一個控制節點操作)
mysql -u root -p
CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '123456';
flush privileges;
exit;
2、安裝keystone
在全部控制節點安裝keystone
yum install openstack-keystone httpd mod_wsgi mod_ssl -y
3、更改配置檔案keystone.conf
在全部控制節點設定
# cp -rp /etc/keystone/keystone.conf{,.bak}
# egrep -v "^$|^#" /etc/keystone/keystone.conf
[DEFAULT]
[application_credential]
[assignment]
[auth]
[cache]
backend = oslo_cache.memcache_pool
enabled = true
memcache_servers = controller01:11211,controller02:11211,controller03:11211
[catalog]
[cors]
[credential]
[database]
connection = mysql+pymysql://keystone:123456@controller/keystone
[domain_config]
[endpoint_filter]
[endpoint_policy]
[eventlet_server]
[federation]
[fernet_tokens]
[healthcheck]
[identity]
[identity_mapping]
[ldap]
[matchmaker_redis]
[memcache]
[oauth1]
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_messaging_zmq]
[oslo_middleware]
[oslo_policy]
[paste_deploy]
[policy]
[profiler]
[resource]
[revoke]
[role]
[saml]
[security_compliance]
[shadow_users]
[signing]
[token]
provider = fernet
[tokenless_auth]
[trust]
[unified_limit]
配置部分解釋
[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
部分解釋(token認證)
4、同步資料庫
任意控制節點操作
同步資料庫
su -s /bin/sh -c "keystone-manage db_sync"
檢視驗證
mysql -h controller01 -ukeystone -p123456 -e "use keystone;show tables;"
5、初始化fernet秘鑰
每個節點都需要生成fernet keys 但是三個節點的 fernet keys 必須保持一緻,否則認證的時候會報錯。
標明任意控制節點(controller01)做fernet秘鑰初始化,在/etc/keystone/生成相關秘鑰及目錄
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
向controller02/03節點同步秘鑰
scp -r /etc/keystone/fernet-keys/ /etc/keystone/credential-keys/ [email protected]:/etc/keystone/
scp -r /etc/keystone/fernet-keys/ /etc/keystone/credential-keys/ [email protected]:/etc/keystone/
同步後,注意controller02/03節點上秘鑰權限
chown keystone:keystone /etc/keystone/credential-keys/ -R
chown
6、配置httpd.conf
在全部控制節點設定
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak
sed -i "s/#ServerName www.example.com:80/ServerName ${HOSTNAME}/"
注意不同的節點替換不同的ip位址
sed -i "s/Listen\ 80/Listen\ 10.20.9.189:80/g" /etc/httpd/conf/httpd.conf
sed -i "s/Listen\ 80/Listen\ 10.20.9.190:80/g" /etc/httpd/conf/httpd.conf
sed -i "s/Listen\ 80/Listen\ 10.20.9.45:80/g"
7、配置wsgi-keystone.conf
在全部控制節點操作
1、複制wsgi-keystone.conf檔案;或者針對wsgi-keystone.conf建立軟連結
cp
2、修改wsgi-keystone.conf檔案,注意各節點對應的ip位址或主機名等
sed -i "s/Listen\ 5000/Listen\ 10.20.9.189:5000/g" /etc/httpd/conf.d/wsgi-keystone.conf
sed -i "s/Listen\ 35357/Listen\ 10.20.9.189:35357/g" /etc/httpd/conf.d/wsgi-keystone.conf
sed -i "s/*:5000/10.20.9.189:5000/g" /etc/httpd/conf.d/wsgi-keystone.conf
sed -i "s/*:35357/10.20.9.189:35357/g"
8、認證引導
任意控制節點操作
初始化admin使用者(管理使用者)與密碼,3種api端點,服務實體可用區等
keystone-manage bootstrap --bootstrap-password admin_pass \
--bootstrap-admin-url http://controller:35357/v3/ \
--bootstrap-internal-url http://controller:5000/v3/ \
--bootstrap-public-url http://controller:5000/v3/ \
--bootstrap-region-id
9、啟動服務
在全部控制節點操作
systemctl enable httpd.service
systemctl restart httpd.service
systemctl status httpd.service
10、openstack client 環境變量腳本
1、admin-openrc
openstack client環境腳本定義client調用openstack api環境變量,以友善api的調用(不必在指令行中攜帶環境變量);
根據不同的使用者角色,需要定義不同的腳本;
這裡以“認證引導”章節定義的admin使用者為例,設定其環境腳本,再根據需要分發到需要運作openstack client工具的節點;
一般将腳本建立在使用者主目錄
cat>admin-openrc<<EOF
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_pass
export OS_AUTH_URL=http://controller:5000/v3
# 從安全角度考慮,一般不對client暴露admin-api,這裡admin-api與public-api共用1個vip位址
# export OS_AUTH_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3
EOF
chmod u+x admin-openrc
使變量生效
source admin-openrc
驗證
openstack token issue
2、demo-openrc
同admin-openrc,注意project/user/password的差別
cat>demo-openrc<<EOF
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_pass
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
EOF
chmod u+x demo-openrc
使變量生效
source demo-openrc
驗證
openstack token issue
3、分發腳本
scp admin-openrc demo-openrc [email protected]:~/
scp admin-openrc demo-openrc [email protected]:~/
11、建立domain, projects, users, 與roles
1、domain
projrct/user等基于domain存在;
在”認證引導”章節中,初始化admin使用者即生成”default” domain
[root@controller01 ~]# openstack domain list
+---------+---------+---------+--------------------+
| ID | Name | Enabled | Description |
+---------+---------+---------+--------------------+
| default | Default | True | The default domain |
+---------+---------+---------+--------------------+
如果需要生成新的domain
[root@controller01 ~]#"An Example Domain" example
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | An Example Domain |
| enabled | True |
| id | e2ad8bb0985b42eaa2640102a1f04dc9 |
| name | example |
| tags | [] |
+-------------+----------------------------------+
[root@controller01 ~]# openstack domain list
+----------------------------------+---------+---------+--------------------+
| ID | Name | Enabled | Description |
+----------------------------------+---------+---------+--------------------+
| default | Default | True | The default domain |
| e2ad8bb0985b42eaa2640102a1f04dc9 | example | True | An Example Domain |
+----------------------------------+---------+---------+--------------------+
若如下錯誤,說明環境變量沒有設定對(請檢查10)
錯誤一:
openstack domain list
openstack: 'domain list' is not an openstack command. See 'openstack --help'.
Did you mean one of these?
錯誤二:
Missing value auth-url required for auth plugin password
2、projects
project屬于某個domain;
以建立demo項目為例,demo項目屬于”default” domain
[root@controller01 ~]# openstack project create --domain default --description "Demo Project" demo
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Demo Project |
| domain_id | default |
| enabled | True |
| id | a271f4c73cdc4780a0c3ee5154f12171 |
| is_domain | False |
| name | demo |
| parent_id | default |
| tags | [] |
+-------------+----------------------------------+
3、users
user屬于某個domain;
以建立demo使用者為例,demo使用者屬于”default” domain
[root@controller01 ~]# openstack user create --domain default --password=demo_pass demo
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | default |
| enabled | True |
| id
4、roles
建立普通使用者角色(差別于admin使用者)
[root@controller01 ~]# openstack role create user
+-----------+----------------------------------+
| Field | Value |
+-----------+----------------------------------+
| domain_id | None |
| id
向demo項目的demo使用者賦予user權限,這個沒有傳回值
openstack role add --project demo --user demo user
檢視權限配置設定
[root@controller01 ~]# openstack user list
+----------------------------------+-------+
| ID | Name |
+----------------------------------+-------+
| 335788ba925b4ceb8c3a75f605a6d6ce | demo |
| 5eaaba0a94934af1b78fa7fd37c57e67 | admin |
+----------------------------------+-------+
[root@controller01 ~]# openstack role list
+----------------------------------+-------+
| ID | Name |
+----------------------------------+-------+
| 298192bad24143d9a1bef54837277e2d | admin |
| 59066f0348464b9d807f0aeaee4bb225 | user |
+----------------------------------+-------+
[root@controller01 ~]# openstack role assignment list
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
| Role | User | Group | Project | Domain | Inherited |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
| 59066f0348464b9d807f0aeaee4bb225 | 335788ba925b4ceb8c3a75f605a6d6ce | | a271f4c73cdc4780a0c3ee5154f12171 | | False |
| 298192bad24143d9a1bef54837277e2d | 5eaaba0a94934af1b78fa7fd37c57e67 | | 109783812ec540e982640e382f967065 | | False |
| 298192bad24143d9a1bef54837277e2d | 5eaaba0a94934af1b78fa7fd37c57e67 | | | | False |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
12、設定pcs資源
在任意控制節點操作
pcs實際控制的是各節點system unit控制的httpd服務(沒有傳回值)
pcs resource create openstack-keystone systemd:httpd --clone interleave=true
驗證
[root@controller01 ~]# pcs resource
vip (ocf::heartbeat:IPaddr2): Started controller01
Clone Set: lb-haproxy-clone [lb-haproxy]
Started: [ controller01 ]
Stopped: [ controller02 controller03 ]
Clone Set: openstack-keystone-clone [openstack-keystone]
Started: [ controller01 controller02 controller03 ]