노바는 컴퓨팅 부분 그러니까 VM의 관리를 맡는 서비스이다.
여기서부터 openstack 공식 메뉴얼에 오탈자 부분이 있어 만일 공식 메뉴얼을 참고할 경우 유심히 확인하여 설치하는게 좋다.
단일 노드일경우는 추가적으로 기입하는 형태로 진행하면 되어서 상관없지만 다중 노드일경우 컨트롤러 노드와 컴퓨팅 노드 부분을 유의하여 구축하길 바란다.
컨트롤러 노드
DB, 서비스 사용자 등록 및 API 엔드포인트 생성
sudo su root
#루트 권한 접속
#DB 등록
mysql
#mariadb 접속
MariaDB [(none)]> CREATE DATABASE nova_api;
MariaDB [(none)]> CREATE DATABASE nova;
MariaDB [(none)]> CREATE DATABASE nova_cell0;
#DB생성
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
IDENTIFIED BY 'NOVA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
IDENTIFIED BY 'NOVA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
IDENTIFIED BY 'NOVA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
IDENTIFIED BY 'NOVA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' \
IDENTIFIED BY 'NOVA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \
IDENTIFIED BY 'NOVA_DBPASS';
#액세스 권한 설정,설정한 NOVA_DBPASS 기입
. admin-openrc
#어드민 권한 접속
#서비스 사용자 등록
openstack user create --domain default --password-prompt nova
#nova 사용자 등록
User Password: #NOVA_PASS
Repeat User Password: #NOVA_PASS
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | default |
| enabled | True |
| id | 8a7dbf5279404537b1c7b86c033620fe |
| name | nova |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
#생성 결과(예시)
openstack role add --project service --user nova admin
#admin 역활 추가
openstack service create --name nova \
--description "OpenStack Compute" compute
#서비스 엔터티 생성
#API 엔드포인트 추가
openstack endpoint create --region RegionOne \
compute public http://controller:8774/v2.1
#public
+--------------+-------------------------------------------+
| Field | Value |
+--------------+-------------------------------------------+
| enabled | True |
| id | 3c1caa473bfe4390a11e7177894bcc7b |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 060d59eac51b4594815603d75a00aba2 |
| service_name | nova |
| service_type | compute |
| url | http://controller:8774/v2.1 |
+--------------+-------------------------------------------+
#생성 결과(예시)
openstack endpoint create --region RegionOne \
compute internal http://controller:8774/v2.1
#internal
+--------------+-------------------------------------------+
| Field | Value |
+--------------+-------------------------------------------+
| enabled | True |
| id | e3c918de680746a586eac1f2d9bc10ab |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 060d59eac51b4594815603d75a00aba2 |
| service_name | nova |
| service_type | compute |
| url | http://controller:8774/v2.1 |
+--------------+-------------------------------------------+
#생성 결과(예시)
openstack endpoint create --region RegionOne \
compute admin http://controller:8774/v2.1
#admin
+--------------+-------------------------------------------+
| Field | Value |
+--------------+-------------------------------------------+
| enabled | True |
| id | 38f7af91666a47cfb97b4dc790b94424 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 060d59eac51b4594815603d75a00aba2 |
| service_name | nova |
| service_type | compute |
| url | http://controller:8774/v2.1 |
+--------------+-------------------------------------------+
#생성 결과(예시)
구성요소 설치 및 설정
apt-get update
#최신화
apt install nova-api nova-conductor nova-novncproxy nova-scheduler
#패키지 설치
vi /etc/nova/nova.conf
[api_database]
....(생략)
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api
#NOVA_DBPASS 기입
[database]
....(생략)
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova
#NOVA_DBPASS 기입
[DEFAULT]
#log_dir = /var/log/nova
#패키징 버그로 인하여 'log_dir'이 활성화 되어 있다면 '#'을 붙혀 비활성화
....(생략)
transport_url = rabbit://openstack:RABBIT_PASS@controller:5672/
#RABBIT_PASS 기입
[api]
....(생략)
auth_strategy = keystone
[keystone_authtoken]
www_authenticate_uri = http://controller:5000/
auth_url = http://controller:5000/
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = NOVA_PASS
#NOVA_PASS 기입
[service_user]
send_service_user_token = true
auth_url = http://controller:5000/identity
auth_strategy = keystone
auth_type = password
project_domain_name = Default
project_name = service
user_domain_name = Default
username = nova
password = NOVA_PASS
#공식 메뉴얼에서는 'auth_url'에서 'http://' 가 아닌 'https://' 로 되어있고
#keystone의 5000포트가 빠져있어
#이 부분을 수정하지 않으면 서비스 토큰이 정상 발급되지않아 서비스가 정상적으로 돌지 않는다.
#NOVA_PASS 기입
[DEFAULT]
...(생략)
my_ip = controller
#해당 부분은 설정파일의 변수로 사용하기 때문에 controller의 로컬 ip로 기입하는 걸 권장한다.
[vnc]
...(생략)
enabled = true
...(생략)
server_listen = $my_ip
...(생략)
server_proxyclient_address = $my_ip
[glance]
...(생략)
api_servers = http://controller:9292
[oslo_concurrency]
...(생략)
lock_path = /var/lib/nova/tmp
[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:5000/v3
username = placement
password = PLACEMENT_PASS
#PLACEMENT_PASS 기입
wq
#저장
su -s /bin/sh -c "nova-manage api_db sync" nova
#nova-api DB에 설정값 기입
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
#'cell0' DB 등록
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
#'cell1'셀 생성
su -s /bin/sh -c "nova-manage db sync" nova
#nova DB에 설정값 기입
su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
#등록확인
+-------+--------------------------------------+----------------------------------------------------+--------------------------------------------------------------+----------+
| Name | UUID | Transport URL | Database Connection | Disabled |
+-------+--------------------------------------+----------------------------------------------------+--------------------------------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 | none:/ | mysql+pymysql://nova:****@controller/nova_cell0?charset=utf8 | False |
| cell1 | f690f4fd-2bc5-4f15-8145-db561a7b9d3d | rabbit://openstack:****@controller:5672/nova_cell1 | mysql+pymysql://nova:****@controller/nova_cell1?charset=utf8 | False |
+-------+--------------------------------------+----------------------------------------------------+--------------------------------------------------------------+----------+
#생성 결과(예시)
#설치 마무리를 위한 각 nova 재시작
service nova-api restart
service nova-scheduler restart
service nova-conductor restart
service nova-novncproxy restart
컴퓨팅 노드
구성 요소 설치 및 구성
apt-get update
#최신화
apt install nova-compute
#패키지 설치
[DEFAULT]
my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
#컴퓨팅 노드의 ip
...(생략)
transport_url = rabbit://openstack:RABBIT_PASS@controller:5672/
[api]
...(생략)
auth_strategy = keystone
[keystone_authtoken]
www_authenticate_uri = http://controller:5000/
auth_url = http://controller:5000/
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = NOVA_PASS
[service_user]
send_service_user_token = true
auth_url = http://controller:5000/identity
auth_strategy = keystone
auth_type = password
project_domain_name = Default
project_name = service
user_domain_name = Default
username = nova
password = NOVA_PASS
[vnc]
enabled = true
server_listen = $my_ip #컴퓨팅 노드일경우 0.0.0.0
server_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html
[glance]
...(생략)
api_servers = http://controller:9292
[oslo_concurrency]
...(생략)
lock_path = /var/lib/nova/tmp
[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:5000/v3
username = placement
password = PLACEMENT_PASS
#PLACEMENT_PASS 기입
wq
#저장
#설치 마무리
service nova-compute restart
#재시작
셀 데이터베이스에 컴퓨팅 노드 추가 (컨트롤러 노드에서 진행)
. admin-openrc
#어드민 권한 접속
openstack compute service list --service nova-compute
#컴퓨팅 노드 확인
+----+-------+--------------+------+-------+---------+----------------------------+
| ID | Host | Binary | Zone | State | Status | Updated At |
+----+-------+--------------+------+-------+---------+----------------------------+
| 1 | node1 | nova-compute | nova | up | enabled | 2017-04-14T15:30:44.000000 |
+----+-------+--------------+------+-------+---------+----------------------------+
#출력값(예시)
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
#컴퓨팅 호스트 검색
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting compute nodes from cell 'cell1': ad5a5985-a719-4567-98d8-8d148aaae4bc
Found 1 computes in cell: ad5a5985-a719-4567-98d8-8d148aaae4bc
Checking host mapping for compute host 'compute': fe58ddc1-1d65-4f87-9456-bc040dc106b3
Creating host mapping for compute host 'compute': fe58ddc1-1d65-4f87-9456-bc040dc106b3
#출력값(예시)
작동 확인 (컨트롤러 노드)
노드 작동 확인
. admin-openrc
#어드민 권한 흭득
openstack compute service list
#서비스 구성요소 나열
+----+--------------------+------------+----------+---------+-------+----------------------------+
| Id | Binary | Host | Zone | Status | State | Updated At |
+----+--------------------+------------+----------+---------+-------+----------------------------+
| 1 | nova-scheduler | controller | internal | enabled | up | 2016-02-09T23:11:15.000000 |
| 2 | nova-conductor | controller | internal | enabled | up | 2016-02-09T23:11:16.000000 |
| 3 | nova-compute | compute1 | nova | enabled | up | 2016-02-09T23:11:20.000000 |
+----+--------------------+------------+----------+---------+-------+----------------------------+
#결과값(예시)
#해당 State 부분이 up 상태여야 한다.
openstack catalog list
#연결 확인을 위한 엔드포인트 나열
+-----------+-----------+-----------------------------------------+
| Name | Type | Endpoints |
+-----------+-----------+-----------------------------------------+
| keystone | identity | RegionOne |
| | | public: http://controller:5000/v3/ |
| | | RegionOne |
| | | internal: http://controller:5000/v3/ |
| | | RegionOne |
| | | admin: http://controller:5000/v3/ |
| | | |
| glance | image | RegionOne |
| | | admin: http://controller:9292 |
| | | RegionOne |
| | | public: http://controller:9292 |
| | | RegionOne |
| | | internal: http://controller:9292 |
| | | |
| nova | compute | RegionOne |
| | | admin: http://controller:8774/v2.1 |
| | | RegionOne |
| | | internal: http://controller:8774/v2.1 |
| | | RegionOne |
| | | public: http://controller:8774/v2.1 |
| | | |
| placement | placement | RegionOne |
| | | public: http://controller:8778 |
| | | RegionOne |
| | | admin: http://controller:8778 |
| | | RegionOne |
| | | internal: http://controller:8778 |
| | | |
+-----------+-----------+-----------------------------------------+
#출력값(예시)
#해당 출력에서 나오는 추가적인 경고는 무시하여도 됩니다.
openstack image list
#이미지 나열
+--------------------------------------+-------------+-------------+
| ID | Name | Status |
+--------------------------------------+-------------+-------------+
| 9a76d9f9-9620-4f2e-8c69-6c5691fae163 | cirros | active |
+--------------------------------------+-------------+-------------+
#출력값(예시)
nova-status upgrade check
#nova API 상태 확인
+--------------------------------------------------------------------+
| Upgrade Check Results |
+--------------------------------------------------------------------+
| Check: Cells v2 |
| Result: Success |
| Details: None |
+--------------------------------------------------------------------+
| Check: Placement API |
| Result: Success |
| Details: None |
+--------------------------------------------------------------------+
| Check: Cinder API |
| Result: Success |
| Details: None |
+--------------------------------------------------------------------+
| Check: Policy Scope-based Defaults |
| Result: Success |
| Details: None |
+--------------------------------------------------------------------+
| Check: Policy File JSON to YAML Migration |
| Result: Success |
| Details: None |
+--------------------------------------------------------------------+
| Check: Older than N-1 computes |
| Result: Success |
| Details: None |
+--------------------------------------------------------------------+
#출력값(예시)
#Result 부분이 모두 Success여야하며 추가적으로 보이는 오류는 무시하여도 된다.