Stein 오픈스택 클라우드 서버 구축(10) - 블록 스토리지 노드 및 Cinder 서비스 구성

blog post 

 

이번 포스트에서는 앞서 1차 구축을 완료한 컨트롤러/네트워크/컴퓨트 노드에 이어, 블록 스토리지 노드를 추가해 보도록 하겠습니다.

 

블록 스토리지는 가상머신으로 동작 중인 윈도우, 리눅스 시스템 등의 인스턴스에 볼륨을 추가 제공하기 위한 용도로 주로 활용됩니다. 따라서 이 노드의 경우, 스토리지 노드 자체의 가용 공간도 넉넉해야하며, (컴퓨트 노드와 스토리지 노드가 분리되어 있는 경우) 데이터가 iscsi와 같은 네트워크 프로토콜을 사용하여 전달되므로 네트워크 퍼포먼스도 중요한 요소가 됩니다.

 

오픈스택의 블록 스토리지는 LVM, NFS, GlusterFS(GFS) 등의 드라이브를 백엔드로 배치할 수도 있고, CEPH으로 다중 클러스터 백엔드를 구축할 수도 있습니다. 본 포스트에서는 백엔드 구성에 앞서, 오픈스택에서 볼륨 서비스를 제공하기 위한 기본 작업을 진행해 보도록 하겠습니다.

 

* 참고: GlusterFS는 오픈스택 Ocata 버전부터 Cinder 서비스의 지원이 종료된 것으로 보입니다.

 

 

 

전체 구성

 

 

앞서 말씀드린 것과 같이, 지금까지 구축해온 컨트롤러/컴퓨트0/네트워크 노드에 블록 스토리지를 추가하고, ip는 28번을 부여해 보겠습니다. 블록 스토리지 노드에는 오픈스택 cinder-volume 서비스가 동작하며, 컨트롤러 노드에서는 볼륨 할당을 위한 스케쥴러, api 통신을 위한 api 서비스가 동작하도록 구성됩니다.

 

 

 

 

 

컨트롤러 노드 구성 

 

 

컨트롤러 노드에서의 cinder 서비스는 역시 볼륨을 생성할 서버에 대하여 스케쥴링 하거나, 다른 API와 통신하는 기능에 집중합니다. 이러한 시스템을 구축하기 위해 컨트롤러 노드에서 아래와 같은 과정을 진행합니다.

 

 

1. 시스템 설정

 

 

블록 스토리지 노드는 기존 설계에 없던 노드였습니다. 따라서 새로운 물리 장비(혹은 VM으로 구성해도 되지만, 실무에서는 추천하지 않습니다)에서 아래 포스트의 2,3,4번 과정을 진행합니다. (ip 정보는 위의 노드 구성 참고)

 

Stein 오픈스택 클라우드 서버 구축(2) - 시스템 구성 (update 2020.01.28)

 

 

각 노드의 호스트 정보에 아래와 같이 스토리지 노드를 추가해 주고 NTP도 동기화 해줍니다.

 

# 다른 노드에도 추가해 줍니다.
[root@Controller ~]# vim /etc/hosts
10.0.0.26 Controller
10.0.0.27 Network
10.0.0.28 Storage

 

 

 

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

 

 

앞서 진행한 neutron, nova, glance 서비스와 마찬가지로, 'cinder' 역시 다음과 같이 오픈스택 시스템에 사용자로 추가해 줍니다.

 

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

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

# 사용자 cinderv3를 서비스 엔트리에 저장합니다.
[root@Controller ~]# openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3 
[root@Controller ~]# openstack service show cinderv3                                                                                                         
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Block Storage          |
| enabled     | True                             |
| id          | 5f075053ccc04473a436ad37ac5817e8 |
| name        | cinderv3                         |
| type        | volumev3                         |
+-------------+----------------------------------+

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

# cinderv3 서비스의 endpoint를 추가합니다. (public)
[root@Controller ~]# openstack endpoint create --region RegionOne volumev3 public http://$controller:8776/v3/%\(tenant_id\)s 
+--------------+----------------------------------------+
| Field        | Value                                  |
+--------------+----------------------------------------+
| enabled      | True                                   |
| id           | 5b93111a4e524fba88bbb30fce38514b       |
| interface    | public                                 |
| region       | RegionOne                              |
| region_id    | RegionOne                              |
| service_id   | 5f075053ccc04473a436ad37ac5817e8       |
| service_name | cinderv3                               |
| service_type | volumev3                               |
| url          | http://10.0.0.26:8776/v3/%(tenant_id)s |
+--------------+----------------------------------------+

# cinderv3 서비스의 endpoint를 추가합니다. (internal)
[root@Controller ~]# openstack endpoint create --region RegionOne volumev3 internal http://$controller:8776/v3/%\(tenant_id\)s 
+--------------+----------------------------------------+
| Field        | Value                                  |
+--------------+----------------------------------------+
| enabled      | True                                   |
| id           | ad66be07d2514582a4b9569a681f5689       |
| interface    | internal                               |
| region       | RegionOne                              |
| region_id    | RegionOne                              |
| service_id   | 5f075053ccc04473a436ad37ac5817e8       |
| service_name | cinderv3                               |
| service_type | volumev3                               |
| url          | http://10.0.0.26:8776/v3/%(tenant_id)s |
+--------------+----------------------------------------+

# cinderv3 서비스의 endpoint를 추가합니다. (admin)
[root@Controller ~]# openstack endpoint create --region RegionOne volumev3 admin http://$controller:8776/v3/%\(tenant_id\)s 
+--------------+----------------------------------------+
| Field        | Value                                  |
+--------------+----------------------------------------+
| enabled      | True                                   |
| id           | 98086019166c4ca1be6484b8fb29bbc7       |
| interface    | admin                                  |
| region       | RegionOne                              |
| region_id    | RegionOne                              |
| service_id   | 5f075053ccc04473a436ad37ac5817e8       |
| service_name | cinderv3                               |
| service_type | volumev3                               |
| url          | http://10.0.0.26:8776/v3/%(tenant_id)s |
+--------------+----------------------------------------+

 

 

2. DB 생성 및 초기화

 

 

아래와 같이 cinder DB를 생성하고 권한을 부여해 줍니다.

 

[root@Controller ~]# mysql -u root -p 
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 73
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 cinder; 
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all privileges on cinder.* to cinder@'localhost' identified by 'password'; 
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> grant all privileges on cinder.* to cinder@'%' 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. Cinder 서비스 설치 및 옵션 설정

 

 

다음으로 cinder 서비스를 설치합니다.

 

# install from Stein, EPEL
[root@Controller ~]# yum --enablerepo=centos-openstack-stein,epel -y install openstack-cinder

 

cinder 옵션을 구성합니다. 기본 cinder.conf 옵션을 사용할 경우, mv 명령을 진행하지 않아도 무관하며, 필요한 옵션만 진행하길 선호하실 경우, 기존 파일을 백업하고 새로 옵션을 설정합니다.

 

[root@Controller ~]# mv /etc/cinder/cinder.conf /etc/cinder/cinder.conf.org 
[root@Controller ~]# vi /etc/cinder/cinder.conf

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

[DEFAULT]
my_ip = 10.0.0.26
log_dir = /var/log/cinder
state_path = /var/lib/cinder
auth_strategy = keystone

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

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

# 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 = cinder
password = servicepassword

[oslo_concurrency]
lock_path = $state_path/tmp

 

 

만약 위에서 새로 cinder.conf 옵션 파일을 생성했다면, 아래와 같이 해당 파일의 권한을 변경해 줍니다.

 

[root@Controller ~]# chmod 640 /etc/cinder/cinder.conf 
[root@Controller ~]# chgrp cinder /etc/cinder/cinder.conf 

 

우리가 생성한 DB에 설정한 정보를 저장해 줍니다.

 

[root@Controller ~]# su -s /bin/bash cinder -c "cinder-manage db sync" 

 

 

4. 서비스 시작

 

 

cinder-api와 cinder-scheduler 서비스를 시작해 줍니다.

 

[root@Controller ~]# systemctl start openstack-cinder-api openstack-cinder-scheduler 
[root@Controller ~]# systemctl enable openstack-cinder-api openstack-cinder-scheduler 

 

볼륨 API 버전을 3으로 지정해줍니다.

 

[root@Controller ~]# echo "export OS_VOLUME_API_VERSION=3" >> admin
[root@Controller ~]# . admin

 

방화벽을 사용중이라면 8776 포트를 허용해줍니다.

 

[root@Controller ~]# firewall-cmd --add-port=8776/tcp --permanent 
success
[root@Controller ~]# firewall-cmd --reload 
success

 

 

 

 

스토리지 노드 구성

 

 

스토리지 노드에서는 주로 컨트롤러 노드와 통신하고, 컨트롤러 노드로 부터 전달 받은 volume 생성/삭제 등의 명령을 수행하는 역할을 합니다. 전달 받은 명령은 지정된 백엔드 드라이버를 통해 수행하게 됩니다. 백엔드 구축에 앞서, 볼륨 서비스 제공을 위한 기초 작업을 진행합니다. 아래 과정을 스토리지 노드에서 진행합니다.

  

 

 
 
1. Cinder 서비스 설치 및 옵션 설정

 

 

스토리지 노드에서는 아래와 같은 패키지를 설치해 줍니다.

 

[root@Storage ~]# yum --enablerepo=centos-openstack-stein,epel -y install openstack-cinder python2-crypto targetcli

 

스토리지 노드 역시 cinder.conf 파일에서 아래와 같이 옵션을 설정해줍니다. 물론 본인 선호에 따라 기존 옵션 파일을 사용하거나 새로 만들어서 옵션을 설정합니다.

 

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

[root@Storage ~]# mv /etc/cinder/cinder.conf /etc/cinder/cinder.conf.org 
[root@Storage ~]# vi /etc/cinder/cinder.conf

// 만약 옵션 파일을 새로 만들 경우에는 아래 옵션 전체를 입력합니다.
// 기존 옵션 파일을 사용하고자 하는 경우에는 옵션을 직접 찾아서 아래 값으로 바꿔줍니다.
[DEFAULT]
# 본인의 현재 컨트롤러 노드의 통신용 ip로 입력
my_ip = 10.0.0.28
log_dir = /var/log/cinder
state_path = /var/lib/cinder
auth_strategy = keystone

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

# Glance 서비스 연결 정보를 입력합니다.
glance_api_servers = http://10.0.0.26:9292
enable_v3_api = True

# cinder db 정보입니다. password와 ip에 본인의 구성에 맞게 변경합니다.
[database]
connection = mysql+pymysql://cinder:password@10.0.0.26/cinder

# 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 = cinder
password = servicepassword

[oslo_concurrency]
lock_path = $state_path/tmp

 

 

위에서 옵션 파일을 새로 생성한 경우, 권한을 변경해 줍니다.

 

[root@Storage ~]# chmod 640 /etc/cinder/cinder.conf 
[root@Storage ~]# chgrp cinder /etc/cinder/cinder.conf

 

스토리지 서비스에서는 volume 서비스만 시작해줍니다.

 

[root@Storage ~]# systemctl start openstack-cinder-volume 
[root@Storage ~]# systemctl enable openstack-cinder-volume

 

 

확인

 

 

컨트롤러 노드에서 cinder 서비스가 정상적으로 동작하는지 확인해 봅니다. 특히 Status와 State가 각각 enabled, up 되었는지 확인해 봅니다. (cinder-volume은 신경쓰지 않아도 됩니다. 백엔드 드라이브를 구성하지 않았으므로)

 

[root@Controller ~]# openstack volume service list
+------------------+-------------+------+---------+-------+----------------------------+
| Binary           | Host        | Zone | Status  | State | Updated At                 |
+------------------+-------------+------+---------+-------+----------------------------+
| cinder-scheduler | Controller  | nova | enabled | up    | 2020-04-12T04:29:24.000000 |
| cinder-volume    | Storage@lvm | nova | enabled | up    | 2020-04-12T04:29:28.000000 |
+------------------+-------------+------+---------+-------+----------------------------+

 

TAGS.

Comments