OpenStack Class2014.12.10 19:52

안녕하세요~!!


지난시간까지 우리는 컨트롤러 노드에 설치될 가장 기본적인 서비스들을 살펴보았습니다. 오늘은 부가 서비스인 스토리지 서비스들을 설치해 보도록하겠습니다. 오픈스택에는 두 종류의 스토리지가 있는데, 하나는 인스턴스와 연결하여 사용되는 블록스토리지인 Cinder이며 다른 하나는 개개인의 저장공간에 파일을 직접 업로드 또는 다운로드 할 수 있는 오브젝트 스토리지인 Swift가 있습니다. 





오늘은 컨트롤러 노드에 설치되는 Cinder 서버와 Swift Proxy 서버를 설치해 보도록 하겠습니다.


Cinder 서버 설치

Cinder는 인스턴스가 가상 디스크를 사용할 수 있도록 관리하는 서비스입니다. 클라우드 시스템에서는 인스턴스의 가상 디스크를 다른 말로 블록 스토리지라고 부릅니다. 그래서 Cinder를 블록 스토리지 서비스라고 합니다. 블록 스토리지는 디스크 여러 개를 묶어 하나의 볼륨으로 사용하는 LVM 방식과 Ceph와 같은 외부 스토리지 및 벤더 사에서 제공하는 스토리지를 연결해서 사용하는 방법이 있습니다. 오픈스택의 기본 블록 스토리지는 LVM을 이용한 방법입니다.

 

1.     먼저 cinder-apicinder-scheduler를 설치합니다.

$ sudo apt-get install cinder-api cinder-scheduler

 

2.     설치가 완료되면 /etc/cinder/cinder.conf의 데이터베이스 정보를 다음과 같이 수정합니다.

$ sudo vi /etc/cinder/cinder.conf [database] ... connection = mysql://cinder:cinderdbpass@10.10.15.11/cinder

 

3.     이번에도 역시 mysql에 접속해서 cinder 데이터베이스와 계정을 생성하고 접속 권한을 설정합니다.

$ mysql -u root -p
mysql> CREATE DATABASE cinder;
Query OK, 1 row affected (0.00 sec)
 
mysql> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' \
IDENTIFIED BY 'cinderdbpass';
Query OK, 0 rows affected (0.00 sec)
 
mysql> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' \
IDENTIFIED BY 'cinderdbpass';
Query OK, 0 rows affected (0.00 sec)
 
mysql> exit
Bye

 

4.     데이터베이스가 생성되면 다음과 같은 명령으로 cinder 테이블을 생성합니다.

$ sudo su -s /bin/sh -c "cinder-manage db sync" cinder
2014-05-28 00:57:40.511 12593 INFO migrate.versioning.api [-] 0 -> 1... 
2014-05-28 00:57:40.826 12593 INFO migrate.versioning.api [-] done
2014-05-28 00:57:40.827 12593 INFO migrate.versioning.api [-] 1 -> 2... 
2014-05-28 00:57:40.928 12593 INFO migrate.versioning.api [-] done
2014-05-28 00:57:40.928 12593 INFO migrate.versioning.api [-] 2 -> 3... 
2014-05-28 00:57:40.951 12593 INFO migrate.versioning.api [-] done
2014-05-28 00:57:40.951 12593 INFO migrate.versioning.api [-] 3 -> 4... 
2014-05-28 00:57:41.045 12593 INFO 004_volume_type_to_uuid [-] 
Created foreign key volume_type_extra_specs_ibfk_1
2014-05-28 00:57:41.055 12593 INFO migrate.versioning.api [-] done
….
2014-05-28 00:57:41.660 12593 INFO migrate.versioning.api [-] 20 -> 21... 
2014-05-28 00:57:41.694 12593 INFO 021_add_default_quota_class [-] 
Added default quota class data into the DB.
2014-05-28 00:57:41.705 12593 INFO migrate.versioning.api [-] done
2014-05-28 00:57:41.705 12593 INFO migrate.versioning.api [-] 21 -> 22... 
2014-05-28 00:57:41.737 12593 INFO migrate.versioning.api [-] done

 

5.     keystonecinder 계정을 생성하기 위해서 admin 계정을 export합니다

$ source admin-openrc.sh

 

6.     Keystonecinder 사용자를 생성합니다. 이름(name)은 반드시 cinder여야 합니다. 패스워드(pass)는 사용하고자 하는 패스워드를 입력합니다. 여기서는 식별을 쉽게 하려고 cinderpass로 설정했습니다. 그리고 이메일은 실제 서비스에서 문제가 발생했을 경우 피드백 받을 수 있는 메일 주소로 입력합니다.

$ keystone user-create --name=cinder --pass=cinderpass --email=cinder@email.com

+----------+----------------------------------+
| Property |              Value               |
+----------+----------------------------------+
|  email   |         cinder@email.com         |
| enabled  |               True               |
|    id    | 60eaa278e2f549309065e2cf125c0389 |
|   name   |              cinder              |
| username |              cinder              |
+----------+----------------------------------+

  

7.     생성한 cinder 계정은 서비스 테넌트에 admin 롤을 추가합니다.

$ keystone user-role-add --user=cinder --tenant=service --role=admin

 

8.     생성된 keystone 정보는 RabbitMQ 정보와 함께 cinder.conf에 적용합니다.

$ sudo vi /etc/cinder/cinder.conf
[DEFAULT]
rpc_backend = cinder.openstack.common.rpc.impl_kombu
rabbit_host = 10.10.15.11
rabbit_port = 5672
rabbit_userid = guest
rabbit_password = rabbitpass
…
[keystone_authtoken]
auth_uri = http://10.10.15.11:5000
auth_host = 10.10.15.11
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = cinder
admin_password = cinderpass


9.     이번에는 keystonecinder 서비스를 다음과 같이 생성합니다.

$ keystone service-create --name=cinder --type=volume --description="OpenStack Block Storage"
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |     OpenStack Block Storage      |
|   enabled   |               True               |
|      id     | beba666e021b46a89c801173e8a6f246 |
|     name    |              cinder              |
|     type    |              volume              |
+-------------+----------------------------------+

 

10.  생성된 서비스는 외부에서 접속 가능한 Public URL, 내부에서 접속하기 위한 Internal URL, 관리자가 접속하기 위한 Admin URLID에 등록합니다.

$ keystone endpoint-create \
  --service-id=beba666e021b46a89c801173e8a6f246 \
  --publicurl=http://10.10.15.11:8776/v1/%\(tenant_id\)s \
  --internalurl=http://10.10.15.11:8776/v1/%\(tenant_id\)s \
--adminurl=http://10.10.15.11:8776/v1/%\(tenant_id\)s
+-------------+------------------------------------------+
|   Property  |                  Value                   |
+-------------+------------------------------------------+
|   adminurl  | http://10.10.15.11:8776/v1/%(tenant_id)s |
|      id     |     4aaa52cef23045f6a98df6b4d83f8f18     |
| internalurl | http://10.10.15.11:8776/v1/%(tenant_id)s |
|  publicurl  | http://10.10.15.11:8776/v1/%(tenant_id)s |
|    region   |                regionOne                 |
|  service_id |     beba666e021b46a89c801173e8a6f246     |
+-------------+------------------------------------------+

 

11.  Cinder는 다른 서비스와는 다르게 Version2을 위한 서비스를 하나 더 생성합니다.

$ keystone service-create --name=cinderv2 --type=volumev2 --description="OpenStack Block Storage v2"
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |    OpenStack Block Storage v2    |
|   enabled   |               True               |
|      id     | 683afdc793cd4f5bbb7c315e7a6d1a02 |
|     name    |             cinderv2             |
|     type    |             volumev2             |
+-------------+----------------------------------+

 

12.  생성한 v2 서비스에 다시 Public URL, Internal URL, Admin URL을 설정합니다.

$ keystone endpoint-create \
  --service-id=683afdc793cd4f5bbb7c315e7a6d1a02 \
  --publicurl=http://10.10.15.11:8776/v2/%\(tenant_id\)s \
  --internalurl=http://10.10.15.11:8776/v2/%\(tenant_id\)s \
--adminurl=http://10.10.15.11:8776/v2/%\(tenant_id\)s
+-------------+------------------------------------------+
|   Property  |                  Value                   |
+-------------+------------------------------------------+
|   adminurl  | http://10.10.15.11:8776/v2/%(tenant_id)s |
|      id     |     d916a6377ddc4583a6603ef482924deb     |
| internalurl | http://10.10.15.11:8776/v2/%(tenant_id)s |
|  publicurl  | http://10.10.15.11:8776/v2/%(tenant_id)s |
|    region   |                regionOne                 |
|  service_id |     683afdc793cd4f5bbb7c315e7a6d1a02     |
+-------------+------------------------------------------+

 

13.  마지막으로 cinder-schedulercinder-api를 재시작합니다.

$ sudo service cinder-scheduler restart
$ sudo service cinder-api restart

 

Swift Proxy 서버 설치

Swift는 오브젝트 스토리지 서비스로 파일, 문서와 같은 데이터를 저장 및 삭제하고 관리합니다. 프록시 서버는 사용자 계정과 컨테이너 등 메타 데이터를 관리하며, 데이터는 분산된 스토리지 노드 여러 대에 저장됩니다. 그럼 지금부터 Swift Proxy 서버를 설치하겠습니다.

 

1.     Swift Proxy 서버를 설치하고 전에 Keystoneswift 사용자 계정을 생성합니다.

$ source admin-openrc.sh
$ keystone user-create --name=swift --pass=swiftpass --email=swift@email.com
+----------+----------------------------------+
| Property |              Value               |
+----------+----------------------------------+
|  email   |         swift@email.com          |
| enabled  |               True               |
|    id    | 7acccaa638224f05beb74950f8d12da9 |
|   name   |              swift               |
| username |              swift               |
+----------+----------------------------------+

 

2.     생성한 사용자 계정은 서비스 테넌트에 추가하고 admin 롤을 할당합니다.

$ keystone user-role-add --user=swift --tenant=service --role=admin

 

3.     그 다음에는 Swift 서비스를 다음과 같이 생성합니다.

$ keystone service-create --name=swift --type=object-store \
--description="OpenStack Object Storage"
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |     OpenStack Object Storage     |
|   enabled   |               True               |
|      id     | 2e69a88e0b7445919bf04bd277afa317 |
|     name    |              swift               |
|     type    |           object-store           |
+-------------+----------------------------------+

 

4.     생성한 서비스 ID Public URL, Internal URL, Admin URL을 다음과 같이 설정합니다.

$ keystone endpoint-create \
  --service-id=2e69a88e0b7445919bf04bd277afa317 \
  --publicurl='http://10.10.15.11:8080/v1/AUTH_%(tenant_id)s' \
  --internalurl='http://10.10.15.11:8080/v1/AUTH_%(tenant_id)s' \
  --adminurl=http://10.10.15.11:8080
+-------------+-----------------------------------------------+
|   Property  |                     Value                     |
+-------------+-----------------------------------------------+
|   adminurl  |            http://10.10.15.11:8080            |
|      id     |        1d24ab0b9340418ba8059130e4b103ee       |
| internalurl | http://10.10.15.11:8080/v1/AUTH_%(tenant_id)s |
|  publicurl  | http://10.10.15.11:8080/v1/AUTH_%(tenant_id)s |
|    region   |                   regionOne                   |
|  service_id |        2e69a88e0b7445919bf04bd277afa317       |
+-------------+-----------------------------------------------+

 

5.     Keystone 설정이 완료되면 /etc 밑에 swift 디렉터리를 생성합니다.

$ sudo mkdir -p /etc/swift

 

6.     생성한 swift 디렉터리에 swift.conf 파일을 vi 에디터로 열어 다음과 같이 swift-hash를 입력합니다. Swift Hash 값은 랜덤한 값으로 설정하는 것이 좋습니다.

$ sudo vi /etc/swift/swift.conf
[swift-hash]
# random unique string that can never change (DO NOT LOSE)
swift_hash_path_suffix = fLIbertYgibbitZ


7.     이제 swift 서비스를 다음과 같이 설치하겠습니다.

$ sudo apt-get install swift swift-proxy memcached python-keystoneclient python-swiftclient \n python-webob

*** "오픈스택을 다루는 기술"의 swift 프록시 서버 설치 부분에서 오류가 있었습니다. swift를 설치하지 않고 기타 나머지 서비스들만 설치를 했었습니다. 설치를 하고 글을 쓰는 과정에서 실수가 있었던 것 같습니다. 넓은 마음으로 이해주시면 감사하겠습니다. 위와 같이 swift를 포함하여 설치하시기 바랍니다. 


8.     Swift 서비스가 설치되면 memcached.conf 파일의 로컬 IP를 컨트롤러 IP로 변경합니다.

$ sudo vi /etc/memcached.conf -l 127.0.0.1

     to

$ sudo vi /etc/memcached.conf
-l 10.10.15.11

  


9.     환경설정 파일에서 IP를 수정한 뒤 Memcached를 재시작합니다.

$ sudo service memcached restart

 

10.  이번에는 Proxy-server.conf 파일을 생성하겠습니다. Proxy-swift.conf 파일은 /etc/swift 디렉터리에 생성하고 다음과 같은 내용을 입력합니다. 설정한 proxy-server.conf 내용은 인증으로 Keystone을 사용하고 캐쉬는 memcached를 사용하겠다는 뜻입니다.

$ sudo vi /etc/swift/proxy-server.conf
[DEFAULT]
bind_port = 8080
user = swift
 
[pipeline:main]
pipeline = healthcheck cache authtoken keystoneauth proxy-server
 
[app:proxy-server]
use = egg:swift#proxy
allow_account_management = true
account_autocreate = true
 
[filter:keystoneauth]
use = egg:swift#keystoneauth
operator_roles = member,admin,swiftoperator
 
[filter:authtoken]
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
 
# Delaying the auth decision is required to support token-less
# usage for anonymous referrers ('.r:*').
delay_auth_decision = true
 
# cache directory for signing certificate
# signing_dir = /home/swift/keystone-signing
 
# auth_* settings refer to the Keystone server
auth_protocol = http
auth_host = 10.10.15.11
auth_port = 35357
 
# the service tenant and swift username and password created in Keystone
admin_tenant_name = service
admin_user = swift
admin_password = swiftpass
 
[filter:cache]
use = egg:swift#memcache
 
[filter:catch_errors]
use = egg:swift#catch_errors
 
[filter:healthcheck]
use = egg:swift#healthcheck

 

11.  Proxy-server.conf 파일을 설정하면 ring-builder를 이용해서 account, container, object builder를 생성합니다. 이때 생성한 ring builder 파일은 스토리지 노드의 데이터 동기화를 시키는 중요한 역할을 합니다. 그러나 이 부분부터는 스토리지 노드 설정을 완료한 후에 컨트롤러 노드에서 작업하는 것이 더 좋습니다.

$ cd /etc/swift
$ sudo swift-ring-builder account.builder create 18 3 1
$ sudo swift-ring-builder container.builder create 18 3 1
$ sudo swift-ring-builder object.builder create 18 3 1


12.  각각의 생성한 링 빌더에 스토리지 노드를 다음과 같이 추가합니다.

$ sudo swift-ring-builder account.builder add r1z1-10.10.15.31:6002/sdb1 100
$ sudo swift-ring-builder container.builder add r1z1-10.10.15.31:6001/sdb1 100
$ sudo swift-ring-builder object.builder add r1z1-10.10.15.31:6000/sdb1 100

 

13.  링 빌더에 스토리지 노드가 잘 추가되었는지 확인합니다.

$ sudo swift-ring-builder account.builder
$ sudo swift-ring-builder container.builder
$ sudo swift-ring-builder object.builder

 

14.  이번에는 링 빌더를 리밸런싱합니다.

$ sudo swift-ring-builder account.builder rebalance
$ sudo swift-ring-builder container.builder rebalance
$ sudo swift-ring-builder object.builder rebalance


15.  환경설정이 완료되고 나면 /etc/swift 디렉터리를 swift가 사용할 수 있도록 권한을 설정합니다.

$ sudo chown -R swift:swift /etc/swift

 

16.  마지막으로 swift-proxy 서비스를 재시작합니다.

$ sudo service swift-proxy restart



이렇게해서 컨트롤러 노드에 cinder와 swift를 모두 설치해 보았습니다. 

다음시간에는 Heat와 Ceilometer를 설치해보도록 하겠습니다. 그럼, 다음 시간에 다시 만나요~!!

Posted by 나리 짱!!! naleejang