Stein 오픈스택 클라우드 서버 구축(6) - 컴퓨트 서비스 (Nova) 설치 및 구성

blog post 

 

이번 포스트에서는 오픈스택의 핵심 기능이라고 볼 수 있는 Nova 컴퓨트 서비스를 구축하는 과정에 관하여 다루도록 하겠습니다. Nova 서비스에 대한 기본 내용은 해당 포스트를 참고하시기 바랍니다. [바로가기]

 

 

1. 전체 구성

 

이번 포스트에서 구축할 서비스 구성은 아래와 같습니다.

 

 

앞서 전체 오픈스택 시스템 구성 포스팅에서 컴퓨트 노드를 분리하기로 하였습니다. 이번 포스팅에서 nova-compute 서비스가 Compute0 노드에 구성됩니다. 따라서 이번 포스트에서는 컨트롤러와 컴퓨트 노드를 구분하여 진행하도록 하겠습니다.

 

 

 

컨트롤러 노드 구성
 
 

 

 

컨트롤러 노드에는 인스턴스 사용자의 vm 관련 명령을 해당 컴퓨트 노드에 전달하는 역할을 담당합니다. 이 밖에도 여러 컴퓨트 노드가 멀티 구성인 경우 어떤 노드에서 실행할지 스케쥴링 하거나 서비스 및 vm 정보를 db에 저장하는 등의 역할을 담당합니다. 구체적인 개념은 이전에 다뤘던 컴퓨트 서비스 관련 포스트를 참고하시기 바랍니다.

 

다음 진행을 컨트롤러 노드에서 진행합니다.

 

 

1. Nova 서비스 사용자 및 역할 추가

 

 

앞서 Glance 서비스 포스트에서 진행했던 것과 같이 Nova 서비스도 마찬가지로 도메인, 사용자, 프로젝트, 역할 등을 추가하는 절차를 진행합니다.

 

# 사용자로서 nova를 추가합니다. servicepassword 부분은 본인이 원하는 패스워드로 변경.
[root@Controller ~]# openstack user create --domain default --project service --password servicepassword nova 
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| default_project_id  | 8d3e3541755f454f84dafacd37b4303c |
| domain_id           | default                          |
| enabled             | True                             |
| id                  | c7957aec30f04e199d2073fed5865a55 |
| name                | nova                             |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

# 방금 추가한 사용자 nova에 관리자(admin)역할을 부여합니다.
[root@Controller ~]# openstack role add --project service --user nova admin

# 사용자로서 placement를 추가합니다. servicepassword 부분은 본인이 원하는 패스워드로 변경.
[root@Controller ~]# openstack user create --domain default --project service --password servicepassword placement 
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| default_project_id  | 8d3e3541755f454f84dafacd37b4303c |
| domain_id           | default                          |
| enabled             | True                             |
| id                  | f544d0d1e5e947ea984960f3c5e924b1 |
| name                | placement                        |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

# 방금 추가한 사용자 placement에 관리자(admin)역할을 부여합니다.
[root@Controller ~]# openstack role add --project service --user placement admin

# 사용자 nova를 서비스 엔트리에 저장합니다.
[root@Controller ~]# openstack service create --name nova --description "OpenStack Compute service" compute 
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Compute service        |
| enabled     | True                             |
| id          | 28cd85b6aa444508bce15044f67ac82d |
| name        | nova                             |
| type        | compute                          |
+-------------+----------------------------------+

# 사용자 placement를 서비스 엔트리에 저장합니다.
[root@Controller ~]# openstack service create --name placement --description "OpenStack Compute Placement service" placement 
+-------------+-------------------------------------+
| Field       | Value                               |
+-------------+-------------------------------------+
| description | OpenStack Compute Placement service |
| enabled     | True                                |
| id          | 95a6edcb2a3c47c9884d3bbcef70b268    |
| name        | placement                           |
| type        | placement                           |
+-------------+-------------------------------------+

# keystone의 호스트(즉 컨트롤러 노드의 통신용ip)를 환경변수로 지정합니다.
[root@Controller ~]# export controller=10.0.0.26

# nova 서비스의 endpoint를 추가합니다. (public)
[root@Controller ~]# openstack endpoint create --region RegionOne compute public http://$controller:8774/v2.1/%\(tenant_id\)s 
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | 7261d4c3e361483a93b0e6de22df1bcd         |
| interface    | public                                   |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | 28cd85b6aa444508bce15044f67ac82d         |
| service_name | nova                                     |
| service_type | compute                                  |
| url          | http://10.0.0.26:8774/v2.1/%(tenant_id)s |
+--------------+------------------------------------------+

# nova 서비스의 endpoint를 추가합니다. (internal)
[root@Controller ~]# openstack endpoint create --region RegionOne compute internal http://$controller:8774/v2.1/%\(tenant_id\)s 
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | f50912673dde4ff981a6f8bac37bb83e         |
| interface    | internal                                 |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | 28cd85b6aa444508bce15044f67ac82d         |
| service_name | nova                                     |
| service_type | compute                                  |
| url          | http://10.0.0.26:8774/v2.1/%(tenant_id)s |
+--------------+------------------------------------------+

# nova 서비스의 endpoint를 추가합니다. (admin)
[root@Controller ~]# openstack endpoint create --region RegionOne compute admin http://$controller:8774/v2.1/%\(tenant_id\)s 
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | 2dcc27a8f770414495ce31f5cfe37373         |
| interface    | admin                                    |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | 28cd85b6aa444508bce15044f67ac82d         |
| service_name | nova                                     |
| service_type | compute                                  |
| url          | http://10.0.0.26:8774/v2.1/%(tenant_id)s |
+--------------+------------------------------------------+

# placement 서비스의 endpoint를 추가합니다. (public)
[root@Controller ~]# openstack endpoint create --region RegionOne placement public http://$controller:8778 
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 655438a6febb494ea115e9dc8805fb1c |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 95a6edcb2a3c47c9884d3bbcef70b268 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://10.0.0.26:8778            |
+--------------+----------------------------------+

# placement 서비스의 endpoint를 추가합니다. (internal)
[root@Controller ~]# openstack endpoint create --region RegionOne placement internal http://$controller:8778 
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 10b4ecd023384c829f1ed868be941b1f |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 95a6edcb2a3c47c9884d3bbcef70b268 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://10.0.0.26:8778            |
+--------------+----------------------------------+

# placement 서비스의 endpoint를 추가합니다. (admin)
[root@Controller ~]# openstack endpoint create --region RegionOne placement admin http://$controller:8778 
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | dcb89f92ac8d41dfbd0e1e7e007b7246 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 95a6edcb2a3c47c9884d3bbcef70b268 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://10.0.0.26:8778            |
+--------------+----------------------------------+

 

 

2. DB 생성 및 초기화

 

Nova 관련 DB를 생성합니다.

 

[root@Controller ~]# mysql -u root -p 
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 13
Server version: 10.3.10-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

# 아래 password에 본인이 원하는 패스워드로 대체하여 입력합니다.
MariaDB [(none)]> create database nova; 
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all privileges on nova.* to nova@'localhost' identified by 'password'; 
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> grant all privileges on nova.* to nova@'%' identified by 'password'; 
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> create database nova_api; 
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all privileges on nova_api.* to nova@'localhost' identified by 'password'; 
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> grant all privileges on nova_api.* to nova@'%' identified by 'password';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> create database nova_placement; 
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all privileges on nova_placement.* to nova@'localhost' identified by 'password'; 
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> grant all privileges on nova_placement.* to nova@'%' identified by 'password'; 
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> create database nova_cell0; 
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all privileges on nova_cell0.* to nova@'localhost' identified by 'password'; 
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> grant all privileges on nova_cell0.* to nova@'%' identified by 'password'; 
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges; 
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> exit
Bye

 

 

 

3. Nova 서비스 설치 및 구성

 

다음과 같이 Nova 서비스를 설치하고 구성합니다.

 

//서비스 설치
[root@Controller ~]# yum --enablerepo=centos-openstack-stein,epel -y install openstack-nova

// 필요한 옵션만 설정하기 위해 기본 nova 옵션 파일을 백업하고 새로운 옵션 파일을 만듭니다.
// 참고: 만약 기존 nova 옵션 파일을 그냥 사용하고자 하는 경우에는 아래 mv 작업을 하지 않아도 무관합니다.
[root@Controller ~]# mv /etc/nova/nova.conf /etc/nova/nova.conf.org 

// 만약 옵션 파일을 새로 만들 경우에는 아래 옵션 전체를 입력합니다.
// 기존 옵션 파일을 사용하고자 하는 경우에는 옵션을 직접 찾아서 아래 값으로 바꿔줍니다.
[root@Controller ~]# vi /etc/nova/nova.conf
[DEFAULT]
# 본인의 현재 컨트롤러 노드의 통신용 ip로 입력
my_ip = 10.0.0.26
state_path = /var/lib/nova
enabled_apis = osapi_compute,metadata
log_dir = /var/log/nova

# 자신의 rabbitmq 관련 정보를 입력합니다 (ip, password 변경)
transport_url = rabbit://openstack:password@10.0.0.26

[api]
auth_strategy = keystone

# glance 서비스의 서버 ip로 대체합니다.
[glance]
api_servers = http://10.0.0.26:9292

[oslo_concurrency]
lock_path = $state_path/tmp

# 방금 생성한 nova db 정보입니다. password와 ip에 본인의 구성에 맞게 변경합니다.
[api_database]
connection = mysql+pymysql://nova:password@10.0.0.26/nova_api

[database]
connection = mysql+pymysql://nova:password@10.0.0.26/nova

# Keystone 인증 정보입니다. 
# 아래 ip들을 keystone이 세팅된 현재 컨트롤러 노드의 통신용 포트의 ip로 바꾸고 password 부분을 본인의 패스워드로 변경합니다.
[keystone_authtoken]
www_authenticate_uri = http://10.0.0.26:5000
auth_url = http://10.0.0.26:5000
memcached_servers = 10.0.0.26:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = servicepassword

# nova placement 정보입니다. 
# ip와 password 부분을 본인의 정보로 변경합니다.
[placement]
auth_url = http://10.0.0.26:5000
os_region_name = RegionOne
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = placement
password = servicepassword

# nova placement db정보입니다. 
# ip와 password 부분을 본인의 정보로 변경합니다.
[placement_database]
connection = mysql+pymysql://nova:password@10.0.0.26/nova_placement

[wsgi]
api_paste_config = /etc/nova/api-paste.ini

 

 

4. 방화벽 및 Selinux 설정

 

방화벽이나 Selinux를 사용하는 경우에는 nova 서비스와 포트를 허용해줍니다.

 

[root@Controller ~]# yum --enablerepo=centos-openstack-stein -y install openstack-selinux 
[root@Controller ~]# semanage port -a -t http_port_t -p tcp 8778
[root@Controller ~]# firewall-cmd --add-port={6080/tcp,6081/tcp,6082/tcp,8774/tcp,8775/tcp,8778/tcp} --permanent 
[root@Controller ~]# firewall-cmd --reload 

 

5. DB에 정보 저장 및 서비스 재시작

 

앞서 설정한 정보들을 nova 관련 DB에 저장해 줍니다.

[root@Controller ~]# su -s /bin/bash nova -c "nova-manage api_db sync"
[root@Controller ~]# su -s /bin/bash nova -c "nova-manage cell_v2 map_cell0"
[root@Controller ~]# su -s /bin/bash nova -c "nova-manage db sync"
[root@Controller ~]# su -s /bin/bash nova -c "nova-manage cell_v2 create_cell --name cell1"

 

 저장 후 nova 서비스 및 기타 관련 서비스를 재시작 합니다.

[root@Controller ~]# systemctl restart httpd 
[root@Controller ~]# chown nova. /var/log/nova/nova-placement-api.log
[root@Controller ~]# for service in api consoleauth conductor scheduler novncproxy; do
systemctl start openstack-nova-$service
systemctl enable openstack-nova-$service
done

 

 

 

 

 

 

 

 

 

컴퓨트 노드 설정

 

컴퓨트 노드는 실질적으로 vm을 생성하고 제어하는 역할을 담당합니다. nova 서비스 중 openstack-nova-compute 서비스만 실행합니다. 이 서비스는 컨트롤러 노드로부터 vm 관련 명령을 전달받고 하이퍼바이저를 제어하여 실행 결과를 컨트롤러 노드의 nova 서버에 전달합니다. 하이퍼바이저는 전달 받은 명령을 토대로 vm을 직접 제어합니다.

 

아래 과정을 컴퓨트 노드에서 진행합니다. 만약 자신의 컴퓨트 노드가 여러대인 경우, 아래 작업을 컴퓨트 노드별로 진행합니다.

 

 

1. Stein 레포지토리 활성화 

 

다음과 같이 오픈스택 Stein 레포지토리를 활성화 합니다.

 

[root@Compute0 ~]# yum -y install centos-release-openstack-stein 
[root@Compute0 ~]# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-OpenStack-stein.repo

 

 

2. KVM 하이퍼바이저 구성

 

오픈스택은 KVM 뿐만 아니라 Xen, Docker와 같은 다른 가상화 하이퍼바이저 및 컨테이너를 지원합니다. 하지만 기본적으로 오픈스택은 KVM/QEMU 하이퍼바이저에 최적화 되어 있는 것으로 알려져 있습니다. 따라서 본 구성에서는 KVM/QEMU 기반으로 구성해보겠습니다. 

 

다음과 같이 KVM에 필요한 가상화/네트워크 도구들을 설치합니다.

 

[root@Compute0 ~]# yum -y install qemu-kvm libvirt virt-install bridge-utils

 

정상적으로 KVM 모듈이 로드되었는지 확인후 libvirtd를 시작해 줍니다. 만약 lsmod 명령을 통해 어떠한 결과도 나오지 않으면 정상적으로 KVM 모듈이 로드되지 않은 것입니다. 이 경우 컴퓨트 노드의 BIOS에서 가상화(Virtualization)옵션이 활성화 되어있는지 체크해 보시기 바랍니다. (메인보드가 너무 구형인 경우에는 하드웨어단에서 가상화를 지원하지 않을 수도 있습니다. 이 경우에는 KVM 사용 불가합니다)

 

[root@Compute0 ~]# lsmod | grep kvm 
kvm_intel       138567  0
kvm             441119  1 kvm_intel

[root@Compute0 ~]# systemctl start libvirtd 
[root@Compute0 ~]# systemctl enable libvirtd 

 

다음과 같이 nova 서비스 관련 옵션을 설정해 줍니다. 컨트롤러와 컴퓨트 노드 ip 설정이 혼재되어 있음에 유의하시기 바랍니다.

# 컨트롤러 노드와 마찬가지로 nova 서비스를 통한 컴퓨팅 과정에 필요한 옵션을 새로 만듭니다
# 만약 기존 옵션파일을 새로 만들기를 원하지 않는 경우에는 mv 명령을 진행하지 않고 직접 아래 옵션을 찾아서 설정합니다.
[root@Compute0 ~]# mv /etc/nova/nova.conf /etc/nova/nova.conf.org 
[root@Compute0 ~]# vi /etc/nova/nova.conf

[DEFAULT]
# 컴퓨트 노드의 통신용 ip로 지정해 줍니다.
my_ip = 10.0.0.25
state_path = /var/lib/nova
enabled_apis = osapi_compute,metadata
log_dir = /var/log/nova

# RabbitMQ 연결 정보를 입력해줍니다.
# RabbitMQ 서버는 컨트롤러 노드에 있으므로 컨트롤러 노드에서의 rabbitmq password와 ip로 변경해 줍니다.
transport_url = rabbit://openstack:password@10.0.0.26

[api]
auth_strategy = keystone

# VNC 화면을 활성화 합니다. 추후 오픈스택 대시보드 혹은 vnc 클라이언트 프로그램으로 접속할 때 사용됩니다.
# 이때 만약 외부에서 통신망이 아닌 관리망으로 접속해서 vnc를 봐야 하는 경우, 아래와 같이 컴퓨트노드의 관리용 ip로 지정해 줍니다.
[vnc]
enabled = True
server_listen = 0.0.0.0
server_proxyclient_address = 192.168.0.25
novncproxy_base_url = http://192.168.0.25:6080/vnc_auto.html 

# glance 연결 정보를 입력합니다.
[glance]
api_servers = http://10.0.0.26:9292

[oslo_concurrency]
lock_path = $state_path/tmp

# Keystone 인증 정보를 입력합니다. ip와 password를 컨트롤러 노드의 정보로 바꿔줍니다.
[keystone_authtoken]
www_authenticate_uri = http://10.0.0.26:5000
auth_url = http://10.0.0.26:5000
memcached_servers = 10.0.0.26:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = servicepassword

# nova placement 인증 정보를 입력합니다. ip와 password를 컨트롤러 노드의 정보로 바꿔줍니다.
[placement]
auth_url = http://10.0.0.26:5000
os_region_name = RegionOne
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = placement
password = servicepassword

[wsgi]
api_paste_config = /etc/nova/api-paste.ini

 

 

설정 파일의 권한을 설정해 줍니다. 앞서 설정파일을 mv를 통해 새로 만들지 않고 기존 파일을 이용하는 경우에는 아래 작업을 넘어가셔도 무관합니다.

 

[root@Compute0 ~]# chmod 640 /etc/nova/nova.conf 
[root@Compute0 ~]# chgrp nova /etc/nova/nova.conf 

 

 

3. 방화벽, Selinux 설정 및 서비스 재시작

 

방화벽과 Selinux를 사용하는 경우 다음과 같이 nova 관련 서비스와 포트를 허용해 줍니다. 이후 openstack-nova-compute 서비스를 시작합니다.

 

[root@Compute0 ~]# yum --enablerepo=centos-openstack-stein -y install openstack-selinux
[root@Compute0 ~]# firewall-cmd --add-port=5900-5999/tcp --permanent 
[root@Compute0 ~]# firewall-cmd --reload

# 서비스 시작
[root@Compute0 ~]# systemctl start openstack-nova-compute 
[root@Compute0 ~]# systemctl enable openstack-nova-compute 

 

 

서비스 확인

 

기본적인 구축 절차를 마쳤으므로 이제 서비스가 잘 동작하는지 확인해 보겠습니다. 우선 다음과 같이 컨트롤러 노드에서 관련 서비스가 정상적으로 동작하는지 확인해봅니다. 

 

[root@Controller ~]# openstack compute service list
+----+------------------+------------+----------+---------+-------+----------------------------+
| ID | Binary           | Host       | Zone     | Status  | State | Updated At                 |
+----+------------------+------------+----------+---------+-------+----------------------------+
|  3 | nova-consoleauth | Controller | internal | enabled | up    | 2019-12-25T00:22:48.000000 |
|  4 | nova-conductor   | Controller | internal | enabled | up    | 2019-12-25T00:22:53.000000 |
|  5 | nova-scheduler   | Controller | internal | enabled | up    | 2019-12-25T00:22:48.000000 |
|  6 | nova-compute     | Compute0   | nova     | enabled | up    | 2019-12-25T00:22:46.000000 |
+----+------------------+------------+----------+---------+-------+----------------------------+

 

만약 Status나 State가 disabled 혹은 down으로 나오는 경우 해당 서비스가 정상적으로 구동 되지 않고 있다는 것입니다.  아래 항목을 다시 한번 체크해 보시기 바랍니다.

1. nova 관련 옵션에서 오타 혹은 미설정 체크 (컨트롤러, 컴퓨트 노드 모두)

2. selinux 서비스 및 방화벽 포트 오픈 체크. netstat 확인

3. 특히 nova-compute 서비스의 경우, 컴퓨트 노드의 상태를 체크하지 못해 발생할 수 있음.

   1) 통신용 ip 로 서로 통신 가능한지 확인.

   2) conf 파일에서 rabbitmq 및 keystone 인증 설정 정보 확인

4. 로그 확인(컨트롤러, 컴퓨트 노드 모두): /var/log/nova-* 파일 체크

 

서비스가 정상적으로 동작하고 있다면 다음으로 인스턴스가 정상적으로 생성되는지 체크해야 하지만, 이는 대시보드까지 모두 구축하고 진행하도록 하겠습니다. 

 

이제 컴퓨트 서비스까지 구축을 마쳤습니다. 다음으로는 네트워크 서비스인 neutron 서비스 구축을 진행하도록 하겠습니다.

 

TAGS.

Comments