OpenStack Class2015.02.27 23:21

안녕하세요~!! 

왜 이리도 바쁜지 블로그에 글을 올릴 시간이 없네요~!! 좋은 것이겠죠~!! ^^ 오늘은 안되겠다 생각이 들어서 이렇게 밤 늦게라도 시간을 내어서 글을 올려볼까 합니다. 

오늘은 지난시간에 이어 Keystone 설치에 관련된 글을 올려볼까 합니다. yum install로 설치를 하고 vi가 아님 openstack-config를 이용하여 환경설정을 한다는 부분이 ubuntu의 apt-get install과 다른 부분입니다. 그외에 환경설정 내용이나 사용법은 같다고 보시면 됩니다.

Keystone 설치

메시지 서비스를 설치했다면 이번에는 Keystone을 설치할 차례입니다. Keystone은 오픈스택 서비스의 인증을 담당하는 서비스로써 테넌트, 사용자, , 서비스와 endpoint를 관리합니다.

 

1.     yum install을 이용해서 openstack-keystone python-keystoneclient를 설치합니다.

# yum install openstack-keystone python-keystoneclient

 

2.     레드햇이나 CentOS는 우분투와 다르게 환경설정을 해주는 openstack-config라는 명령어를 지원합니다. Openstack-config 명령을 이용해서 다음과 같이 데이터베이스 정보를 변경합니다.

# openstack-config --set /etc/keystone/keystone.conf \
   database connection mysql://keystone:keystonedbpass@10.10.15.11/keystone


3.     이번에는 mysql에 접속해서 keystone 데이터베이스와 사용자 계정 및 패스워드 그리고 접속권한을 함께 생성합니다.

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

 

4.     Keystone 계정 생성이 완료되면 keystone에서 필요한 테이블을 만들어야 합니다. 테이블 생성은 keystone-manage db_sync 명령을 이용합니다.

# su -s /bin/sh -c "keystone-manage db_sync" keystone

 

5.     keystoneadmin token을 설정하기 위해 openssl rand 명령어를 이용해서 생성된 임의의 문자열을 ADMIN_TOKEN에 저장합니다. 그리고 ADMIN_TOKEN에 저장된 문자열은 openstack_config 명령어로 /etc/keystone/keystone.conf 파일의 admin_token에 설정합니다.

# ADMIN_TOKEN=$(openssl rand -hex 10) # echo $ADMIN_TOKEN dc387ae9520f5b69f643 # openstack-config --set /etc/keystone/keystone.conf DEFAULT admin_token $ADMIN_TOKEN

 

6.     Keystone은 기본적으로 PKI 토큰을 사용합니다. 그러므로 keystone-manage를 이용해서 PKI Key와 인증서를 생성하고, 생성된 /etc/keystone/ssl은 아무나 접근할 수 없도록 액세스를 제한합니다.

# keystone-manage pki_setup --keystone-user keystone --keystone-group keystone
Generating RSA private key, 2048 bit long modulus
......................................................................................................+++
.............................................................+++
e is 65537 (0x10001)
Generating RSA private key, 2048 bit long modulus
................+++
.............+++
e is 65537 (0x10001)
Using configuration from /etc/keystone/ssl/certs/openssl.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'US'
stateOrProvinceName   :ASN.1 12:'Unset'
localityName          :ASN.1 12:'Unset'
organizationName      :ASN.1 12:'Unset'
commonName            :ASN.1 12:'www.example.com'
Certificate is to be certified until Jun 12 17:10:09 2024 GMT (3650 days)
 
Write out database with 1 new entries
Data Base Updated
# chown -R keystone:keystone /etc/keystone/ssl
# chmod -R o-rwx /etc/keystone/ssl

 

7.     SSL PKI Key 설정이 완료되면 keystone 서비스를 재시작하고, 부팅 시 서비스가 자동 실행될 수 있도록 설정합니다.

# service openstack-keystone start
Starting keystone:                                         [  OK  ]
# chkconfig openstack-keystone on

 

 keystone 사용자, 테넌트, 롤 그리고 endpoint 생성

keystone 설치가 완료되면 keystone를 접근하기 위한 사용자, 테넌트, 롤과 서비스, endpoint를 생성해야 합니다.

 

1.     우선 OS_SERVICE_TOKENOS_SERVICE_ENDPOINTexport합니다.

# export OS_SERVICE_TOKEN=$ADMIN_TOKEN
# export OS_SERVICE_ENDPOINT=http://10.10.15.11:35357/v2.0

 

2.     keystone user-create 명령어를 이용해서 다음과 같이 admin 사용자 계정, 패스워드, 이메일을 입력하고 admin 계정을 생성합니다.

# keystone user-create --name=admin --pass=adminpass --email=admin@email.com
+----------+----------------------------------+
| Property |              Value               |
+----------+----------------------------------+
|  email   |         admin@email.com          |
| enabled  |               True               |
|    id    | 7bc1bda9d2444b9c92554ff9e0b71e22 |
|   name   |              admin               |
| username |              admin               |
+----------+----------------------------------+

 

3.     admin 롤을 생성합니다.

# keystone role-create --name=admin
+----------+----------------------------------+
| Property |              Value               |
+----------+----------------------------------+
|    id    | 02ff77d31ec841b3914db4c3daca4f1c |
|   name   |              admin               |
+----------+----------------------------------+

 

4.     이번에는 admin 테넌트를 생성합니다.

# keystone tenant-create --name=admin --description="Admin Tenant"
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |           Admin Tenant           |
|   enabled   |               True               |
|      id     | dbd8df87e5c34536844d915b555061b6 |
|     name    |              admin               |
+-------------+----------------------------------+

 

5.     Admin 테넌트와 member 테넌트에 admin 사용자 계정과 롤을 추가합니다.

# keystone user-role-add --user=admin --tenant=admin --role=admin # keystone user-role-add --user=admin --tenant=admin --role=_member_

 

6.     이번에는 demo 계정을 다음과 같이 생성합니다.

# keystone user-create --name=demo --pass=demopass --email=demo@email.com
+----------+----------------------------------+
| Property |              Value               |
+----------+----------------------------------+
|  email   |          demo@email.com          |
| enabled  |               True               |
|    id    | 129a943bc94b43379a794ae011a87fe9 |
|   name   |               demo               |
| username |               demo               |
+----------+----------------------------------+

 

7.     Demo 테넌트도 생성합니다.

# keystone tenant-create --name=demo --description="Demo Tenant"
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |           Demo Tenant            |
|   enabled   |               True               |
|      id     | afa084dced1e4d70b479dac82ea659ac |
|     name    |               demo               |
+-------------+----------------------------------+

 

8.     생성한 Demo 계정을 Demo 테넌트에 추가하고 롤은 member를 설정합니다.

# keystone user-role-add --user=demo --role=_member_ --tenant=demo

 

9.     이번에는 오픈스택 서비스를 위한 서비스 테넌트를 다음과 같이 생성합니다.

# keystone tenant-create --name=service --description="Service Tenant"
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |          Service Tenant          |
|   enabled   |               True               |
|      id     | 31303ac56ece4fbc85bb16074adfc9cb |
|     name    |             service              |
+-------------+----------------------------------+

 

10.  서비스 테넌트가 생성되면 이번에는 keystone 서비스를 다음과 같이 생성합니다.

# keystone service-create --name=keystone --type=identity \
  --description="OpenStack Identity"
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |        OpenStack Identity        |
|   enabled   |               True               |
|      id     | 4fdf89fb665d44f7bf0dd053e8dfadef |
|     name    |             keystone             |
|     type    |             identity             |
+-------------+----------------------------------+

 

11.  생성된 Keystone 서비스는 사용자나 다른 서비스가 접속할 수 있도록 Rest API 주소를 생성합니다. 필요한 파라메터는 생성한 서비스의 ID, 외부 접속 Public URL, 내부 접속 Internal URL, 관리자가 접속할 Admin URL로 이루어집니다.

# keystone endpoint-create \
  --service-id=4fdf89fb665d44f7bf0dd053e8dfadef \
  --publicurl=http://10.10.15.11:5000/v2.0 \
  --internalurl=http://10.10.15.11:5000/v2.0 \
  --adminurl=http://10.10.15.11:35357/v2.0
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
|   adminurl  |  http://10.10.15.11:35357/v2.0   |
|      id     | 27fd1214abd24430b18045b835885f6b |
| internalurl |   http://10.10.15.11:5000/v2.0   |
|  publicurl  |   http://10.10.15.11:5000/v2.0   |
|    region   |            regionOne             |
|  service_id | 4fdf89fb665d44f7bf0dd053e8dfadef |
+-------------+----------------------------------+

 

12.  endpoint URL 생성이 완료되면 admin 계정을 생성할 때 추가했던 OS_SERVICE_TOKENOS_SERVICE_ENDPOINT를 환경변수에서 해제합니다.

# unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT

 

13.  이제 keystone 서비스가 정상적으로 실행되는지 테스트합니다. 이때 환경변수를 쉽게 편집하기 위해 vi 에디터로 파일에 저장해두면 좋습니다.

# vi admin-openrc.sh
export OS_USERNAME=admin
export OS_PASSWORD=adminpass
export OS_TENANT_NAME=admin
export OS_AUTH_URL=http://10.10.15.11:35357/v2.0

 

14.  Vi 에디터로 만든 환경변수 설정 파일은 다음과 같이 source export할 수 있습니다.

# source admin-openrc.sh

 

15.  이제 파라메터 없이 바로 token을 얻어와 보겠습니다.

# keystone token-get
+-----------+----------------------------------------------------------------------+
|  Property |  Value                                                               |
+-----------+----------------------------------------------------------------------+
|  expires  |  2014-06-15T19:00:15Z                                                |
|     id    | MIIE7QYJKoZIhvcNAQcCoIIE3jCCBNoCAQExCTAHBgUrDgMCGjCCA0MGCSqGSIb3DQEHAa
CCAzQEggMweyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxNC0wNS0yN1QwODoxMzo0Mi
4xNTA0MDUiLCAiZXhwaXJlcyI6ICIyMDE0LTA1LTI3VDA5OjEzOjQyWiIsICJpZCI6ICJwbGFjZWhvbGRlci
IsICJ0ZW5hbnQiOiB7ImRlc2NyaXB0aW9uIjogIkFkbWluIFRlbmFudCIsICJlbmFibGVkIjogdHJ1ZSwgIm
lkIjogIjcxNzVlZmQ0ZDIyZTQxYWE4OTAzYjBjYWI0NWZmYWE2IiwgIm5hbWUiOiAiYWRtaW4ifX0sICJzZX
J2aWNlQ2F0YWxvZyI6IFt7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xMC4xMC4xNS4xMT
ozNTM1Ny92Mi4wIiwgInJlZ2lvbiI6ICJyZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovLzEwLj
EwLjE1LjExOjUwMDAvdjIuMCIsICJpZCI6ICIyNGUzMmJkYzBmYTg0NzU1ODk4Y2M5ZWIyZjg5ZTg4NiIsIC
JwdWJsaWNVUkwiOiAiaHR0cDovLzEwLjEwLjE1LjExOjUwMDAvdjIuMCJ9XSwgImVuZHBvaW50c19saW5rcy
I6IFtdLCAidHlwZSI6ICJpZGVudGl0eSIsICJuYW1lIjogImtleXN0b25lIn1dLCAidXNlciI6IHsidXNlcm
5hbWUiOiAiYWRtaW4iLCAicm9sZXNfbGlua3MiOiBbXSwgImlkIjogIjRkZjcwZWJhYWI2YjQxNzg4NzE0MT
c3MmRiZDJhY2EwIiwgInJvbGVzIjogW3sibmFtZSI6ICJtZW1iZXIifSwgeyJuYW1lIjogImFkbWluIn1dLC
AibmFtZSI6ICJhZG1pbiJ9LCAibWV0YWRhdGEiOiB7ImlzX2FkbWluIjogMCwgInJvbGVzIjogWyIzZWVhMm
IwODMyZWM0OTlkOTYyZTRjZjE4NzJlNzJiOSIsICI4MmI0OWU1NjE5ZjU0MzU3YmY1ZjYzN2M1MWRjZmUyZC
JdfX19MYIBgTCCAX0CAQEwXDBXMQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVW5zZXQxDjAMBgNVBAcMBVVuc2
V0MQ4wDAYDVQQKDAVVbnNldDEYMBYGA1UEAwwPd3d3LmV4YW1wbGUuY29tAgEBMAcGBSsOAwIaMA0GCSqGSI
b3DQEBAQUABIIBAMzeUbt-hokRop8qGVRN7L1BMHpDkh7UaUAK62ThFSV3ydu2zXR8tMGZcSS3lTxIL-0mrt
oun44p2lX9x+9OPNldPKlC39cgyCOnyFqb5kkdteXuD8JJiFq0klyNPzRtjKr6Vxxb4C3Xjf9tLJnzCuZKYB
I9-F+oad0EOoaolLG-RNmD56AdGq3Qnly8MPi3EWeCIbHqTvXrVwBgOYUSYdUk32qEacw7atjxB1NdRzTpsm
m7I261iEKhFTvBfCwQf6PH0AeNHSwpDIgQtJ6f6dlKJAKyKV1puFxUytymmPoLc3t9-IGB-rRDsOUnESGO3E
i11oQrv+FLGZ+62hGORjI=                                                             |
| tenant_id | 7175efd4d22e41aa8903b0cab45ffaa6                                     |
|  user_id  | 4df70ebaab6b417887141772dbd2aca0                                     |
+-----------+----------------------------------------------------------------------+

 

16.  사용자 목록도 확인해 봅니다.

# keystone user-list
+----------------------------------+-------+---------+-----------------+
|                id                |  name | enabled |      email      |
+----------------------------------+-------+---------+-----------------+
| 7bc1bda9d2444b9c92554ff9e0b71e22 | admin |   True  | admin@email.com |
| 129a943bc94b43379a794ae011a87fe9 |  demo |   True  |  demo@email.com |
+----------------------------------+-------+---------+-----------------+

 

17.  사용자가 가지고 있는 롤 목록도 확인해 봅니다.

# keystone user-role-list
+----------------------------------+-------+----------------------------------+----------------------------------+
|                id                |  name |             user_id              |            tenant_id             |
+----------------------------------+-------+----------------------------------+----------------------------------+
| 02ff77d31ec841b3914db4c3daca4f1c | admin | 7bc1bda9d2444b9c92554ff9e0b71e22 | dbd8df87e5c34536844d915b555061b6 |
+----------------------------------+-------+----------------------------------+----------------------------------+



이렇게 해서 Keystone을 설치해 보았습니다. 다음번 포스팅에서는 Glance와 Nova를 설치해 보도록 하겠습니다.

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack Class2014.06.06 13:55

안녕하세요~!! 

정말 오랜만에 블로그에 포스팅을 하는 것 같습니다. 많이들 기다리셨죠? 그동안 정말 바뻤거든요~~ 그래서, 글을 쓸 시간이 없었어요... ㅠ 저희 아이가 8살이라 올해 학교에 들어갔어요~ 그래서 아이와 저를 위해 얼마전에 회사에 육아휴직을 신청을 했어요. 집에서 쉬니 회사 다닐때보다 할일이 왜 이렇게 많은건지요~~ 정말 바쁘더군요.. 오늘은 큰 맘 먹고 글 하나 써보자 하고 이렇게 블로그에 글 하나 남겨 봅니다. 많이들 좋아해 주시는거죠~~ ^^ 


오늘은 지난 강의에 이어 오픈스택의 핵심 기능이자 초창기 프로젝트 멤버였던 컴퓨트 서비스! NOVA에 대해서 알아볼까 합니다. NOVA는 정말 오래되어서 많은 분들이 잘 알고 계실꺼라 생각이 드는데요~~ 그래도 지금 막 시작하시는 분들이나 알고 있다고 해도 정리하는 차원에서 보시면 좋을 것 같습니다. 


그럼, 시작해 볼까요~~



Logical Architecture로 알아보는 Nova


원 논리 아카텍쳐는 그림이 너무 작아 Nova가 어떤 기능을 하는지 잘 보이질 않습니다. 그래서 논리(Logical) 아키텍처 중 Nova 부분만 크게 잘라봤습니다. 아키텍쳐를 잘 보면 Nova는 아래와 같은 프로세스로 일을 한다는 것을 확인할 수 있습니다.


1. Nova는 데쉬보드나 커맨드 라인 명령어가 호출하는 nova-api로부터 시작됩니다. 

2. nova-api는 Queue를 통해 nova-compute에 인스턴스를 생성하라는 명령어를 전달하고, 

3. 인스턴스 생성 명령어를 전달받은 nova-compute는 하이퍼바이저 라이브러리를 통해

4. 하이퍼바이저에게 인스턴스를 생성하라는 명령어를 다시 전달합니다. 

5. 그 때 하이퍼바이저는 인스턴스를 생성하게 되는거죠! 

6. 생성된 인스턴스는 nova-console를 통해 사용자가 접근할 수 있게 되는 겁니다.





Nova가 지원하는 하이퍼바이저의 종류


이번에는 Nova가 지원하는 하이퍼바이저의 종류를 알아볼까요~!!

Nova가 지원하는 하이퍼바이저 종류는 아래 사이트에 가시면 확인 하실 수 있습니다.

https://wiki.openstack.org/wiki/HypervisorSupportMatrix


그런데, 영어로 되어 있고, 텍스트 뿐이여서 처음 시작하시는 분들에게는 조금 어려울 수 있습니다. 그래서 제가 그림으로 한번 그렸봤어요~!! 그러면 좀 더 이해하기 쉽겠죠!! ^^


Nova가 지원하는 하이퍼바이저는 그룹이 3개가 있는데 

1. 가장 기본적인 하이퍼바이저는 그룹A의 Qemu와 KVM입니다. 

2. 두번째 그룹B에서는 Hyper-V, VMware, XenServer6.2 을 지원합니다.

3. 세번째 그룹C에서는 Baremetal, docker, Xen via libvirt, LXC via libvirt 를 지원합니다.



노드별로 설치되는 Nova


이번에는 노드별로 설치되는 Nova 프로세스들을 알아보겠습니다. 그냥 노드별로 설치되는 프로세스명만 보는 것보다는 아래 그림처럼 아키텍처와 연관지어서 어떤 프로세스들이 설치되는지를 그려보면 Nova를 이해하는데 더욱 더 도움이 많이 됩니다. 그래서, 제가 대표로 여러분들을 위해 한번 그려 봤어요~!! ^^



컨트롤러 노드에 설치되는 Nova 프로세스들은 아래와 같아요~!! 아주 많죠?

- nova-api 

- nova-cert 

- nova-conductor 

- nova-consoleauth

nova-novncproxy 

- nova-scheduler

nova-novaclient 


대신에 컴퓨트 노드에는 몇개 설치되지 않아요~!!

- nova-compute-kvm 

- python-guestfs

- qemu-kvm 


여기서 python-guestfs가 뭘 하는건지 궁금하시죠? python-guestfs는 파일을 만들어주는 파이썬 라이브러리예요~!! 그래서, 가상 인스턴스를 생성할때 사용해요~!! 사실은 저도 잘 몰라서 검색엔진에서 찾아봤어요~~~ 저보다 더 잘 아시는 분이 계시다면 설명 해 주시면 감사하겠죠!!




DashBoard로 보는 Nova


그럼, Dashboard에서는 어떤 메뉴가 Nova 기능일까요? 아래 보이는 인스턴스 화면이 바로 Nova 기능이예요~!! 인스턴스라고 써 있어서 Nova가 왜 안보일까 하고 생각하셨다면 아래 보이는 화면이 Nova가 해주는다는 사실 하나만 알고 가도 되겠죠~!!^^




Nova에 대해 더 알고 싶다면~~~


Nova가 더 궁금하다구요? 그러면 아래 사이트들을 방문해보세요~~~ 저보다 더 친절하고 저보다 더 최신정보를 여러분들에게 제공해 드릴꺼예요~!! 영어때문에 잘 모르겠다구요~~~ 그러면 요즘 나오는 번역기를 이용하면 되겠죠!!! 


o 소스코드 다운로드: https://github.com/openstack/nova

o 코드 리뷰: https://review.openstack.org

o 코드 빌드: https://jenkins.openstack.org/

o 문서 : http://docs.openstack.org

o 개발자 문서: http://nova.openstack.org

o 런치패드 : https://launchpad.net/nova

o 위키 사이트 : https://wiki.openstack.org/wiki/nova



이렇게 해서 Nova에 대해 제가 알려드릴수 있는, 표현할 수 있는 범위의 모든 것에 대해 다 정리를 해 보았습니다. 사실 글로 정리만 한다거나 말로 하는것은 누구나 할 수 있습니다. 그러나 저는 많은 분들이 좀 더 쉽고 재미있게 오픈스택을 이해하고 공부하는데 도움이 되길 바라는 마음으로 그림으로 항상 그려보고 좀 더 쉽게 표현할 수 있는지를 늘 항상 연구합니다.  왜냐하면 저도 오픈스택이 어렵거든요~~~ 


그럼, 다음시간에는 오브젝트 스토리지인 Swift에 대해 정리해 보도록 하겠습니다. 많이들 좋아요~~~ 클릭해 주시고 댓글도 많이 많이 달아주세요~~~ ^^

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack Class2014.04.23 17:05

안녕하세요~!! 

지난주부터 텔레비전에는 연일 세월호 참사에 대한 뉴스가 나와 국민 모두를 가슴 아프게 했습니다. 이제 이런 일들은 제발 일어나지를 않기를 간절히 소망해 봅니다.


오늘부터는 클라우드 시스템을 만들기 위한 오픈소스 플랫폼 중에서도 근래가 가장 핫(Hot)한 OpenStack 에 대해서 알아보도록 하겠습니다. 처음으로 오픈스택에 대한 소개를 하는 시간인데 어떤 주제로 소개를 하면 좋을까? 하고 고민하다가 늘 그렇듯이 오픈스택이 언제 처음으로 공개가 되었는지 그리고, 어떤 변천사를 거쳤는지에 대한 OpenStack 역사를 다루면 좋겠다 라는 생각을 했습니다.



오픈스택의 역사!


오픈스택은 2010년 NASA와 Rackspace가 하던 프로젝트를 오픈소스화하면서 세상에 알려지게 된 플랫폼으로써 그 해 10월에 처음으로 Austin이라는 이름으로 릴리즈를 하였습니다. 그리고, 그 후로 아래와 같이 6개월에 한번씩 릴리즈를 하고 있습니다. 현재 릴리즈 버전은 지난 4월 17일날 릴리즈 한 IceHouse입니다.



버전별 프로젝트 종류


처음으로 릴리즈 한 Austin에서는 그냥 단순히 컴퓨트 서비스와 오브젝트 파일 스토리지 서비스,이미지 관리 서비스뿐 이였습니다.


처음 서비스 개념으로 릴리즈한 오픈스택은 그 후 프로젝트를 만들고, 프로젝트에 이름을 달아주었습니다. 그리하여 Bexar 릴리즈 때부터는 컴퓨트 서비스는 Nova라는 이름을, 오브젝트 스토리지 서비스는 Swift를, 이미지 관리 서비스는 Glance라는 이름을 갖게 되었습니다. 그리고, Diablo 때까지 열심히 기능을 업그레이드 했습니다.


오픈스택은 Essex 버전을 릴리즈하면서 새로운 기능을 추가를 시켰는데, 그 기능들이 아래 보이는 Keystone과 Horizon이였습니다. Keystone은 Nova, Glance, Swift와 같은 서비스들의 인증을 담당하는 프로젝트이며, Horizon은 서비스들을 좀 더 쉽게 사용하기 위해 사용자들에게 Dashboard를 제공하는 프로젝트입니다.


Folsom 버전을 오면서 또 다시 새로운 프로젝트들이 나타났는데, SDN(Software Defined Network)을 사용하기 위한 Quantum 프로젝트와 볼륨 스토리지를 별도로 관리하기 위한 Cinder 프로젝트였습니다. 그리고, 이 기능들은 Grizzly 때까지 계속 업그레이드가 되었습니다.


오픈스택은 기존 프로젝트의 안정화를 하면서, 다양한 프로젝트로 새로운 기능들을 계속해서 추가하고 있습니다. Havana 버전부터는 아래와 같은 Conceptual 아키텍처가 나오기 시작했습니다. Havana 버전에서 정식으로 추가된 프로젝트는 오케스트레이션 서비스인 Heat와 모니터링 및 미터링 서비스인 Ceilometer가 있습니다. 그리고, 몇일 전에 릴리즈한 IceHouse 버전에서는 Trove라는 데이터베이스 서비스가 새롭게 추가되었습니다.



릴리즈에 대한 정보는 아래 wiki 사이트에서도 확인하실 수 있습니다.

https://wiki.openstack.org/wiki/Releases


오늘은 오픈스택의 역사~ 즉 오픈스택이 릴리즈한 현황과 어떤 프로젝트로 릴리즈를 했는지에 대한 정보들을 알아보았습니다. 다음 시간부터는 각각의 컴포넌트들에 대해서 하나씩 하나씩 알아보는 시간을 가져보도록 하겠습니다.



저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack Class2013.12.18 09:29

안녕하세요~!!

정말 오랜만에 블로그에 다시 포스팅을 하는 것 같습니다.


그동안 프로젝트 업무로 인해 바뻐서 글을 쓸수가 없었거든요~!! 

하지만, 시간을 조금씩 내어서 이번 기회에 입문자들의 위한 클라우드 및 오픈스택 강좌(?) 를 하려고 합니다. 

강좌라기 보다는 그냥 여기저기 산재되어 있는 오픈스택과 관련된 정보들을 정리하는 수준이 되겠죠~!! 


아무쪼록 오픈스택을 하고자 입문하시는 많은 분들께 도움이 되었으면 좋겠습니다.

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2013.12.09 13:05

그동안 모두들~~~ 안녕하셨죠?

어느새 2013년이 다 지나가고, 12월도 얼마 남지 않았습니다. 어떻게 연초에 계획했던 일들은 다들 잘 이루셨나요? 모두들 소원하는 것들을 이루셨으리라 믿습니다. 



저는 이번에 그동안 활동해 왔던 "Openstack 한국 커뮤니티"의 새로운 대표가 되었습니다. 

오픈스택을 처음 만났을 때가 2011년 9월이였고, 그때의 오픈스택 버전은 막 Diablo 가 릴리즈 되었을 무렵이였습니다. 제가 처음으로 맡았던 건 Object Storage였던 Swift 였고, Swift를 설치하면서 경험했던 삽질들을 메뉴얼화 하여 오프스택 한국 커뮤니티 홈페이지에 공개를 했던 기억이 납니다. 그리고, 그때 처음으로 Daum에서 개최한 Devon에 커뮤니티 부스로 참여를 했었습니다. 오픈소스~ 클라우드~ 시스템~ 네트워크~ 처음에는 전부 다 생소하고, 어렵기만 했는데, 하나씩 하나씩 매일 매일 들여다 보고, 테스트하고, 설치를 밥먹듯이 하니, 조금씩 조금씩 하나씩 하나씩 알아가는 것이 너무 너무 재미있기만 했었습니다. 지금도 물론 그렇구요~~~ 그리고, 가장 즐거웠던 건 커뮤니티를 통해 사람들을 만나고, 내가 모르는 것들을 그들을 통해 배우고, 내가 알고 있는 것들을 다른 이들에게 나눠줄 수 있다는 것이였습니다. 


요즘 들어 "오픈스택"에 대한 사람들의 관심도가 높아지고 있습니다. 

하루에 페이스북 오프스택 그룹에 가입하는 신입 회원들의 수가 늘고 있습니다. 

처음 오픈스택을 시작했을 때보다 "오픈스택"을 하는 회사들이 점점 늘고 있습니다.

3개의 프로젝트로 시작한 오픈스택이 이제는 무려 10개의 프로젝트로 늘어났습니다.

오픈소스 클라우드 플랫폼인 오픈스택에 관심을 보이고, 사랑해 주는 사람들이 늘고, 회사가 늘고 있습니다.


재미난 것 내가 좋아하는 것을 할때는 눈에서 불꽃이 일고, 심장이 터질듯이 띈다고 하죠~!!

그만큼 열정을 다해 오픈스택 한국 커뮤니티를 이끌어 나가겠습니다. 

지켜봐 주시고, 관심 가져주시고, 아낌없는 응원과 후원, 그리고 참여 부탁드립니다.


2013년 12월의 어느날~~



오픈스택 공식 홈페이지 : http://www.openstack.org

한국 커뮤니티 홈페이지 : http://www.openstack.or.kr

페이스북 그룹 : https://www.facebook.com/groups/openstack.kr/

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2013.06.13 12:49

오늘은 OpenStack Grizzly Dashboard에서 이미지를 등록하는 방법을 Post해보고자 합니다. Folsom 이전 버전에서는 Glance Image을 올리기 위해서 CLI 명령어를 이용을 해야만 했습니다. 그런데 현재 Grizzly 버전에서는 Dashboard에서 이미지를 직접 올릴 수 있는 기능을 제공을 합니다. 참 많이 업데이트가 되었죠~!!

 

그럼, 지금부터 Dashboard를 통해 이미지를 등록해 보도록 하겠습니다.

 

1.     우선, Horizon DashboardAdmin 계정으로 로그인을 한다. 그리고, 시스템 패널이미지들 이라는 메뉴를 선택하여 들어간다.


  

2.     이미지들 목록 상단 우측에 Create Image 라는 버튼을 클릭하면 아래와 같이 Create An Image라는 팝업이 뜬다.


 

3.     팝업이 뜨면 아래 그림처럼 이름, Image Location 또는 Image File, Format 을 입력하고, Public을 체크한다. 만일 Ubuntu Image를 올릴 예정이라면 아래 URLImage Location란에 입력하면 된다.

http://uec-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img


4.     입력을 하고 Create Image 버튼을 클릭하면 팝업이 닫히면서 목록에 Saving이라는 상태를 확인할 수 있을 것이다.


5.     위에서 등록한 이미지 상태는 프로젝트 탭의 Image & Snapshots 메뉴에서도 확인할 수 있다.


6.     이미지 등록이 완료되면 상태가 Saving에서 Active로 변경된다.


이제 인스턴스 생성을 해서 사용하면 된다. 이전에는 이미지를 등록하려면 복잡하고 어려운 명령어를 일일이 다 찾아 봐야 했지만, 이젠 UI를 이용해서 쉽게 이미지를 업로드 할 수 있다.

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2013.04.14 18:00

안녕하세요~!! 


얼마전에 OpenStack Grizzly을 설치하고 Dashboard를 보면서 감탄을 하고 있는 중입니다. 어떤 기능들이 추가 되었길래 감탄중이냐구요?? 그래서 오늘 감탄하고 있는 기능들 새롭게 추가된 기능들을 소개드리고자 합니다.


예전에 Folsom 설치할 때는 Dashboard에서 오류도 많이 나고 불안정했었는데, 이번 Grizzly 버전에서는 상당히 많이 안정이 된 것 같습니다.


  • 네트워크 토폴로지 기능

생성한 네트워크와 생성한 Instance 의 네트워크 구성도를 그림으로 표현해 주는 기능이 가장 신선했고, 네트워크를 이해하는데 도움을 많이 주는 것 같다.



  • 이미지 추가 기능

예전에는 이미지를 추가하기 위해서는 반드시 Command 명령어로 이미지를 올려야만 했었는데 이번 grizzly Dashboard에서는 이미지를 바로 올릴 수가 있다. 



  • 인스턴스 생성시 네트워크 선택 기능

이전에는 단지 Combo box로 되어 있어 선택을 해야했었는데 이번에는 이미지로 되어 있어 Available networks의 + 버튼을 클릭하면 network 박스가 상단의 Selected Networks로 올라간다.



  • 목록에서 탭으로

기존 Access & Security 화면은 모든 기능은 목록처럼 쭉 나열되어 있었다. 그런데 이번 Grizzly 버전에서는 탭으로 정리되어 나온다.


이 외에도 다양한 기능들이 더 추가가 된 듯 싶은데 이번 글에서 다 쓰기가 힘이 좀 들것 같아 오늘은 이번것으로 마무리하고자 한다. 다음에 좀 더 많은 내용들을 블로그에 정리해서 올리도록 하겠다.

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2013.03.20 13:58

처음 OpenStack를 시작하는 사람들이 Openstack를 설치할때 가장 많이 사용하는것이 바로 Devstack Shell Script이다. DevStack Shell Script를 사용하여 OpenStack을 설치하게 되면 간단한 환경설정만으로도 쉽게 클라우드를 설치할 수 있다.


그런데, localrc라고 하는 환경설정 파일을 만드는것조차도 초보자들에게는 매우 어렵게만 느껴진다. 그리고, 나역시 물론 처음에는 잘 안되서 삽질을 했었다. 그래서, devstack shell script를 전부 분석을 하기도 했는데, 계속 업데이트 되어서 다운로드 받을때마다 다시 보긴해야 하지만 말이다. 


그럼, 지금부터 localrc 환경설정 방법을 잠시 살펴보도록 하겠다.


- HOST_IP : 설치하고자 하는 서버의 IP

- FIXED_RANGE : 인스턴스에 할당해 주기 위한 내부 IP 범위

- FLOATING_RANGE : 대체적으로 공인 IP 범위를 할당하며, 그렇지 않을 경우 내부 인트라넷 IP 범위를 할당한다.


  • Single Node, Nova-network 사용시

# default

HOST_IP=192.168.42.101

 

# network

FLAT_INTERFACE=eth0

FIXED_RANGE=10.0.0.0/20

FIXED_NETWORK_SIZE=4096

FLOATING_RANGE=192.168.0.1/24

 

# vnc

VNCSERVER_LISTEN=0.0.0.0

VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP

 

# logs

DEST=/opt/stack

LOGFILE=$DEST/logs/stack.sh.log

SCREEN_LOGDIR=$DEST/logs/screen

 

# system password

ADMIN_PASSWORD=openstack

MYSQL_PASSWORD=openstack

RABBIT_PASSWORD=openstack

SERVICE_PASSWORD=openstack

SERVICE_TOKEN=openstackservicetoken

 

# cinder

VOLUME_GROUP="cinder-volume"

VOLUME_NAME_PREFIX="volume-"


  • Multi Node, Nova-network 사용시 Controller Node

# default

HOST_IP=192.168.42.101

MULTI_HOST=True

 

# network

FLAT_INTERFACE=eth0

FIXED_RANGE=10.0.0.0/20

FIXED_NETWORK_SIZE=4096

FLOATING_RANGE=192.168.0.1/24

 

# vnc

VNCSERVER_LISTEN=0.0.0.0

VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP

 

# logs

DEST=/opt/stack

LOGFILE=$DEST/logs/stack.sh.log

SCREEN_LOGDIR=$DEST/logs/screen

 

# system password

ADMIN_PASSWORD=openstack

MYSQL_PASSWORD=openstack

RABBIT_PASSWORD=openstack

SERVICE_PASSWORD=openstack

SERVICE_TOKEN=openstackservicetoken

 

# cinder

VOLUME_GROUP="cinder-volume"

VOLUME_NAME_PREFIX="volume-"


  • Multi Node, Nova-network 사용시 Compute Node

# default

HOST_IP=192.168.42.102

MULTI_HOST=True

 

# network

FLAT_INTERFACE=eth0

FIXED_RANGE=10.0.0.0/20

FIXED_NETWORK_SIZE=4096

FLOATING_RANGE=192.168.0.1/24

 

# vnc

VNCSERVER_LISTEN=0.0.0.0

VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP

 

# logs

DEST=/opt/stack

LOGFILE=$DEST/logs/stack.sh.log

SCREEN_LOGDIR=$DEST/logs/screen

 

# system password

ADMIN_PASSWORD=openstack

MYSQL_PASSWORD=openstack

RABBIT_PASSWORD=openstack

SERVICE_PASSWORD=openstack

SERVICE_TOKEN=openstackservicetoken

 

# cinder

VOLUME_GROUP="cinder-volume"

VOLUME_NAME_PREFIX="volume-"


# system hosts
SERVICE_HOST=192.168.42.101
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=$SERVICE_HOST:9292
KEYSTONE_AUTH_HOST=$SERVICE_HOST
KEYSTONE_SERVICE_HOST=$SERVICE_HOST

# install service
ENABLED_SERVICES=n-cpu,n-net,n-api,cinder,c-sch,c-api,c-vol

  • Single Node, Quantum 사용시

# default

HOST_IP=192.168.42.101

 

# network

FLAT_INTERFACE=eth0

FIXED_RANGE=10.0.0.0/20

NETWORK_GATEWAY=10.0.0.1

FLOATING_RANGE=192.168.0.1/24

EXT_GW_IP=192.168.0.1

 

# vnc

VNCSERVER_LISTEN=0.0.0.0

VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP

 

# logs

DEST=/opt/stack

LOGFILE=$DEST/logs/stack.sh.log

SCREEN_LOGDIR=$DEST/logs/screen

 

# system password

ADMIN_PASSWORD=openstack

MYSQL_PASSWORD=openstack

RABBIT_PASSWORD=openstack

SERVICE_PASSWORD=openstack

SERVICE_TOKEN=openstackservicetoken

 

# cinder

VOLUME_GROUP="cinder-volume"

VOLUME_NAME_PREFIX="volume-"

 

# install service

disable_service n-net

enable_service q-svc q-agt q-dhcp q-l3 q-meta quantum


  • Multi Node, Quantum 사용시 - Controller Node

# default

HOST_IP=192.168.42.101

MULTI_HOST=True


# network

FLAT_INTERFACE=eth1

FIXED_RANGE=10.0.0.0/20

NETWORK_GATEWAY=10.0.0.1

FLOATING_RANGE=192.168.0.1/24

EXT_GW_IP=192.168.0.1

 

# vnc

VNCSERVER_LISTEN=0.0.0.0

VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP

 

# logs

DEST=/opt/stack

LOGFILE=$DEST/logs/stack.sh.log

SCREEN_LOGDIR=$DEST/logs/screen

 

# system password

ADMIN_PASSWORD=openstack

MYSQL_PASSWORD=openstack

RABBIT_PASSWORD=openstack

SERVICE_PASSWORD=openstack

SERVICE_TOKEN=openstackservicetoken

 

# cinder

VOLUME_GROUP="cinder-volume"

VOLUME_NAME_PREFIX="volume-"

 

# install service

disable_service n-net

enable_service q-svc q-agt q-dhcp q-l3 q-meta quantum


  • Multi Node, Quantum 사용시 - Compute Node

# default

HOST_IP=192.168.42.102

MULTI_HOST=True


# network

FLAT_INTERFACE=eth1

FIXED_RANGE=10.0.0.0/20

NETWORK_GATEWAY=10.0.0.1

FLOATING_RANGE=192.168.0.1/24

EXT_GW_IP=192.168.0.1

 

# vnc

VNCSERVER_LISTEN=0.0.0.0

VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP

 

# logs

DEST=/opt/stack

LOGFILE=$DEST/logs/stack.sh.log

SCREEN_LOGDIR=$DEST/logs/screen

 

# system password

ADMIN_PASSWORD=openstack

MYSQL_PASSWORD=openstack

RABBIT_PASSWORD=openstack

SERVICE_PASSWORD=openstack

SERVICE_TOKEN=openstackservicetoken

 

# cinder

VOLUME_GROUP="cinder-volume"

VOLUME_NAME_PREFIX="volume-"


# system hosts
SERVICE_HOST=192.168.42.101
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=$SERVICE_HOST:9292
KEYSTONE_AUTH_HOST=$SERVICE_HOST

KEYSTONE_SERVICE_HOST=$SERVICE_HOST 


# install service

ENABLED_SERVICES=n-cpu,n-api,g-api,cinder,c-sch,c-api,c-vol,quantum,q-agt


이젠 환경설정 때문에 고민하지 않아도 된다. 아래 보이는 gitHub에서 가서 설치하고자 하는 유형의 localrc를 다운로드 받아 사용하기만 하면 된다. 단, 위에 굵게 표시되어 있는 IP 정보는 반드시 설치하고자 하는 호스트의 환경에 맞추어야 한다.


https://github.com/naleeJang/devstack-localrc

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2013.01.11 17:46

2011 9! 나는 Openstack이라고 하는 오픈 소스 클라우드 프로젝트를 만났다. 그때 막 대두가 되고 있는 것들이 빅데이터, 클라우드, 가상화 라고 불리는 것들이고, 그때 접한 것이 바로 Openstack이였다. 내가 Openstack을 처음 만났을 때는 프로젝트가 시작 된지 얼마 되지 않았을 때였고, 그 누구도 OpenStack을 어떻게 설치하고, 어떻게 사용하면 되는지에 대한 방법을 제대로 알고 있는 사람이 얼마 되지 않았었다. 그때 도전한 것이 바로 Openstack Swift였다. Swift Amazon S3와 같은 개념을 가지고 있는 Object Storage이다. 기존에는 물론 Web Hard라고 하는 것이 존재를 하고 있었지만, 그것은 단지 데이터를 업로드하고 다운로드 할 수 있는 아주 단순한 기능만을 제공하고 있는 반면에 Object Storage OpenStack SwiftOpenStack Nova의 이미지 자료를 백업할 수 있는 백업용으로, 사용자들에게 웹 하드처럼 데이터를 저장하고 다운로드 받을 수 있는 공간으로 사용할 수 있게끔 누구나 시스템을 설치하고, 운영할 수 있는 방법을 제공하는 것이 바로 Openstack Swift였던 것이다.


나를 알고, 적을 알면 백전백승이다라는 옛말이 있다. Openstack을 알아야 어디에 어떻게 활용을 하고, Amazon을 알아야 우리 회사에 필요한 클라우드 시스템이 어떤 것인지를 알 수가 있는 것이다. 그럼, 지금부터 잠시 Openstack에 대해 알아보도록 하자.


Openstack 3가지 기본 서비스와 기본 서비스를 Supporting 해주는 4가지 부가 서비스들로 이루어져 있다.

-      기본서비스

n  Cloud Compute Service : Nova

n  Object Storage Service : Swift

n  Cloud Image Service : Glance

-      부가서비스

n  Identity Service : Keystone

n  Network Service : Quantum

n  Blocked Storage Service : Cinder

n  Dashboard Service : Horizon


Openstack은 위의 7가지 서비스들이 유기적으로 결합되어 하나의 서비스를 제공해 준다. 아래의 Conceptual Architecture 처럼 말이다.



처음에는 단지 Compute, Image, Object Storage 라는 3가지 기본 서비스만으로 시작한 프로젝트가 지금은 무려 7개의 프로젝트가 되었고, NASA Rackspace로 시작된 본 프로젝트는 지금 87개의 나라에 약 6695명의 사람들로 커뮤니티가 형성이 되어 있으며, 공식으로 Support하는 업체만 해도 무려 34개나 된다. 뿐만 아니라, 지난 9 19에는 Rackspace를 떠나 Openstack Foundation 이 출범되었다. 이때 물론 오픈스택 한국 커뮤니티에서도 이를 축하하는 축하의 자리도 마련했었다.



스마트 폰 시장에는 애플의 iPhone과 애플에 맞서는 구글의 Android Phone으로 나뉘어져 있다. Openstack Amazon이라고 하는 iPhone과 같은 것에 대항하는 Android 같은 Open Source라는 점에 주목을 해야 한다. 왜 많은 기업들은 앞 다투어 오픈스택을 지지하고 Supporting하는 걸까? 그것은 바로 가격! 돈이다. 상용서비스는 편하다. 하지만, 장기적으로 상용 서비스를 사용하게 되면 많은 돈이 지출된다. 사람들은 어떻게 하면 돈을 쓰지 않고 클라우드 서비스를 사용할 수 있을까? 의 해결책이 바로 Openstack이 되는 것이다. 그래서, 많은 나라에서 많은 기업들이 Openstack에 관심을 갖고, Openstack을 중심으로 한 다양한 Applications을 개발하며, 이와 관련한 Business가 활발하게 전개되고 있는 것이다. 그러면, 대한민국은 어떨까?



가장 대표적인 Case로 지난 201110KT에서는 Openstack Swift을 기반으로 한 UCloud의 스토리지 서비스를 상용화에 성공하였다. 그에 이어 2012 7월에는 ixcloud에서 Openstack을 기반으로 한 Compute 서비스를 상용화하였다. 뿐만 아니라, 여러 국책과제로 OpenStack이 지정이 되어, 시스템을 구축하고, 운영 중에 있으며, 일반 기업 내에서도 Open Source Project Openstack Private Cloud로 구축하여 운영하고 있다. 뿐만 아니라, 대용량의 스토리지 서비스를 제공하려고 하는 기업에서도 Openstack Swift 라는 Object Storage Service의 기술을 검증하고 안정화 테스트를 계속해서 진행하고 있다. 대학이나 연구소에서는 어떨까? 일부 대학에서는 클라우드를 배우는 과목이 생기고, Based System으로 Openstack을 구축하며, 연구소에서는 다양한 연구용으로 그 Based System OpenStack으로 구축한다. 대용량의 데이터를 보관해야 하는 병원에서는 Openstack Swift를 구축하여 스토리지로 활용하기도 한다. 지금 대한민국의 여러 분야에서 Open Cloud Openstack을 사용하려고 시도하는 곳이 늘어나고 있는 추세이다.


또한 Openstack은 매번 그 기능을 향상시켜 Version Up이 되고 있고, 새로운 기능이 추가될 때마다 새로운 업체들이 Openstack Join하여 Openstack의 가치를 부각시키고 있다. 얼마 전에 가상화 하면 떠오르는 가장 대표적인 업체 Vmware OpenStack Join을 하였고, 대부분의 대형 Vendor 업체들이 Openstack에 가담하고 있다.


Openstack! Android가 스마트 폰 시장의 절반을 가져 갔듯이 Cloud 시장의 절반은 Openstack이 될 것이며, 그 시장의 가치는 아마도 무궁무진할 것이다.

 

참조 URL :

http://wiki.openstack.org/Quantum

http://www.itworld.co.kr/news/77892

http://www.openstack.org/foundation/

http://www.wired.com/wiredenterprise/2012/08/vmware_openstack/

http://www.networkworld.com/news/2012/110512-rightscale-openstack-263969.html

http://docs.openstack.org/trunk/openstack-compute/admin/content/conceptual-architecture.html

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.12.21 15:40

오늘은 예전에 Devstack Shell Script를 이용해서 살알짝 수정했었던 Swift Install Shell Script를 여러분들께 공개할까 합니다.

테스트나 스터디용으로 만든 버전이라서 혼자 가지고 있는것보다는 같이 공유해서 보면 좋을 것 같다는 생각을 했습니다. 보시다가 더 좋은 아이디어가 있다면 역시 서로서로 공유할 수 있는 아름다운 사회 문화를 만들어 봅시다. ^^



DevStack Shell Script를 보면 Openstack의 

- Compute Service인 Nova 뿐만 아니라 

- Image Service인 Glance, 

- Object Storage인 Swift, 

- Network Service인 Quantum, 

- Volume Storage 인 Cinder, 

- Web Service인 Horizon,

- Auth Service인 Keystone 

등 모든 것을 전부 다 설치할 수 있도록 지원해 준다.



그런데 이중에서 단독으로 따로 떨어져 나와 독단적으로 구성할 수 있는 것이 있는데 그것이 바로 Object Storage인 Swift이다.

Swift가 다른 OpenStack과 함께 설치가 되면 Glance를 통해 이미지를 저장할 수 있는 저장소로 쓰이지만, 따로 구성했을 경우에서는 클라우드 스토리지로 사용할 수 있다.


예전에 테스트로 DevStack Shell Script를 분석하면서 Swift만 따로 구성할 수 있는 Script를 만들면 좋을 것 같아 테스트 삼아 한번 수정해 본것이 있는데 그동안 시간이 안되서 포스팅을 못하고 있었다. 오늘 잠시 시간이 되어 포스팅을 한번 해 볼까 한다.


요즘에 다운로드 받는 DevStack Shell Script를 보면 Part별로 소스가 전부 나누어져 개발되어 있는 것을 볼 수 있다. 전에는 거의 한 소스에 전부 모여 있는 것들이 Part별로 나누어져 숨어 있어 한번 더 소스를 찾아가야 하는 번거로움이 있지만, 소스를 수정할 때나 업무를 분담할때는 오히려 더 좋을 수도 있겠다는 생각이 든다.


그런데, 내가 수정했던 DevStack Shell Script는 좀 오래 된 몇개월 된 버전에서 수정했다는 사실이다.

테스트로 만들어본 GitHub 계정에 올려 놓았으니 테스트로 공부를 해 보고 싶으신 분들에 한에서 다운로드 받아 설치해볼수 있다. 그러나, 절대로 시스템 구축시에는 사용할 수 없다~~~~!!!!


https://github.com/naleeJang/devstack-swift


저작자 표시 비영리 변경 금지
신고

'OpenStack' 카테고리의 다른 글

OpenStack! 그 시장의 가치는?  (1) 2013.01.11
Keystone 명령어 테이블  (0) 2013.01.04
Openstack Swift Install Shell Script  (2) 2012.12.21
Cinder 명령어로 볼륨 생성하기  (0) 2012.12.13
Chef 명령어 정리  (0) 2012.12.07
Ubuntu에서 Ubuntu Instance로 접속할 때~!!  (7) 2012.11.21
Posted by 나리 짱!!! naleejang
OpenStack2012.12.13 16:21

오픈테크넷에서 세미나를 한 후 저에게 질문을 해 오시는 분들이 생기기 시작했습니다. 저도 아직 오픈스택에 대해 많은 것을 알고 있는것이 아니라, 그냥 단지 먼저 삽질을 시작한 것 뿐이고 아직 삽질하지 못한 부분이 더 많이 있습니다. 


그리고, 질문들이 제가 이전에 겪었던 그래서 커뮤니티 회원의 누군가로부터 도움을 받았던 내용들이라 저도 그 내용을 다시 전파를 해 주었습니다. 오늘은 어떤 분이 cinder 볼륨과 nova 볼륨에 대한 질문을 해 오셨기에 저도 아직 사용해 보지 않은 내용이고 많이 테스트 해 보지 않은 부분이라서 cinder 명령어를 테스트 해 보고, 정리해 보았습니다.



Cinder 명령어는 nova 명령어와 같이 cinder-manage 로 시작하는 명령어가 있고, cinder로 시작하는 명령어가 있다. 어떤 종류의 서브 명령어와 옵션들이 있는지 궁금하다면 help를 치면 친절하게 어떤 명령어들이 있는지 나온다.

$ cinder-manage --help

Available categories:

       config

       db

       host

       logs

       shell

       sm

       version

       volume

       migrate

 

$ cinder --help

Command-line interface to the OpenStack Volume API.

Positional arguments:

  <subcommand>

    absolute-limits     Print a list of absolute limits for a user

    create              Add a new volume.

    credentials         Show user credentials returned from auth

    delete              Remove a volume.

    endpoints           Discover endpoints that get returned from the

                        authenticate services

    extra-specs-list    Print a list of current 'volume types and extra specs'

                        (Admin Only).

    list                List all the volumes.

    quota-class-show    List the quotas for a quota class.

    quota-class-update  Update the quotas for a quota class.

    quota-defaults      List the default quotas for a tenant.

    quota-show          List the quotas for a tenant.

    quota-update        Update the quotas for a tenant.

    rate-limits         Print a list of rate limits for a user

    rename              Rename a volume.

    show                Show details about a volume.

    snapshot-create     Add a new snapshot.

    snapshot-delete     Remove a snapshot.

    snapshot-list       List all the snapshots.

    snapshot-rename     Rename a snapshot.

    snapshot-show       Show details about a snapshot.

    type-create         Create a new volume type.

    type-delete         Delete a specific volume type

    type-key            Set or unset extra_spec for a volume type.

    type-list           Print a list of available 'volume types'.

    bash-completion     Prints all of the commands and options to stdout so

                        that the

    help                Display help about this program or one of its

                        subcommands.


cinder-manage 의 서브 커맨드들은 9개가 존재를 하며 그중에서도 가장 많이 쓰이는 것이 host 가 아닐까 싶다.

cinder volume storage로 설정되어 있는 host 리스트 정보를 보여준다. 아직까지는 cinder가 제대로 구현이 되지 않아 debug 도 함께 보이지만, 이것도 좀 업데이트 되지 않을까 싶다.

$ cinder-manage host list

host                          zone          

2012-12-13 15:49:35 DEBUG cinder.utils [req-f93bbb68-15a9-47e6-a104-20c5cde70c3c None None] backend <module 'cinder.db.sqlalchemy.api' from '/opt/stack/cinder/cinder/db/sqlalchemy/api.pyc'> from (pid=5719) __get_backend /opt/stack/cinder/cinder/utils.py:557

openstack02                   nova          

openstack01                   nova          

openstack03                   nova


그외에 cinder-manage의 서브 커맨드들은 어떤 옵션들이 있는걸까? Help를 통해 알아보자

$ cinder-manage config   # 이 명령어는 cinder.conf 파일을 보여준다.

/usr/local/bin/cinder-manage category action [<args>]

Available actions for config category:

       list

 

$ cinder-manage db       # DB와 내용을 sync시키고, version정보를 보여준다.

/usr/local/bin/cinder-manage category action [<args>]

Available actions for db category:

       sync

       version

 

$ cinder-manage logs     # cinder를 사용하면서 발생하는 에러로그와 시스템로그를 보여준다.

/usr/local/bin/cinder-manage category action [<args>]

Available actions for logs category:

       errors

       syslog


지금까지는 cinder-manage 명령어에 대해서 알아보았다. 지금부터는 cinder 로 시작하는 명령어에 대해서 알아보도록 하자.

나는 우선 cinder 명령어를 익히기 위해서 Dashboard에서 다 지원하지만, Command 로 볼륨을 생성하고 인스턴스에 Attach를 시켜보았다. 같이 한번 해 보도록 하자.


1. 우선 내가 생성할 수 볼륨 사이즈가 어떻게 되는지 알아본다. 이건 다음과 같이 다양한 명령어로 확인할 수 있다. 

$ cinder absolute-limits

+-------------------------+-------+

|           Name          | Value |

+-------------------------+-------+

| maxTotalVolumeGigabytes |  1000 |

|     maxTotalVolumes     |   10  |

+-------------------------+-------+

 

$ cinder quota-show nalee   # nalee는 내 계정이 소속된 Tenant 명이다.

+-----------+-------+

|  Property | Value |

+-----------+-------+

| gigabytes |  1000 |

|  volumes  |   10  |

+-----------+-------+

$ cinder quota-defaults nalee

+-----------+-------+

|  Property | Value |

+-----------+-------+

| gigabytes |  1000 |

|  volumes  |   10  |

+-----------+-------+

$ cinder quota-class-show nalee

+-----------+-------+

|  Property | Value |

+-----------+-------+

| gigabytes |  1000 |

|  volumes  |   10  |

+-----------+-------+


2. cinder create 명령어로 volume을 생성한다.

$ cinder create --display-name "testvol" --display-description "test" --availability-zone "nova" 100

+---------------------+--------------------------------------+

|       Property      |                Value                 |

+---------------------+--------------------------------------+

|     attachments     |                  []                  |

|  availability_zone  |                 nova                 |

|       bootable      |                false                 |

|      created_at     |      2012-12-13T05:28:13.131825      |

| display_description |                 test                 |

|     display_name    |               testvol                |

|          id         | a6257e84-a8a9-403a-8587-ee70aa476a58 |

|       metadata      |                  {}                  |

|         size        |                 100                  |

|     snapshot_id     |                 None                 |

|        status       |               creating               |

|     volume_type     |                 None                 |

+---------------------+--------------------------------------+


이렇게 생성을 하면 Dashboard의 Volumes 메뉴에서 확인이 가능하다.

 

3. 볼륨이 잘 생성되었는지 cinder list로 확인한다.

$ cinder list

+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+

|                  ID                  |   Status  | Display Name | Size | Volume Type | Bootable | Attached to |

+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+

| 260d2060-eb6f-4ed9-9b46-c7ae999379fb | available |   testvol    | 100  |     None    |  false   |             |

+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+


4. 이번에는 volume의 상세정보를 한번 확인해 보자.

$ cinder show 260d2060-eb6f-4ed9-9b46-c7ae999379fb

+------------------------------+--------------------------------------+

|           Property           |                Value                 |

+------------------------------+--------------------------------------+

|         attachments          |                  []                  |

|      availability_zone       |                 nova                 |

|           bootable           |                false                 |

|          created_at          |      2012-12-13T05:28:13.000000      |

|     display_description      |                 test                 |

|         display_name         |               testvol                |

|              id              | 260d2060-eb6f-4ed9-9b46-c7ae999379fb |

|           metadata           |                  {}                  |

|    os-vol-host-attr:host     |             openstack02              |

| os-vol-tenant-attr:tenant_id |   1e1cf5cd2c3b419a858f9730a320860e   |

|             size             |                 100                  |

|         snapshot_id          |                 None                 |

|            status            |              available               |

|         volume_type          |                 None                 |

+------------------------------+--------------------------------------+


5. 그럼 이제 인스턴스와 cinder 볼륨을 연결시켜보자. 다음과 같이 nova-list 로 인스턴스 정보를 확인하고 cinder list로 볼륨 정보를 확인한다. 

$ nova list

+--------------------------------------+--------+--------+--------------------+

| ID                                   | Name   | Status | Networks           |

+--------------------------------------+--------+--------+--------------------+

| 88b90166-88aa-4d2d-acc1-90b3ca9016c8 | testvm | ACTIVE | private=10.4.128.2 |

+--------------------------------------+--------+--------+--------------------+

$ cinder list

+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+

|                  ID                  |   Status  | Display Name | Size | Volume Type | Bootable | Attached to |

+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+

| 260d2060-eb6f-4ed9-9b46-c7ae999379fb | available |   testvol    | 100  |     None    |  false   |             |

+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+

$ nova volume-attach 88b90166-88aa-4d2d-acc1-90b3ca9016c8 260d2060-eb6f-4ed9-9b46-c7ae999379fb /dev/vdc

+----------+--------------------------------------+

| Property | Value                                |

+----------+--------------------------------------+

| device   | /dev/vdc                             |

| id       | 260d2060-eb6f-4ed9-9b46-c7ae999379fb |

| serverId | 88b90166-88aa-4d2d-acc1-90b3ca9016c8 |

| volumeId | 260d2060-eb6f-4ed9-9b46-c7ae999379fb |

+----------+--------------------------------------+


이렇게 생성하고 나면 Dashboard에서 역시 인스턴스와 볼륨이 연결되어 있는 걸을 확인 할 수 있다.



처음 오픈스택을 시작했을 때는 Help 기능이 있는지도 잘 몰라서 많이 헤매었는데 몇 개월동안 삽질을 하다보니 이제 당연히 Help를 보고 따라 쳐보면 되겠구나 라는 생각이 든다. 나도 그동안 많이 발전한 거겠지~~~ 삽질을 통해서 말이다.ㅋ


오픈스택이라는 오픈소스는 먼저 삽질을 시작한 선배들에게서 배우고, 또 이제 막 삽질을 시작한 후배들에게 정보를 공유할 수 있어 이것이 바로 오픈소스를 공부하고 사용하는 또 하나의 매력이 아닌가 싶다. ^^

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.11.21 10:47

오랜만에 Openstack에서 할당 받은 VM Instance에 접속을 할 일이 생겼습니다. 그것도 Ubuntu Command 로 말입니다.

VM을 할당할때 받아두었던 key.pem 파일을 다시 Ubuntu Server로 올리고서 할당받은 Ubuntu VM Instance에 ssh 접속을 하려니 자꾸 에러가 나더군요~!! 그래서, 역시 Google에서 물어봤죠~!! 안 나오더군요~!! 내 검색 키워드에 문제가 있는 건지는 잘 모르겠지만 말이예요~!!


오늘은 그래서 어떤 문제가 발생했길래 그 쉬운 ssh 접속도 제대로 못하나 어떤 에러를 접했고, 어떻게 하면 되는지를 여러분들께 알려드리도록 하겠습니다. 실은 제가 너무 잘 까먹어서 다음에 제가 다시 보고 하기 위해서이기도 해요~!! ^^;;;;



1.우선 OpenStack에서 Ubuntu Instance를 할당받으려면 public key가 필요합니다. 그래서 keypairs에서 key를 하나 생성을 해 줍니다. 여기까지는 다들 아시겠죠~!!


2. 할당 받은 Key를 가지고서 Ubuntu Instance를 하나 생성을 합니다. 이제 생성을 했으니 접속을 해 봐야겠죠~!! ssh로 말입니다.


3. ssh 접속을 하려면 22번 포트가 열려 있어야 합니다. 다들 아시죠~!! Security Groups에서 22번 포트를 추가해 줍니다.


4. 아까 keypairs에서 할당 받은 public key 기억하시죠~!! 그걸 Ubuntu Server에 올려줍니다.


5. 그리고서는 ssh -i key.pem root@10.4.128.132 하고 명령을 내리면 아래와 같은 메시지가 출력이 되면서 접속이 안됩니다.

# ssh -i testkey.pem root@10.4.128.132

The authenticity of host '10.4.128.132 (10.4.128.132)' can't be established.

ECDSA key fingerprint is 53:36:11:29:9f:6c:70:57:26:24:95:9c:e7:8a:fe:3e.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '10.4.128.132' (ECDSA) to the list of known hosts.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Permissions 0644 for 'testkey.pem' are too open.

It is required that your private key files are NOT accessible by others.

This private key will be ignored.

bad permissions: ignore key: testkey.pem

Permission denied (publickey).

해석을 해보면 가장 윗줄에 나온 3줄은 한번로 해당 호스트로 접속한 적이 없어 신뢰할 수 없는데 그래도 계속 접속을 하겠느냐 라는 뜻입니다. 당연히 yes 라고 입력을 하고 접속을 강행을 합니다. 

이때 해당 호스트의 접속 권한을 추가하려고 하는데 private key file이 unprotected 되었다고 메시지가 뜹니다. protect 가 보호하다 라는 뜻을 가지고 있죠~!! 그런데 unprotected라고 하면 보호되지 않았다. 이런 뜻이 되는 겁니다. 

왜 그런가하고 아래 줄을 봤더니 권한이 너무 많이 오픈되었다고 하네요~!! 다른 사용자들이 접근할 수 없는 권한이 있어야 한다고 아래줄에 나오는거 보이시죠~!! 그래서 이 private key file은 무시될 꺼라고 하네요~!!


6. 그럼, 우리는 여기서 chmod로 key.pem 파일의 권한을 빼 주어야 하는 겁니다. 그럴려면 chmod 의 속성들을 알야야 겠죠~!! 

chmod 명령어를 어떻게 쓰는건지 까지 여기서 설명하면 너무 글이 길어지므로 다음에 제가 다시 설명을 드리도록 하겠습니다.

chmod 에 대한 설명은 이곳에서 >> (http://naleejang.tistory.com/56)


7. 정답은 600 입니다. 여기서 100번대는 소유주, 10번대는 그룹, 1번대는 다른 사용자에게 권한을 주겠다는 뜻입니다. 나만 사용할 수 있어야 하니까 당연히 100번대에만 권한을 줍니다. 이때 읽기는 4, 쓰기는 2, 실행은 1입니다. 읽고 쓰기가 가능해야 하므로 4+2 = 6 해서 chmod 600 이 되는 것입니다. 

# chmod 600 testkey.pem

# ssh -i testkey.pem root@10.4.128.132


The programs included with the Ubuntu system are free software;

the exact distribution terms for each program are described in the

individual files in /usr/share/doc/*/copyright.


Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by

applicable law.


Welcome to Ubuntu 12.10 (GNU/Linux 3.5.0-18-generic x86_64)


 * Documentation:  https://help.ubuntu.com/


  System information as of Wed Nov 21 01:17:43 UTC 2012


  System load:  0.08              Processes:           64

  Usage of /:   35.1% of 1.96GB   Users logged in:     0

  Memory usage: 9%                IP address for eth0: 10.0.0.4

  Swap usage:   0%


  Graph this data and manage this system at https://landscape.canonical.com/


0 packages can be updated.

0 updates are security updates.


Get cloud support with Ubuntu Advantage Cloud Guest

  http://www.ubuntu.com/business/services/cloud

root@ubuntu:~#


여러분 보이시나요? 접속이 된것을... 답은 "chmod 600 key.pem" 이였습니다.


우리 다음부터는 이런것으로 삽질말자구요~!! 그럼 오늘 하루도 모두들 파이팅입니다.

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.11.15 18:08

이번 글에서는 아직 해결하지 못한 삽질 중인 문제에 대해 적어보려고 합니다. OpenStack Folsom 이 Release 된지 이제 한달정도가 지났습니다. 그래서, 저도 Folsom에 이번에는 Quantum까지 함께를 설치를 하기로 결정했습니다. 그런데, Host Server에서 Ping이 되질 않더군요~!!! 그래서, Floating IP를 할당해 보자. 하고 시도했더니 그것마저 아니 되네요~!! 


그래서 그 문제를 에러로그만 보여줄 것이 아니라, 전반적인 상황을 그림과 함께 보여주면 어떨까 하는 생각을 했습니다. 그리고, 테스트를 하거나, 설치를 하려고 시도하시는 분들~ 왜 나만 안되지가 아니라 재도 안되네... 하고 공유할 수 있는 계기가 되지 않을까 하는 마음으로 지금부터 글을 적어보고자 합니다. 함께 고민해 주세요~!!!!


우선, 설치과정은 제외를 했습니다. 그리고, 네트워크와 인스턴스를 생성했다는 전제조건으로 그 다음과정부터 적어보도록 하겠습니다. 




우선, 나는 아래 그림처럼 Instance를 하나 생성하였다.


이번에는 VNC 접속을 해 보았다. 잘 된다.


 

여기까지는 정말 아무 문제없이 잘 진행이 되었다. 그래서 계속 잘 될 줄 알았다. 그런데, 문제는 지금부터가 문제이다

지금 내가 생성한 Instance ssh로 접속을 해 볼 것이다. 호스트 서버에 접속을 해서 ping을 먼저 날려본다. Operation not permitted란다. 그럼 ssh도 안 된다. Ping이 안 나가므로

# ping 192.168.0.3

PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.

ping: sendmsg: Operation not permitted

ping: sendmsg: Operation not permitted

ping: sendmsg: Operation not permitted

ping: sendmsg: Operation not permitted

ping: sendmsg: Operation not permitted

^C

--- 192.168.0.3 ping statistics ---

5 packets transmitted, 0 received, 100% packet loss, time 3999ms

 


그럼 인스턴스 생성은 잘 되었을까? Ifconfig  확인해 보자. 현재 이 PC에는 qbr 로 시작하는 가상 라우터가 2개가 생성이 되어 있으며, qvb로 시작되는 가상 브릿지가 2, 가상 인스턴스와 연결되는 qvo로 시작하는 가상 네트워크가 2개가 있다. 그리고, vnet이라고 하는 가상 인스턴스도 생성이 되어 있다.

# ifconfig

br-ex     Link encap:Ethernet  HWaddr 76:fe:a6:96:6a:48 

          inet addr:172.24.4.225  Bcast:0.0.0.0  Mask:255.255.255.240

          inet6 addr: fe80::74fe:a6ff:fe96:6a48/64 Scope:Link

          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1

          RX packets:58 errors:0 dropped:0 overruns:0 frame:0

          TX packets:61 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:4873 (4.8 KB)  TX bytes:5367 (5.3 KB)

 

eth0      Link encap:Ethernet  HWaddr fa:16:3e:10:08:4f 

          inet addr:10.4.128.15  Bcast:10.4.143.255  Mask:255.255.240.0

          inet6 addr: fe80::f816:3eff:fe10:84f/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:1224007 errors:0 dropped:3601 overruns:0 frame:0

          TX packets:719060 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:545013699 (545.0 MB)  TX bytes:56369645 (56.3 MB)

          Interrupt:11 Base address:0xa000

 

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:16436  Metric:1

          RX packets:1772357 errors:0 dropped:0 overruns:0 frame:0

          TX packets:1772357 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:1336393813 (1.3 GB)  TX bytes:1336393813 (1.3 GB)

 

qbr8f514403-0c Link encap:Ethernet  HWaddr de:a2:4b:f2:25:56 

          inet6 addr: fe80::dc94:ebff:fe68:ea07/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:132 errors:0 dropped:0 overruns:0 frame:0

          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:7612 (7.6 KB)  TX bytes:984 (984.0 B)

 

qbre932b629-3d Link encap:Ethernet  HWaddr b2:74:92:a7:e8:97 

          inet6 addr: fe80::d814:1dff:fe46:78c8/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:1326 errors:0 dropped:0 overruns:0 frame:0

          TX packets:640 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:406164 (406.1 KB)  TX bytes:54992 (54.9 KB)

 

qvb8f514403-0c Link encap:Ethernet  HWaddr de:a2:4b:f2:25:56 

          inet6 addr: fe80::dca2:4bff:fef2:2556/64 Scope:Link

          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1

          RX packets:43 errors:0 dropped:0 overruns:0 frame:0

          TX packets:180 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:6739 (6.7 KB)  TX bytes:16139 (16.1 KB)

 

qvbe932b629-3d Link encap:Ethernet  HWaddr b2:74:92:a7:e8:97 

          inet6 addr: fe80::b074:92ff:fea7:e897/64 Scope:Link

          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1

          RX packets:3981 errors:0 dropped:0 overruns:0 frame:0

          TX packets:5305 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:644013 (644.0 KB)  TX bytes:1079173 (1.0 MB)

 

qvo8f514403-0c Link encap:Ethernet  HWaddr 16:bb:6d:b6:28:b1 

          inet6 addr: fe80::14bb:6dff:feb6:28b1/64 Scope:Link

          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1

          RX packets:180 errors:0 dropped:0 overruns:0 frame:0

          TX packets:43 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:16139 (16.1 KB)  TX bytes:6739 (6.7 KB)

 

qvoe932b629-3d Link encap:Ethernet  HWaddr 8e:6f:45:a2:c7:b0 

          inet6 addr: fe80::8c6f:45ff:fea2:c7b0/64 Scope:Link

          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1

          RX packets:5305 errors:0 dropped:0 overruns:0 frame:0

          TX packets:3981 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:1079173 (1.0 MB)  TX bytes:644013 (644.0 KB)

 

virbr0    Link encap:Ethernet  HWaddr 32:de:0e:64:d7:39 

          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0

          UP BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

vnet0     Link encap:Ethernet  HWaddr fe:16:3e:cd:b9:90 

          inet6 addr: fe80::fc16:3eff:fecd:b990/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:4659 errors:0 dropped:0 overruns:0 frame:0

          TX packets:5308 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:500

          RX bytes:1049117 (1.0 MB)  TX bytes:1043423 (1.0 MB)

 

vnet1     Link encap:Ethernet  HWaddr fe:16:3e:f8:b3:48 

          inet6 addr: fe80::fc16:3eff:fef8:b348/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:162 errors:0 dropped:0 overruns:0 frame:0

          TX packets:184 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:500

          RX bytes:14971 (14.9 KB)  TX bytes:16677 (16.6 KB)

 


과연 어떤 문제 때문에 ping이 안 나가는 걸까? 궁금증을 뒤로 하고 또 다른 문제 발견~!!

그럼 해당 IP Floating IP를 줘 보자. 라는 생각이 문득 들어 Access & Security 메뉴로 이동~!! Floating IP를 하나 할당 받는다.



이번에는 할당받은 Floating IP를 인스턴스에 associate 해보자.


방금 생성한 인스턴스를 선택하고 Associate 버튼 클릭~!! ~ 아래와 같은 문구를 보여주고서는 할당 실패~!!


그래서 안되는가 보다하고 할당 받은 IP를 다시 Release하기로 결정~!! IP 선택하고 Release Floating IPs 클릭~!!


오 마이 갓~!! 아래와 같은 에러 메시지를 출력하고 죽어 버렸다.



더 이상한거 방금 할당 받은 Floating IP로는 ping이 아주 잘 나간다는 사실.. Instance에 할당이 되질 않는걸까?

# ping 174.24.4.228

PING 174.24.4.228 (174.24.4.228) 56(84) bytes of data.

64 bytes from 174.24.4.228: icmp_req=1 ttl=238 time=204 ms

64 bytes from 174.24.4.228: icmp_req=2 ttl=238 time=203 ms

64 bytes from 174.24.4.228: icmp_req=3 ttl=238 time=204 ms

64 bytes from 174.24.4.228: icmp_req=4 ttl=238 time=204 ms

^C

--- 174.24.4.228 ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 3003ms

rtt min/avg/max/mdev = 203.758/204.273/204.779/0.492 ms

 


아직까지는 Dashboard가 불안정하니, 그래서 이번에는 CLI 명령어로 직접 할당해 보기로 함.

우선 Quantum 명령어를 이용하여 port-list floatingip-list 확인

# quantum port-list

+--------------------------------------+------+-------------------+------------------------------------------------------------------------------------+

| id                                   | name | mac_address       | fixed_ips                                                                          |

+--------------------------------------+------+-------------------+------------------------------------------------------------------------------------+

| 152ee4eb-0bd6-4c58-ae82-868f91029ee8 |      | fa:16:3e:59:85:22 | {"subnet_id": "10f0d4ee-5077-45e3-9156-f97529120bbf", "ip_address": "192.168.0.2"} |

| 8f514403-0cdd-4391-bff2-7ce408b26655 |      | fa:16:3e:f8:b3:48 | {"subnet_id": "10f0d4ee-5077-45e3-9156-f97529120bbf", "ip_address": "192.168.0.3"} |

+--------------------------------------+------+-------------------+------------------------------------------------------------------------------------+

# quantum floatingip-list

+--------------------------------------+------------------+---------------------+---------+

| id                                   | fixed_ip_address | floating_ip_address | port_id |

+--------------------------------------+------------------+---------------------+---------+

| 7dafbf72-20ba-4a0a-90f8-d35d1a428adb |                  | 172.24.4.228        |         |

+--------------------------------------+------------------+---------------------+---------+

 


잘 할당이 되어 있다. 그럼, 인스턴스와 연결을 해보자. 공식은 다음과 같다.

floatingip-associate [floatingip ID] [port ID]

# quantum floatingip-associate 7dafbf72-20ba-4a0a-90f8-d35d1a428adb 8f514403-0cdd-4391-bff2-7ce408b26655

Could not find an external network gateway reachable from subnet 10f0d4ee-5077-45e3-9156-f97529120bbf.  Therefore, cannot associate Port 8f514403-0cdd-4391-bff2-7ce408b26655 with a Floating IP.

역시 위와 같은 에러 메시지를 보여주고서는 할당이 안 된다. 멘붕상태돌입..

 


이와 같은 문제를 접하고서 계속 인터넷과 커뮤니티의 소소 몇몇 회원들을 괴롭혔다. 그런데 특정 에러 메시지로는 이런 현상을 설명하기에는 역 부족 이였다. 그래서 문서로 작성하기로 했다. 그림과 함께 작성하면 좀 더 이해하기 쉽지 않을까?

분명히 다른 사람들도 이런 경험을 했으리라 생각한다. 네트워크에 대해 아주 잘 아는 사람들이 있다면 누가 좀 도와주기를 간절히 희망해 본다.


저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.11.07 17:08

몇일동안 OpenStack 과 씨름을 하면서 얻은 경험과 문제를 해결하기 위해서 반복했던 실수와 해결 과정들을 여러분들과 함께 공유하기로 했습니다. 그 이유는 저 또한 많은 분들이 이미 경험했던 것들을 받았기 때문입니다. 


그럼 지금부터 운영 중인 OpenStack에 Compute Node를 추가하기 위해 어떻게 했었는지 좌충우돌 그 경험담을 여러분께 들려드리고자 합니다. 




클라우드 노드에 생성된 VM 인스턴스가 인터넷이 되지 않는다는 사실을 알았을 때 문득 이런 생각이 들었다. 그러면 Master Server 즉 클라우드 노드를 다른 노드로 변경하면 되지 않을까? 하는 생각이 문득 스치고 지나갔다. 그래서, 남은 마지막 서버에다가 OpenStack 클라우드 서버를 설치하기로 하였다. 결과는 로컬의 Proxy Server에 연결을 실패하여 설치 실패~!!


그럼 이번에는 컴퓨트 노드로 설치해 보자~!! 그리고 다시 도전~!! 결과는 역시 또 실패~!! 이유는 같은 이유였다. 로컬의 Proxy Server에 연결을 할 수 없어서,…


다음과 같은 로그를 남기고 설치 중단~!!

+ screen -S stack -p n-api -X stuff 'cd /opt/stack/nova && /usr/local/bin/nova-api^M'

+ echo 'Waiting for nova-api to start...'

Waiting for nova-api to start...

+ timeout 60 sh -c 'while ! http_proxy= wget -q -O- http://127.0.0.1:8774; do sleep 1; done'

+ echo 'nova-api did not start'

nova-api did not start

+ exit 1

+ clean

+ local r=1

++ jobs -p

+ kill

+ exit 1

 

그럼, nova-api를 시작할 때 어떤 문제가 발생하길래 오류가 난 걸일까? 하고 screen 로그 분석~!

cd /opt/stack/nova && /opt/stack/nova/bin/nova-api

2012-11-06 16:59:56 16224 DEBUG nova.wsgi [-] Loading app ec2 from /etc/nova/api-paste.ini load_app /opt/stack/nova/nova/wsgi.py:383

2012-11-06 16:59:56 16224 CRITICAL nova [-] No module named api

2012-11-06 16:59:56 16224 TRACE nova Traceback (most recent call last):

2012-11-06 16:59:56 16224 TRACE nova   File "/opt/stack/nova/bin/nova-api", line 50, in <module>

2012-11-06 16:59:56 16224 TRACE nova     server = service.WSGIService(api)

2012-11-06 16:59:56 16224 TRACE nova   File "/opt/stack/nova/nova/service.py", line 570, in __init__

2012-11-06 16:59:56 16224 TRACE nova     self.app = self.loader.load_app(name)

2012-11-06 16:59:56 16224 TRACE nova   File "/opt/stack/nova/nova/wsgi.py", line 384, in load_app

2012-11-06 16:59:56 16224 TRACE nova     return deploy.loadapp("config:%s" % self.config_path, name=name)

중간 생략 …

2012-11-06 16:59:56 16224 TRACE nova     return import_class(import_str)(*args, **kwargs)

2012-11-06 16:59:56 16224 TRACE nova   File "/opt/stack/nova/nova/api/ec2/cloud.py", line 186, in __init__

2012-11-06 16:59:56 16224 TRACE nova     self.volume_api = volume.API()

2012-11-06 16:59:56 16224 TRACE nova   File "/opt/stack/nova/nova/volume/__init__.py", line 27, in API

2012-11-06 16:59:56 16224 TRACE nova     cls = importutils.import_class(nova.flags.FLAGS.volume_api_class)

2012-11-06 16:59:56 16224 TRACE nova   File "/opt/stack/nova/nova/openstack/common/importutils.py", line 30, in import_class

2012-11-06 16:59:56 16224 TRACE nova     __import__(mod_str)

2012-11-06 16:59:56 16224 TRACE nova ImportError: No module named api

2012-11-06 16:59:56 16224 TRACE nova

 

그럼 github에 있는 Nova 소스를 살펴봐야겠다는 생각이 문득.. 그래서 살펴보았다.



내가 OpenStack을 설치했던 건 10 8일에서 9~!! 현재 한달이 지났다. 그런데, github에 있는 Nova 소스는 한시간 전에 업데이트가 일어났다. 그러면 기존에 설치했던 Nova 소스와 현재 다운받아서 설치한 Nova 소스는 버전이 다르며, 현재 Nova 소스에 버그가 있을수도 있다.


그리하여, 기존에 오픈스택 컴퓨트가 설치되어 있는 컴퓨터 노드의 소스를 복사하기로 결정!!


우선, tar를 이용하여 기존에 Compute Node /opt/stack/ 폴더에 있는 Nova 관련 소스들을 모두 묶는다. 이때, backup 폴더를 하나 생성하여 tar로 묶은 파일들을 한군데에 모아놓으면 다음에 사용할 때 편하다.

$ mkdir backup

$ tar cvf backup/glance.tar glance

$ tar cvf backup/keystone.tar keystone

$ tar cvf backup/nova.tar nova

$ tar cvf backup/python-glanceclient.tar python-glanceclient

$ tar cvf backup/python-keystoneclient.tar python-keystoneclient

$ tar cvf backup/python-novaclient.tar python-novaclient

$ tar cvf backup/python-openstackclient.tar python-openstackclient

 

tar로 묶인 압축파일들을 설치하고자 하는 서버로 보낸다.

$ scp *.tar stack@openstack04:/opt/stack/backup

glance.tar                                                                100% 9260KB   9.0MB/s   00:00

keystone.tar                                                             100%   13MB  12.7MB/s   00:01

nova.tar                                                                   100%  126MB  41.9MB/s   00:03

python-glanceclient.tar                                              100%  630KB 630.0KB/s   00:00

python-keystoneclient.tar                                           100%  780KB 780.0KB/s   00:00

python-novaclient.tar                                                 100% 1540KB   1.5MB/s   00:00

python-openstackclient.tar                                         100%  390KB 390.0KB/s   00:00

 

전송이 완료되면 해당 서버로 가서 다시 tar를 이용해 압축된 소스를 푼다.

$ tar xvf glance.tar

$ tar xvf keystone.tar

$ tar xvf nova.tar

$ tar xvf python-glanceclient.tar

$ tar xvf python-keystoneclient.tar

$ tar xvf python-novaclient.tar

$ tar xvf python-openstackclient.tar

$ mv *.tar /opt/stack

 


그럼 다시 devstack 폴더로 이동하여 서비스를 재 설치하거나 재 시작한다. 나는 재 시작하였다.

$ ./restart_stack.sh

 

재시작이 완료되었으면 이제 nova-manage를 통하여 service가 정상적으로 동작하는지 확인해 본다. 역시나 서비스는 확인 안되고, 오류들만 잔뜩~~~ 보인다.

다시 삽질시작.. 뭐가 문제일까? 모르겠다. 오픈스택 커뮤니티로 다시 질문~!! 누군가는 이런 경험이 있겠지누군가가 답변을 올렸다. 확인.. nova.conf를 보면 된다. 그래서 /etc/nova/nova.conf 확인~!!

$ cat nova.conf

[DEFAULT]

... 중간 생략 ...

osapi_compute_extension=nova.api.openstack.compute.contrib.standard_extensions

my_ip=10.10.10.4

sql_connection=

libvirt_type=kvm

libvirt_cpu_mode=none

instance_name_template=instance-%08x

…. 이하 생략 …

sql_connection에 값이 빠져있는걸 발견~!! 저거다.. 바로 다른 컴퓨터 노드의 nova.conf를 보고 복사해서 붙여넣기를 실행한다.

$ cat nova.conf

[DEFAULT]

... 중간 생략 ...

osapi_compute_extension=nova.api.openstack.compute.contrib.standard_extensions

my_ip=10.10.10.4

sql_connection=mysql://root:mypassword@www.host.co.kr/nova?charset=utf8

libvirt_type=kvm

libvirt_cpu_mode=none

instance_name_template=instance-%08x

이하 생략 …

 

이제 다시 서비스를 재 시작한다.

$ ./restart_stack.sh

 

nova-manage를 활용하여 서비스가 정상적으로 돌고 있는지 확인해 본다.

$ nova-manage service list

2012-11-07 16:30:21 DEBUG nova.utils [req-fdc0c17c-4048-4038-b0cb-5f1e3874fb6c None None] backend <module 'nova.db.sqlalchemy.api' from '/opt/stack/nova/nova/db/sqlalchemy/api.pyc'> from (pid=20778) __get_backend /opt/stack/nova/nova/utils.py:502

Binary           Host                                 Zone             Status     State Updated_At

nova-compute     openstack01                          nova             enabled    :-)   2012-11-07 07:30:17

nova-cert        openstack01                          nova             enabled    :-)   2012-11-07 07:30:18

nova-scheduler   openstack01                          nova             enabled    :-)   2012-11-07 07:30:20

nova-network     openstack01                          nova             enabled    :-)   2012-11-07 07:30:13

nova-consoleauth openstack01                          nova             enabled    :-)   2012-11-07 07:30:15

nova-volume      openstack01                          nova             enabled    :-)   2012-11-07 07:30:13

nova-compute     openstack02                          nova             enabled    :-)   2012-11-07 07:30:32

nova-network     openstack02                          nova             enabled    :-)   2012-11-07 07:30:28

nova-volume      openstack02                          nova             enabled    XXX   2012-10-21 00:12:02

nova-compute     openstack03                          nova             enabled    :-)   2012-11-07 07:30:50

nova-network     openstack03                          nova             enabled    :-)   2012-11-07 07:30:43

nova-volume      openstack03                          nova             enabled    XXX   2012-10-21 00:12:12

nova-compute     openstack04                          nova             enabled    :-)   2012-11-07 07:30:17

nova-network     openstack04                          nova             enabled    :-)   2012-11-07 07:30:13

nova-volume      openstack04                          nova             enabled    :-)   2012-11-07 07:30:14

 

잘 돌아간다. 드디어, 운영 중인 OpenStack Compute Node 추가 완료~!!

알면 쉽지만, 모르면 이렇게 삽질해야 한다. 이제 또 이런 일이 발생하게 되면 그때는 삽질을 하지 않겠지… 



** Tip **

이번 삽질을 통해 또 다시 배운 것 하나 더 팁으로 DevStack 설치를 레파지토리를 지정하는 곳이 있다. 그런 것도 있었어?? 다시 github에 가서 확인~!! 정말 있다.


그럼 devstack에서는 어디에서 레파지토리를 지정하는 거지?? stackrc에 있다.

# stackrc

#

중간 생략

# Repositories

# ------------

 

# Base GIT Repo URL

# Another option is http://review.openstack.org/p

GIT_BASE=https://github.com

 

# metering service

CEILOMETER_REPO=https://github.com/stackforge/ceilometer.git

CEILOMETER_BRANCH=master

 

# volume service

CINDER_REPO=${GIT_BASE}/openstack/cinder

CINDER_BRANCH=master

 

# volume client

CINDERCLIENT_REPO=${GIT_BASE}/openstack/python-cinderclient

CINDERCLIENT_BRANCH=master

 

# compute service

NOVA_REPO=${GIT_BASE}/openstack/nova.git

NOVA_BRANCH=master

이하 생략

 

이번 작업을 통해서 정말 많은 것들을 배웠다. 이렇게 무식할 수가~!!

다음에는 이런일이 일어나지 않겠지~ 대신 새로운 모르는 다른 일이 날 기다리고 있을 것이다.


모르는 걸을 챙피해 하거나 두려워 하지 말자~! 

새로운 것을 배울수 있는 좋은 기회라고 생각하자

공부하고, 배우면 나도 할 수 있다.




저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.10.23 14:51

요즘 Openstack을 설치하고, 운영하면서 Glance라는 녀석과 매일 싸우고 있다. 그러면서, 자연스럽게 Glance 명령어 옵션에는 무엇이 있을까? 라는 의문을 갖게 되고, 관련된 문서를 찾아보고 하면서 알게된 Glance 명령어 옵션들을 정리해 보았다. Openstack을 운영하거나 스터디하는 사람들에게 도움이 되길 바라며서 블로그에 자료를 공유한다. 


glance --help를 입력하면 아래와 같은 glance 명령어 옵션을 확인할 수 있다. 나는 아래에 있는 이 명령어 옵션들에 대한 사용법은 어떤 것이고, 더 입력해야할 파라메터는 어떤것들이 있는지, 그리고, 사용 예제까지 아주 꼼꼼하게 분석해 보았다.


** Glance 명령어 옵션

add                 DEPRECATED! Use image-create instead.

    clear               DEPRECATED!

    delete              DEPRECATED! Use image-delete instead.

    details             DEPRECATED! Use image-list instead.

    image-create        Create a new image.

    image-delete        Delete a specific image.

    image-download      Download a specific image.

    image-list          List images you can access.

    image-members       DEPRECATED! Use member-list instead.

    image-show          Describe a specific image.

    image-update        Update a specific image.

    index               DEPRECATED! Use image-list instead.

    member-add          DEPRECATED! Use member-create instead.

    member-create       Share a specific image with a tenant.

    member-delete       Remove a shared image from a tenant.

    member-images       DEPRECATED! Use member-list instead.

    member-list         Describe sharing permissions by image or tenant.

    members-replace     DEPRECATED!

    show                DEPRECATED! Use image-show instead.

    update              DEPRECATED! Use image-update instead.

    help                Display help about this program or one of its

                        subcommands.

 

Add : image-create와 같은 명령어로 Glance 저장공간으로 이미지를 추가한다.

-      공식

$ glance add name=”{image name}” is_public=true container_format={container format} disk_format={disk format} < {image file name}

 

-      파라메터 설명

{image name}

사용자가 식별하기 쉬운 OS Image명을 입력한다.

{container format}

Container format에는 ari, ami, aki, bare가 있으며, ari RAMDISK, ami KERNEL, aki RamDisk Kernel 을 가지고 있는 image 를 올릴 때 사용한다. 대표적인 Linux OS cirros가 있다. kernel이나 ramdisk가 없는 일반 img 파일은 모두 bare로 입력하면 된다.

{disk format}

Disk format역시 ari, ami, aki가 있으며, 이외에 확장자에 따라 img파일은 raw, qcow2 파일은 qcow2 로 표현한다.

{image file name}

업로드 할 OS Image 명을 입력하면 된다. 단 업로드 할 이미지는 현재 실행디렉토리에 있어야만 한다. 만일 다른 디렉토리에 이미지가 있다면 해당 경로를 전부 써 주어야 한다.

 

-      예제

$ glance add name=”Ubuntu 12.04 LTS” is_public=true container_format=bare  disk_format=raw < ubuntu-12.04-server-cloudimg-amd64-disk1.img

Added new image with ID : ca5b58ac-e97c-437c-b06e-f195159ab475


 

Clear : glance 저장공간에 업로드 되어 있는 모든 image를 삭제한다.

-      공식

$ glance clear

Deleting image 0449eee2-8081-48a8-a7b3-ae679dee1b57 “cirros-0.3.0-x86_64-uec-ramdisk” … done

Completed in 0.0328 sec.

 

 

Delete : 특정 이미지를 삭제할 경우 delete 명령을 사용하는데 image-delete와 같다.

-      공식

$ glance delete {image id}

 

-      파라메터 설명

{image id}

glance image-list에서 조회되는 ID를 입력하면 된다.

 

-      예제

$ glance delete ca5b58ac-e97c-437c-b06e-f195159ab475

Deleted image ca5b58ac-e97c-437c-b06e-f195159ab475

 

 

Details : glance 저장공간에 업로드 되어 있는 모든 image의 상세정보를 확인할 수 있다.

-      공식 및 예제

$ glance details

====================================================================

URI: http://211.111.174.182:9292/v1/images/ca5b58ac-e97c-437c-b06e-f195159ab475

Id: ca5b58ac-e97c-437c-b06e-f195159ab475

Public: Yes

Protected: No

Name: Ubuntu 12.04 LTS

Status: active

Size: 226426880

Disk format: qcow2

Container format: ovf

Minimum Ram Required (MB): 0

Minimum Disk Required (GB): 0

Owner: 8855a00a79414352bc033697e6ccd2e8

Created at: 2012-10-09T08:34:05

Deleted at: None

Updated at: 2012-10-09T08:34:07

====================================================================

 


 

Image-create : glance 저장공간으로 이미지를 추가한다.

-      공식

$ glance image-create –name ”{image name}” --public --container_format {container format}  --disk_format {disk format} < {image file name}

 

-      파라메터 설명 : 파라메터는 add 명령어의 파라메터와 같으므로 생략~!

 

-      예제

$ glance image-create –name ”Ubuntu 12.04 LST” --public --container_format bare --disk_format raw < ubuntu-12.04-server-cloudimg-amd64-disk1.img

+------------------+--------------------------------------+

| Property         | Value                                |

+------------------+--------------------------------------+

| checksum         | 44e30efc9e9450b39eea0a42ecd44c7a     |

| container_format | bare                                 |

| created_at       | 2012-09-27T04:59:49                  |

| deleted          | False                                |

| deleted_at       | None                                 |

| disk_format      | raw                                  |

| id               | c01e2c2e-5d4d-4a03-a76e-ada8622fa414 |

| is_public        | True                                 |

| min_disk         | 0                                    |

| min_ram          | 0                                    |

| name             | Ubuntu 12.04 LTS                     |

| owner            | 4aafa99227af447d9041ff38a3c1e687     |

| protected        | False                                |

| size             | 219340260                            |

| status           | active                               |

| updated_at       | 2012-09-27T04:59:51                  |

+------------------+--------------------------------------+

 

 

Image-delete : 위에서 살펴본 delete 명령어와 같이 특정 이미지를 삭제한다.

-      예제

$ glance image-delete ca5b58ac-e97c-437c-b06e-f195159ab475

Deleted image ca5b58ac-e97c-437c-b06e-f195159ab475

 

 

Image-download : Help에는 특정이미지 파일을 로컬 폴더로 다운로드 받는다고 나오나 아직은 제대로 구현이 되어 있지 않으므로 실행하지 않길 바란다.

-      공식

$ glance image-download {image id}

 

-      파라메터 설명

{image id}

glance image-list에서 조회되는 ID를 입력하면 된다.

 

 

Image-list : glance 저장공간에 업로드 되어 있는 모든 이미지 목록을 보여준다.

-      공식 및 예제

$ glance image-list

+--------------------------------------+---------------------------------+-------------+------------------+-----------++

| ID                                   | Name                            | Disk Format | Container Format | Size      ||

+--------------------------------------+---------------------------------+-------------+------------------+-----------++

| 0449eee2-8081-48a8-a7b3-ae679dee1b57 | cirros-0.3.0-x86_64-uec-ramdisk | ari         | ari              | 2254249   ||

| a9aa8c3d-c6d8-472a-b76e-33bdfb7ee038 | cirros-0.3.0-x86_64-uec         | ami         | ami              | 25165824  ||

| c6c42034-370a-488a-a08d-83ef1713b5f4 | cirros-0.3.0-x86_64-uec-kernel  | aki         | aki              | 4731440   ||

| ca5b58ac-e97c-437c-b06e-f195159ab475 | Ubuntu 12.04 LTS                | qcow2       | ovf              | 226426880 ||

+--------------------------------------+---------------------------------+-------------+------------------+-----------++

 

 

Image-members : 특정 이미지를 쉐어한 User가 누구인지를 확인할 수 있다.

-      공식 

$ glance image-members {image id}

 

-      파라메터 설명

{image id}

glance image-list에서 조회되는 ID를 입력하면 된다.


       -      예제

$ glance image-members ca5b58ac-e97c-437c-b06e-f195159ab475

admin

nalee



Image-show : 특정 이미지의 상세정보를 확인할 수 있다.

-      공식

$ glance image-show {image id}

 

-      파라메터 설명

{image id}

glance image-list에서 조회되는 ID를 입력하면 된다.

 

-      예제

$ glance image-show a9aa8c3d-c6d8-472a-b76e-33bdfb7ee038

+-----------------------+--------------------------------------+

| Property              | Value                                |

+-----------------------+--------------------------------------+

| Property 'kernel_id'  | c6c42034-370a-488a-a08d-83ef1713b5f4 |

| Property 'ramdisk_id' | 0449eee2-8081-48a8-a7b3-ae679dee1b57 |

| checksum              | 2f81976cae15c16ef0010c51e3a6c163     |

| container_format      | ami                                  |

| created_at            | 2012-10-09T08:23:22                  |

| deleted               | False                                |

| disk_format           | ami                                  |

| id                    | a9aa8c3d-c6d8-472a-b76e-33bdfb7ee038 |

| is_public             | True                                 |

| min_disk              | 0                                    |

| min_ram               | 0                                    |

| name                  | cirros-0.3.0-x86_64-uec              |

| owner                 | 8855a00a79414352bc033697e6ccd2e8     |

| protected             | False                                |

| size                  | 25165824                             |

| status                | active                               |

| updated_at            | 2012-10-09T08:23:23                  |

+-----------------------+--------------------------------------+

 

 

Image-update : 이 명령어를 이용하면 특정 이미지의 정보나 이미지 파일을 다른 파일로 변경할 수 있다.

-      공식

$ glance image-update [--name <NAME>] [--disk-format <CONTAINER_FORMAT>]

                           [--container-format <DISK_FORMAT>]

                           [--owner <TENANT_ID>] [--size <SIZE>]

                           [--min-disk <DISK_GB>] [--min-ram <DISK_RAM>]

                           [--location <IMAGE_URL>] [--file <FILE>]

                           [--checksum <CHECKSUM>] [--copy-from <IMAGE_URL>]

                           [--is-public IS_PUBLIC]

                           [--is-protected IS_PROTECTED]

                           [--property <key=value>] [--purge-props]

                           <IMAGE_ID>

 

-      파라메터 설명

[--name <NAME>]

사용자가 식별하기 쉬운 OS Image명을 입력한다.

[--container-format <CONTAINER_FORMAT>]

Container format에는 ari, ami, aki, bare가 있으며, ari RAMDISK, ami KERNEL, aki RamDisk Kernel 을 가지고 있는 image 를 올릴 때 사용한다. 대표적인 Linux OS cirros가 있다. kernel이나 ramdisk가 없는 일반 img 파일은 모두 bare로 입력하면 된다.

[--container-format <DISK_FORMAT>]

Disk format역시 ari, ami, aki가 있으며, 이외에 확장자에 따라 img파일은 raw, qcow2 파일은 qcow2 로 표현한다.

[--owner <TENANT_ID>]

해당 이미지의 member id를 입력한다. 하지만 대체적으로는 생략한다.

[--size <SIZE>]

이미지 사이즈 정보로 생략한다.

[--min-disk <DISK_GB>]

최소사양의 DISK 사이즈를 GB단위로 입력한다.

[--min-ram <DISK_RAM>]

최소사양의 RAM 사이즈를 입력한다.

[--location <IMAGE_URL>]

업로드하고자 하는 원격이미지 웹 URL을 입력한다.

[--file <FILE>]

업로드하고자 하는 파일이 로컬에 있을 경우 해당 이미지 파일명을 입력한다.

[--checksum <CHECKSUM>]

Checksum을 입력하는데 대체적으로 생략한다.

[--copy-from <IMAGE_URL>]

Location과 같이 원격 이미지 웹 URL을 입력한다.

[--is-public IS_PUBLIC]

이미지를 공개한다는 뜻이다.

[--is-protected IS_PROTECTED]

같은 tenant member에게만 이미지를 공개한다는 뜻이다.

[--property <key=value>]

RamDisk 파일과 Kernel 파일이 있을 경우 속성으로 그 값을 입력한다.

ex) --property kernel_id=7edc921d-53d9-4fa2-9a9d-31cad37de01f

[--purge-props]

다른 속성값이 있으면 계속 속성을 입력한다.

<IMAGE_ID>

변경하고자 하는 image id를 입력한다.

 

Index : index 명령어 역시 image-list와 같은 역할을 하며 다음과 같은 정보를 확인할 수 있다.

$ glance index

ID                                   Name                           Disk Format          Container Format     Size         

------------------------------------ ------------------------------ -------------------- -------------------- --------------

ca5b58ac-e97c-437c-b06e-f195159ab475 Ubuntu 12.04 LTS               qcow2                ovf                       226426880

a9aa8c3d-c6d8-472a-b76e-33bdfb7ee038 cirros-0.3.0-x86_64-uec        ami                  ami                        25165824

0449eee2-8081-48a8-a7b3-ae679dee1b57 cirros-0.3.0-x86_64-uec-ramdis ari                  ari                         2254249

c6c42034-370a-488a-a08d-83ef1713b5f4 cirros-0.3.0-x86_64-uec-kernel aki                  aki                         4731440

 

 

Member-add : member를 추가시키는 명령어로 member-create 와 같은 명령어이다.

-      공식

$ glance member-add [--can-share] image_id member_id

 

-      파라메터 설명

image_id

멤버를 추가하고자 하는 이미지 id를 입력한다.

member_id

추가하고자 하는 tenant 명을 입력한다.

[--can-share]

해당 옵션을 넣은 사용자는 이미지를 쉐어할 수 있다.

 

-      예제

$ glance member-add ca5b58ac-e97c-437c-b06e-f195159ab475 nalee

 

 

Member-create : member-add와 같은 명령어이다.

-      공식

$ glance member-create [--can-share] <IMAGE_ID> <TENANT_ID>

 

-      파라메터 설명

<IMAGE_ID>

멤버를 추가하고자 하는 이미지 id를 입력한다.

<TENANT_ID>

추가하고자 하는 tenant 명을 입력한다.

[--can-share]

해당 옵션을 넣은 사용자는 이미지를 쉐어할 수 있다.

 

-      예제

$ glance member-create ca5b58ac-e97c-437c-b06e-f195159ab475 admin

 

Member-delete : 특정 이미지의 특정 사용자를 삭제할 때 사용하는 명령어이다.

-      공식

$ glance member-delete <IMAGE_ID> <TENANT_ID>

 

-      파라메터 설명

<IMAGE_ID>

삭제하고자 하는 이미지 id를 입력한다.

<TENANT_ID>

삭제하고자 하는 tenant 명을 입력한다.

 

-      예제

$ glance member-images <member-id>

 

 

Member-images : 특정 사용자만 사용할 수 있는 이미지 목록을 보여준다.

-      공식

$ glance member-images <member-id>

 

-      파라메터 설명

<member_id>

검색하고자 하는 tenant 명을 입력한다.

 

-      예제

$ glance member-images admin

ca5b58ac-e97c-437c-b06e-f195159ab475

 

 

Member-list : 특정 이미지나 특정 사용자의 이미지 목록을 보여준다.

-      공식

$ glance member-list -–image-id <IMAGE_ID> or -–member-id <TENANT_ID>

 

-      파라메터 설명

<IMAGE_ID>

검색하고자 하는 이미지 id를 입력한다.

<TENANT_ID>

검색하고자 하는 tenant 명을 입력한다.

 

-      예제

$ glance member-list --image-id ca5b58ac-e97c-437c-b06e-f195159ab475

+--------------------------------------+-----------+-----------+

| Image ID                             | Member ID | Can Share |

+--------------------------------------+-----------+-----------+

| ca5b58ac-e97c-437c-b06e-f195159ab475 | admin     |           |

| ca5b58ac-e97c-437c-b06e-f195159ab475 | nalee     |           |

+--------------------------------------+-----------+-----------+


    

Members-replace : 본 명령어를 통해 해당 이미지의 사용자 정보 중 이미지 쉐어 여부를 수정할 수 있다고 Help 명령어에는 나오나 직접 실행을 해 보면 이 명령어는 사라지고 없음을 바로 확인할 수 있다.

 

 

Show : 특정 이미지의 상세 정보를 확인할 수 있는 명령어로 image-show와 같은 역할을 한다.

-      공식

$ glance show <IMAGE_ID>

 

-      예제

$ glance show ca5b58ac-e97c-437c-b06e-f195159ab475

URI: http://211.111.174.182:9292/v1/images/ca5b58ac-e97c-437c-b06e-f195159ab475

Id: ca5b58ac-e97c-437c-b06e-f195159ab475

Public: No

Protected: No

Name: Ubuntu 12.04 LTS

Status: active

Size: 226426880

Disk format: qcow2

Container format: ovf

Minimum Ram Required (MB): 0

Minimum Disk Required (GB): 0

Owner: 8855a00a79414352bc033697e6ccd2e8

Created at: 2012-10-09T08:34:05

Updated at: 2012-10-23T02:42:29

 

 

Update : image-update와 같은 명령어로 특정 이미지의 메타정보나 이미지 파일을 변경할 때 사용하는 명령어이다.

-      공식

$ glance update <IMAGE_ID>

 

-      예제

$ glance -v update ca5b58ac-e97c-437c-b06e-f195159ab475 is_public=true

Updated image ca5b58ac-e97c-437c-b06e-f195159ab475

Updated image metadata for image ca5b58ac-e97c-437c-b06e-f195159ab475:

URI: http://211.111.174.182:9292/v1/images/ca5b58ac-e97c-437c-b06e-f195159ab475

Id: ca5b58ac-e97c-437c-b06e-f195159ab475

Public: Yes

Protected: No

Name: Ubuntu 12.04 LTS

Status: active

Size: 226426880

Disk format: qcow2

Container format: ovf

Minimum Ram Required (MB): 0

Minimum Disk Required (GB): 0

Owner: 8855a00a79414352bc033697e6ccd2e8

Created at: 2012-10-09T08:34:05

Deleted at: None

Updated at: 2012-10-23T05:46:53

 


Help : 명령어 옵션의 상세 설명 또는 들어가야 할 파라메터 정보등을 알려준다.

-      예제

$ glance help image-create

usage: glance image-create [--id <IMAGE_ID>] [--name <NAME>]

                           [--disk-format <DISK_FORMAT>]

                           [--container-format <CONTAINER_FORMAT>]

                           [--owner <TENANT_ID>] [--size <SIZE>]

                           [--min-disk <DISK_GB>] [--min-ram <DISK_RAM>]

                           [--location <IMAGE_URL>] [--file <FILE>]

                           [--checksum <CHECKSUM>] [--copy-from <IMAGE_URL>]

                           [--is-public IS_PUBLIC]

                           [--is-protected IS_PROTECTED]

                           [--property <key=value>]

 

Create a new image.

 

Optional arguments:

  --id <IMAGE_ID>       ID of image to reserve.

  --name <NAME>         Name of image.

  --disk-format <DISK_FORMAT>

                        Disk format of image.

  --container-format <CONTAINER_FORMAT>

                        Container format of image.

  --owner <TENANT_ID>   Tenant who should own image.

  --size <SIZE>         Size of image data (in bytes). Only used with '--

                        location' and '--copy_from'.

  --min-disk <DISK_GB>  Minimum size of disk needed to boot image (in

                        gigabytes).

  --min-ram <DISK_RAM>  Minimum amount of ram needed to boot image (in

                        megabytes).

  --location <IMAGE_URL>

                        URL where the data for this image already resides. For

                        example, if the image data is stored in the filesystem

                        local to the glance server at

                        '/usr/share/image.tar.gz', you would specify

                        'file:///usr/share/image.tar.gz'.

  --file <FILE>         Local file that contains disk image to be uploaded

                        during creation. Alternatively, images can be passed

                        to the client via stdin.

  --checksum <CHECKSUM>

                        Hash of image data used Glance can use for

                        verification.

  --copy-from <IMAGE_URL>

                        Similar to '--location' in usage, but this indicates

                        that the Glance server should immediately copy the

                        data and store it in its configured image store.

  --is-public IS_PUBLIC

                        Make image accessible to the public.

  --is-protected IS_PROTECTED

                        Prevent image from being deleted.

  --property <key=value>

                        Arbitrary property to associate with image. May be

                        used multiple times.

 

 

 

** Glance Help의 명령어를 보면 DEPRECATED! 라고 써있는 명령어 옵션을 볼 수 있을 것이다.이 말 뜻은 곧 폐지될 예정이므로, 그 옆에 나와있는 명령어 옵션을 쓰길 권고한다.”는 뜻이다.

 

 

 

참조 URL : http://docs.openstack.org/developer/glance/glance.html


저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.07.24 09:56

지난 포스팅에 이어 이번에는 인스턴스 생성 및 기타에 대해서 올리도록 하겠습니다.


그럼 이제 인스턴스를 한번 생성해 볼까요?


  • 우선 키페어를 생성합니다.


  • 키페어를 생성하고 나면 인스턴스 화면으로 넘어와 인스턴스 생성 버튼을 클릭합니다. 그러면 아래와 같이 운영체제를 선택하면 팝업창이 뜹니다. 그러면 생성하고자 하는 운영체제를 선택한 후 Select 버튼을 클릭합니다.


  • 그 다음에는 인스턴스 정보, Root 비밀번호, 키페어 이름, 보안 그룹을 선택하고 서버 종류를 선택한 후 계속 버튼을 클릭합니다.


  • 이렇게 하고 나면 다음과 같이 내 인스턴스 목록에서 내가 생성한 인스턴스가 뜹니다. 인스턴스를 선택하면 인스턴스의 상세 정보들을 확인 할 수 있습니다.


  • 생성이 완료되었으면 인스턴스 동작를 클릭한 후 접속 버튼을 클릭하면 noVNC 콘솔로 방금 생성한 우분투 리눅스가 올라오는 것을 확인하실 수 있습니다.



이렇게해서 ixCloud에서 인스턴스를 생성해 보았습니다. OpenStack의 데쉬보드 기능들을 좀 더 사용하기 편리하게

정재해 놓은 듯 하며, 기능은 거의 같아 보입니다.






저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.07.24 09:27

얼마전에 KINX의 ixCloud가 오픈을 하였습니다. 

그런데 Homepage에 들어가서 보시면 OpenStack를 기반으로 클라우드를 제공한다고 합니다.

Beta 테스트 기간이고 해서 제가 한번 사용을 해 보았습니다. 그리고 여러분들께 공개해 드립니다.



우선 ixcloud.net에 들어가서 서비스 특징을 보면 2.OpenStack 기반의 클라우드 환경이라는 문구가 보이실 껍니다.



그럼 회원 가입을 해 보도록 하겠습니다.

로그인을 클릭하면 회원 가입을 하실 수 있습니다.



회원 가입을 한 후 로그인을 하면 ixCloud Dashboard, 서비스 이용현황, 서비스 이용 리포트, 사용자 정보 관리를 확인할 수 있습니다.



그럼 이제 Dashboard를 한번 들어가 볼까요? 아래와 같이 아주 심플하게 생겼습니다.

그럼 이제 인스턴스를 생성해 봐야겠죠~!!! 그럼 다음 포스팅에서 인스턴스 생성 및 기타를 올리도록 하겠습니다.

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.06.28 19:34

안녕하세요~!!

오랜만에 블로그에 글을 올리는 것 같습니다. 그동안 너무 바뻐서, 글을 쓸 시간도 없었던거 같습니다.


오늘은 OpenStack Swift의 Ring 구조에 대해 살펴보도록 하겠습니다. 

그리고, 그동안 연구했던 Swift의 구조 및 Ring 구조를 그림으로 표현해 보았습니다.


Ring은 아래 그림과 같은 구조로 구성이 되어 있으며, Proxy Node에서 swift-ring-builder 명령어에 의해 생성 및 정의되어 각 Storage Node들로 복사가 됩니다. Ring Builder 파일에는 build version, partition count, replica count, zone count, device count 등의 내용이 요약되어 있습니다.

 

ID : 디바이스를 구분하기 위한 번호

Zone Number : 해당하는 Zone  Number

IP : 해당하는 Storage Node IP 주소

Port : 해당하는 Storage Node Port 주소

(Account-Server : 6002, Container-Server : 6001, Object-Server : 6000)

Device Name : 해당하는 Storage Node의 접근한 폴더 이름

Weight : 디바이스의 비중

Meta : 디바이스에 추가적으로 입력할 내용





저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
Java2012.03.06 15:05
Java에서 Rest API로 가장 많이 사용하는 것은 Apache CXF이다. CXF는 Server모듈을 만들수 있고, 쉽게 client 프로그래밍을 할 수 있다. 그런데 Java가 아닌 다른 언어로 제공되는 Rest를 사용할 경우, 다른 서버의 url을 바로 호출할 경우 사용 할수 있는 것이 바로  HttpClient이다.

HttpClient 객체에는 HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete가 있는데, 이 메소드들은 Android에서도 많이 사용되고 있는 통신 방법이다. 어떻게 보면 CXF Restful과도 같아 보인다.

- HttpGet : 데이터를 조회할 때 주로 사용한다.
- HttpHead : 조회하고자 하는 데이터의 메타데이터나 인증정보, 혹은 세션값을 확인 할 때 사용한다.
- HttpPost : 데이터의 메타데이터 등을 수정할 때 사용한다.
- HttpPut : 새로운 데이터를 생성할 때 사용한다.
- HttpDelete : 데이터 삭제시 사용하는 메소드이다.
 
그럼 이제 OpenStack Swift Client Java API 예제와 함께 자주 사용하는 HttpClient 메소드들을 알아보도록 하자.

** 아래 예제 샘플은  http://wiki.openstack.org/SwiftAPI 에 가면 다운로드 받을 수 있다.




HttpGet 

/**
 로그인된 Account의 Container 리스트를 조회하는 메소드로 HttpGet을 사용하였다.
*/

public List<FilesContainer> listContainers(int limit, String marker) throws IOException, HttpException, FilesException

{
        //로그인이 되었는지를 체크한다. 

if (!this.isLoggedin()) {

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

HttpGet method = null;

try {

LinkedList<NameValuePair> parameters = new LinkedList<NameValuePair>();

    if(limit > 0) {
                        //파라메터로 받은 limit를 추가한다. 

parameters.add(new BasicNameValuePair("limit", String.valueOf(limit)));

}

    if(marker != null) {
                        //파라메터로 받은 marker를 추가한다.  

parameters.add(new BasicNameValuePair("marker", marker));

}

    //위에서 생성한 parameters는 URI를 생성할때 사용이 된다.

    String uri = parameters.size() > 0 ? makeURI(storageURL, parameters) : storageURL;
                //위에서 선언한 HttpGet 객체를 생성한다.

method = new HttpGet(uri);

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);
                //헤더에 인증 Token를 추가한다.  

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                
                //여기서 사용되는 FilesResponse는  HttpClient로 실행한 결과값을 담아놓는 HttpResponse로 보                    면 된다.

FilesResponse response = new FilesResponse(client.execute(method));

    if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {

//상태코드가 401로 인증되지 않았을 경우 

}

if (response.getStatusCode() == HttpStatus.SC_OK)

{

//상태코드가 200으로 성공했을 경우

}

else if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT)

{

//상태코드 204 로 새로운 정보가 없을 경우

}

else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND)

{

//상태코드가 404 Not Found가 나왔을 경우

}

else {

//응답코드가 없을 경우

}

}

catch (Exception ex) {

ex.printStackTrace();

throw new FilesException("Unexpected error, probably parsing Server XML", ex);

}

finally {

if (method != null) method.abort();

}

} 


HttpHead

 /**
 로그인된 Account의 MetaData 정보를 조회할 때 HttpHead를 사용하였다.
*/ 
public FilesAccountInfo getAccountInfo() throws IOException, HttpException, FilesAuthorizationException, FilesException

{
        //로그인이 되었을 경우에만 아래 프로세스를 수행한다. 

if (this.isLoggedin()) {

HttpHead method = null;


try {

method = new HttpHead(storageURL);

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                        //해당 storageURL의 MetaData를 조회한다.

FilesResponse response = new FilesResponse(client.execute(method));
 

if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
                                //401 인증이 되지 않았을경우 Header를 삭제하고 다시 로그인을 한다.

method.removeHeaders(FilesConstants.X_AUTH_TOKEN);

if(login()) {

method.abort();

method = new HttpHead(storageURL);

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                                        //다시 해당 storageURL의 MetaData를 조회한다. 

response = new FilesResponse(client.execute(method));

}

else {
                                        //인증이 되지 않으면 오류처리한다. 

throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine());

}

}

                        // 기존 정보와 변동이 없으면 기존 정보를 조회하여 리턴한다. 

if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT)

{

int nContainers = response.getAccountContainerCount();

long totalSize  = response.getAccountBytesUsed();

return new FilesAccountInfo(totalSize,nContainers);

}

else {

throw new FilesException("Unexpected return from server", response.getResponseHeaders(), response.getStatusLine());

}

}

finally {

if (method != null) method.abort();

}

}

else {

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

}


HttpPost

 /**
 Object Metadata 정보를 수정할 때 HttpPost를 사용한다.
*/  
public boolean updateObjectMetadataAndManifest(String container, String object, 

Map<String,String> metadata, String manifest) throws FilesAuthorizationException, 

HttpException, IOException, FilesInvalidNameException {

        FilesResponse response;

        //로그인이 되어 있는지 체크한다.

if (!isLoggedin) {

    throw new FilesAuthorizationException("You must be logged in", 

    null, null);

}
        //수정될 Container가 있는지 체크한다. 

if (!isValidContainerName(container))

throw new FilesInvalidNameException(container);     
 
       //수정될 Object가 있는지 체크한다.

if (!isValidObjectName(object))

           throw new FilesInvalidNameException(object);


//Post 될 Url를 생성한다.

String postUrl = storageURL + "/"+FilesClient.sanitizeForURI(container) +

"/"+FilesClient.sanitizeForURI(object);

HttpPost method = null;

try {

          method = new HttpPost(postUrl);

        if (manifest != null){

        method.setHeader(FilesConstants.MANIFEST_HEADER, manifest);

        }

  method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

  method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                //HttpPost에 파라메터, 헤더, metadata값을 추가한다. 

  if (!(metadata == null || metadata.isEmpty())) {

  for(String key:metadata.keySet())

  method.setHeader(FilesConstants.X_OBJECT_META+key, 

  FilesClient.sanitizeForURI(metadata.get(key)));

  }
                //HttpPost를 HttpClient로 실행한다. 

HttpResponse resp = client.execute(method);

response = new FilesResponse(resp);

if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
                        //인증이 되지 않았으면 처음부터 다시 실행한다. 

method.abort(); 

if(login()) {

method = new HttpPost(postUrl);

  method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

  method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);

  if (!(metadata == null || metadata.isEmpty())) {

  for(String key:metadata.keySet())

  method.setHeader(FilesConstants.X_OBJECT_META+key, 

  FilesClient.sanitizeForURI(metadata.get(key)));

  }

    client.execute(method);

}

}

return true;

} finally {

if (method != null) 

method.abort();

}

}


HttpPut

 /**
 Container를 생성할 때 HttpPut 메소드를 사용한다.
*/   
public void createContainer(String name) throws IOException, HttpException, FilesAuthorizationException, FilesException

{
        //우선 로그인이 되었는지 먼저 체크한다. 

if (this.isLoggedin())

{
                //생성가능한 container명인지 체크한다. 

if (isValidContainerName(name))

{
                        //해당 storageUrl로 container 생성을 요청할 준비를 한다.

HttpPut method = new HttpPut(storageURL+"/"+sanitizeForURI(name));

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);

try {
                                // 준비된 요청을 실행한다.

FilesResponse response = new FilesResponse(client.execute(method));    

              if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {

              // 402 인증이 안되었을 경우

            }


          if (response.getStatusCode() == HttpStatus.SC_CREATED)

         {
                                        //  201 Container 생성 성공

          return;

         }

         else if (response.getStatusCode() == HttpStatus.SC_ACCEPTED)

         {

         // 202 이미 Container가 있을 경우

         }

         else {

        // 기타는 에러로 간주

         }

}

finally {

method.abort();

}

}

else

{

throw new FilesInvalidNameException(name);

}

}

else {

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

}



HttpDelete

  /**
 Container를 삭제할 때 HttpDelete 메소드를 사용한다.
*/  
public boolean deleteContainer(String name) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException, FilesNotFoundException, FilesContainerNotEmptyException

{
        //로그인이 되었는지 체크한다. 

if (this.isLoggedin())

{
                //삭제 가능한 Container명인지 체크한다. 

if (isValidContainerName(name))

{
                        // 해당 storageURL로 container를 삭제할 준비를 한다. 

HttpDelete method = new HttpDelete(storageURL+"/"+sanitizeForURI(name));

try {

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

  method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                                // 준비된 요청을 실행한다.

        FilesResponse response = new FilesResponse(client.execute(method));


          if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {

        // 402 인증이 안되었을 경우 

        }


          if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT)

       {

       // container가 삭제되었다.

         return true;

       }

       else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND)

       {
                           //삭제 할 container가 없을 경우 

       logger.debug ("Container does not exist !");

       

       }

       else if (response.getStatusCode() == HttpStatus.SC_CONFLICT)

       {
                           //삭제 할 container가 empty가 아닐 경우 에러를 발생한다.

       logger.debug ("Container is not empty, can not delete a none empty container !");

       }

}

finally {

method.abort();

}

}

else

{

        throw new FilesInvalidNameException(name);

}

}

else

{

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

return false;

}


 
저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.02.27 10:34
Swift를 설치한 후 실행해서 Swift 정보를 확인할 수 있는 기본 명령어 혹은 API에 대해서 알아보도록 하겠다.

OpenStack Swift를 설치하면 우리가 알아볼 수 없는 저게 파일인가 폴더인가 뭔지 모르는 구조의 폴더구조가 생성된다. 단지 내가 생성한 디렉토리가 내가 업로드한 파일이 제대로 올라가 있는지 생성되었는지 확인을 하기 위해서는 다음과 같은 swift 명령어를 이용하여야만 한다.

우선 swift를 설치할때 account를 관리하기 위하여 swauth를 설치하였을 것이다.

account를 관리하기 위한 명령어 몇가지를 알아보도록 하자 

- Account List를 확인하는 명령어

swauth-list -A http://localhost:8080/auth/ -K swauthkey

 
 - 다음과 같은 결과가 나온다.

{"accounts": [{"name": "admin"}, {"name": "system"}, {"name": "test"}, {"name": "user"}]}  


- 그럼 특정 Account의 User List를 알아보자

swauth-list -A http://localhost:8080/auth/ -K swauthkey user


- User List를 조회하면 해당 User 정보가 출력된다.

{"services": {"storage": {"default": "local", "local": "http://localhost:8080/v1/AUTH_9799a70b-d58a-46ba-8f5a-98ac905b543d"}}, "account_id": "AUTH_9799a70b-d58a-46ba-8f5a-98ac905b543d", "users": [{"name": 
"nalee"}, {"name": "naleejang"}]}
 


-그럼 Account를 추가할 때는 어떻게 해야 할까? 다음과 같은 명령을 사용하면 된다.

swauth-add-user -K key -A http://localhost:8080/auth/ -a <account> 


- Account를 추가했으면 이번에는 Account에 User를 추가해보자.

swauth-add-user -K key -A http://localhost:8080/auth/ -a <account> <user id> <user pass>


- User도 추가했으니 User의 상태를 한번 확인해 보자.

swift -A http://localhost:8080/auth/v1.0 -U user:naleejang -K testpass stat


- 위와 같이 입력하면 다음과 같은 결과를 확인할 수 있다.

    Account: AUTH_9799a70b-d58a-46ba-8f5a-98ac905b543d

Containers: 3094

    Objects: 5

      Bytes: 45582768

Accept-Ranges: bytes



여기까지 Account 정보를 알아보는 명령어를 살펴보았다. 다음 시간에는 Container 정보를 확인해 보는 명령어를 알아보도록 하겠다.

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang