
OpenStack 클라우드 컴퓨팅 플랫폼의 핵심 컴포넌트 중 하나로, 아이덴티티 서비스를 제공한다. Keystone은 사용자 인증(authentication)과 서비스 권한 부여(authorization)를 관리하며, OpenStack 내의 다른 모든 서비스에 대한 인증 허브 역할을 한다.
아래는 Keystone Component의 Workflow 예시이다.

[모든 node에서 진행]
add-apt-repository cloud-archive:[Openstack Version]
add-apt-repository cloud-archive:yoga
* ubuntu22.04는 default openstack repository가 openstack yoga이므로 별도로 repository
설정이 필요없으나, 다른 openstack version을 사용할 경우, repository를 등록해야 한다.
ex)wallaby, xena, zed ...
apt install python3-openstackclient
[Con01에서 진행]
mysql -uroot -p
create database keystone;
> keystone database 생성
create user keystone@localhost identified by '[Password]';
create user keystone@localhost identified by 'keystone';
> keystone이 localhost에서 접근 가능하도록 생성
create user keystone@'%' identified by '[Password]';
create user keystone@'%' identified by 'keystone';
> keystone이 모든 host에서 접근 가능하도록 생성
grant all privileges on keystone.* to keystone@localhost;
> keystone@localhost 사용자에게 keystone Database에 대한 모든 권한 부여
grant all privileges on keystone.* to keystone@'%';
> keystone@'%' 사용자에게 keystone Database에 대한 모든 권한 부여
[모든 node에서 진행]
apt install apache2 keystone
vi /etc/keystone/keystone.conf
...
[database]
connection = mysql+pymysql://keystone:[Keystone DB Password]@[Virtual IP]:[Binding DB Port]/keystone
connection = mysql+pymysql://keystone:keystone@192.168.0.10:13306/keystone
...
[token]
provider = fernet
expiration = 28800
> expiration 설정이유는 기본 토큰 발급시간이 1시간이며, 토큰이 만료될 경우 세션이 종료되며 작업중이던 정보가
만료된 토큰으로 인해 중지하기 때문이며, 8시간동안 토큰이 만료되지 않도록 편하게 사용하기 위해 설정
불필요할 경우 별도로 설정하지 않아도 됨
...
[Con01에서 진행]
/bin/sh -c "keystone-manage db_sync" keystone
[Con01에서 진행]
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
> Controller#1에서만 진행하는 이유는, 모든 Node에서 Fernet & Credential Key
Initializing을 진행할 경우, fernet & credential key 값이 상이하여, 다중노드 구성에서의
인증 문제가 발생할수 있다.
scp -r /etc/keystone/*-keys root@con02:/etc/keystone/
scp -r /etc/keystone/*-keys root@con03:/etc/keystone/
ssh root@con02 chown -R keystone: /etc/keystone/*-keys
ssh root@con03 chown -R keystone: /etc/keystone/*-keys
> Fernet, Credential Key 모든 node에 복사 및 소유자 및 그룹 권한 keystone 설정
[Con01에서 진행]
keystone-manage bootstrap --bootstrap-password [Keystone Password] \
--bootstrap-admin-url http://[Admin Endpoint IP]:[Keystone Port]/v3/ \
--bootstrap-internal-url http://[Internal Endpoint IP]:[Keystone Port]/v3/ \
--bootstrap-public-url http://[Public Endpoint IP]:[Keystone Port]/v3/ \
--bootstrap-region-id RegionOne
* 이번 구축에선 admin,internal,public endpoint는 동일하게 가져갈 것이다.
* Bootstrap시 설정한 Keystone Password를 잘 기억하자, 나중에 Horizon Dashboard 접근시
필요한 Password이다.
keystone-manage bootstrap --bootstrap-password keystone \
--bootstrap-admin-url http://192.168.0.10:15000/v3/ \
--bootstrap-internal-url http://192.168.0.10:15000/v3/ \
--bootstrap-public-url http://192.168.0.10:15000/v3/ \
--bootstrap-region-id RegionOne
* Default Keystone Port는 5000번이나, 삼중화 구성으로 15000번 포트를 통해 5000번 포트로 로드밸런싱 예정이다.
[모든 node에서 진행]
touch /root/admin-openrc
vi /root/admin-openrc
export OS_USERNAME=admin
export OS_PASSWORD=[Bootstrap Keystone Password]
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://[Internal Endpoint IP]:[Keystone Port]/v3
export OS_IDENTITY_API_VERSION=3
export PS1='[\u@\h \W(admin_openrc)]\$ '
export OS_USERNAME=admin
export OS_PASSWORD=keystone
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://192.168.0.10:15000/v3
export OS_IDENTITY_API_VERSION=3
export PS1='[\u@\h \W(admin_openrc)]\$ '
> export PS1='[\u@\h \W(admin_openrc)]\$ '는 세션의 sourcing 여부를 눈으로 확인하기 위한 별도 설정이며
keystone 인증 환경 변수와는 무관하다.
[모든 node에서 진행]
vi /etc/haproxy/haproxy.cfg
...
listen keystone
bind 192.168.0.10:15000
balance source
option tcpka
option httpchk
server con01 192.168.0.11:5000 check inter 2000 rise 2 fall 5
server con02 192.168.0.12:5000 check inter 2000 rise 2 fall 5
server con03 192.168.0.13:5000 check inter 2000 rise 2 fall 5
[모든 node에서 진행]
systemctl restart haproxy
sytsemctl restart apache2
> Keystone은 apache2와 연동되는 Component로, apache2 재기동을 통한 keystone Config 설정을 적용한다.
source /root/admin-openrc
openstack catalog list
+-----------+-----------+-------------------------------------------------------------------------+
| Name | Type | Endpoints |
+-----------+-----------+-------------------------------------------------------------------------+
| keystone | identity | RegionOne |
| | | internal: http://192.168.0.10:15000/v3/ |
| | | RegionOne |
| | | admin: http://192.168.0.10:15000/v3/ |
| | | RegionOne |
| | | public: http://192.168.0.10:15000/v3/ |
| | | |
+-----------+-----------+-------------------------------------------------------------------------+
openstack endpoint list
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------------------+
| 59574b5d278446ce9b71ee2d577ff242 | RegionOne | keystone | identity | True | internal | http://192.168.0.10:15000/v3/ |
| 82f1c5d05b964bd7bb783ae3c21c5813 | RegionOne | keystone | identity | True | admin | http://192.168.0.10:15000/v3/ |
| e3d3076d97194392aa9a4ce7b83b82a0 | RegionOne | keystone | identity | True | public | http://192.168.0.10:15000/v3/ |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------------------+
#[Con01에서 진행]
openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Service Project |
| domain_id | default |
| enabled | True |
| id | 2d84e984c353478f8e3e7a0051332cf2 |
| is_domain | False |
| name | service |
| options | {} |
| parent_id | default |
| tags | [] |
+-------------+----------------------------------+