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
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
OpenStack2012.02.24 18:36

2월 23일 상암 누리꿈스퀘어(NIPA 소프트웨어공학센터)에서 "안드로이드 & 클라우드"를 주제로

유명환 뻔뻔강사님과 함께 세미나를 하였다.


나는 클라우드와 오픈스택이라는 주제로 세미나를 하였는데, 첫 세미나라서,..
부족한 부분이 많았을덴데 많은 것들을 보여 줄 수 없어서 조금 아쉬웠다. 

아무튼 내게는 더없이 좋은 경험이였고, 재미있는 강연이 될 수 있도록 노력했기에 듣는 분들도 만족했으리라
생각한다. ^^





Posted by 나리 짱!!! naleejang
OpenStack2012.02.10 15:19
오늘은 OpenStack Swift의 DB 구조에 대하여 알아보도록 하겠다.

OpenStack의 Swift는 mysql과 같은 DB를 사용하지 않는다. 다만 SQLite3라고 하는 경량화 된 DB를 사용한다. 
그럼 Swift에는 어떤 Table들이 있을까? 정말 궁금하기 그지 없다. 소스를 까보지 않는 한 Swift Directory 구조를 살펴보지 않는 한 알수가 없다. 그래서, 내가 살펴 본 Swift의 DB 구조를 이곳에 공개하려 한다.

Table List
우선 Table List 부터 알아보도록 하겠다.

Swift에는 Account, Container, Object로 이루어져 있다. 그래서 DB Table또한 Account Table, Container Table, Object Data로 이루어져 있다.


OpenStack Table List


Posted by 나리 짱!!! naleejang
OpenStack2012.02.02 10:45

지난 2011년에 OpenStack Swift를 설치하면서 정보를 서로 공유를 하는것이 좋다고 생각을 했다. 그리고, 아무도 하지 않은 설치 매뉴얼을 작성해서, OpenStack Korea Community와 공유를 하였다.

여기에서도 OpenStack Swift 설치 매뉴얼을 받아볼 수 있도록 공유를 하려고 한다.

VirtualBox를 활용한 OpenStack Swift SAIO 설치 매뉴얼



OpenStack Swift Multi Server 설치 매뉴얼

 

 
Posted by 나리 짱!!! naleejang
OpenStack2012.01.27 16:24

OpenStack을 시작하면서 Swift가 무엇일까? 무엇으로 구성이 되어 있을까? 하는 생각을 한적이 있다.

그래서, 인터넷을 찾아보고, OpenStack.org의 메뉴얼을 읽어보고, 소스파일을 다운로드 받아 들여다도 보고 

해서 나름대로의 Swift 구성을 정리해 보았다.
  

 

- 우선 Swift는 사용자 및 인증를 관리하는 Authentication

- 사용자의 Storage(저장공간) 관리, Container(폴더) 관리등을 하는 Account

- 사용자의 Container(폴더) 생성 및 삭제, Container가 가지고 있는

   object(파일) 개수 등을 관리하는 Container

- Object(파일) 정보를 조회하고, 다운로드, 업로드, 복사, 삭제 등을 해 주는 Object

- 위의 것들을 관장하고 관리해 주는 놈이 하나 더 있는데 그게 바로 Proxy 이다. 일명 Master 라고 할 수 있다.

 

이렇게 4가지로 구성이 되어 있는 정말 단순한 구조이다. 사실은 내 생각에 PC는 이게 다인듯하다. 더 이상 벗어니지는 않는다. ㅋㅋ 오늘 자료를 정리하다가 글로 남겨놓으면 더 좋을 듯하여 이렇게 작성해 본다.

Posted by 나리 짱!!! naleejang
OpenStack2012.01.26 17:54
======================================================================
 Download API Site
======================================================================

http://wiki.openstack.org/SwiftAPI

======================================================================
 API Summary
======================================================================
 
내가 가지고 있는 내 로컬 PC의 디렉토리를 관리하는 것이 아니라,
원격에 있는 디렉토리 서버에 접속(Http 프로토롤 사용)을 해서 사용자 계정으로 로그인하고
그 사용자가 가지고 있는 디렉토리를 관리한다.

우리는 프로그래밍할때 다운로드 받은 소스를 Ant로 빌드한다.
그러면 java-cloudfiles.jar 파일이 생성된다. 
이 jar 파일을 개발할때 import시키고 개발하면 된다.
 
======================================================================
 Command Help 
======================================================================
get                               List the containers for this account 
: 로그인한 사용자 계정의 컨테이너(즉 디렉토리) 리스트 조회
get container                     List the contents of the given container
: 선택한 혹은 주어진 컨테이너의 컨텐츠 리스트 조회
get container/object destination  Download the given object and store it at the destination
: 선택한 객체(즉 데이터)를 다운로드하고 선택한곳(저장소)에 다운받은 파일을 저장한다.
head                              Get information about this account
: 로그인한 사용자 계정에 대한 정보 조회
head container                    Get the container's information
: 컨테이너(디렉토리) 정보 조회
head container/object             Get the objects's information and metadata
: 객체(파일)의 정보와 메타데이터(속성정보) 조회
put container                     Create the given container
: 컨테이너(디렉토리)를 생성한다.
put container localfile           Upload the local file to the container
: 컨테이너(디렉토리)에 내 PC에 있는 로컬파일을 업로드한다.
delete container                  Delete the container
: 컨테이너를 삭제한다.
delete container/object           Delete the given object
: 객체(파일)을 삭제한다.
help                              Print this help message
: Help 메시지를 출력한다.
exit                              Exit the program
: 프로그램을 빠져나간다.


======================================================================
 OpenStack Process 분석 (FilesCli.java)
======================================================================

1. UserName과 Password로 Cloud 사이트에 로그인한다.
   
   이때 cloudfiles.properties 파일에서 Cloud사이트를 정보를 가져오는데, 
   auth_url=https://auth.api.rackspacecloud.com/v1.0  로 되어 있다.
   우리는 rackspacecloud.com에 가입이 되어 있지 않아 본 프로그램을 테스트 하지 못했지만
   OpenStack를 설치하고 해당 Server로 접속을 하면 될 듯하다.

로그인에는 두가지 방법이 있는데, 
1.1 하나는 사용자로부터 ID와 PW를 받아 로그인하는 방법이고
1.2 다른 하나는 properties파일에서 ID와 PW 정보를 읽어와 로그인하는 방법이 있다.
2. 로그인을 성공하고 나면 다음과 같은 정보를 조회해 온다.
- storageURL  (저장 Path)
- authToken (인증 토큰)
- cdnManagementURL (관리페이지URL)
- ConnectionManager (메니저 객체)

3. 사용자가 보낸 명령어순대로 명령을 처리한다.
- help 
 : 위에 있는 help String을 화면에 뿌려준다.
- exit or quit 
 : 프로그램을 종료한다.
- get 
 : 컨테이너 리스트를 조회해 화면에 컨테이너명을 출력해 준다.
- get <container name>
 : 컨테이너의 컨텐츠 리스트를 조회해 화면에 출력해 준다. 없으면 empty라고 출력한다.
- get <object name>
 : 객체(파일)를 다운로드한다. 
   이때 명령어는 get container/filename.ext destination.ext 로 입력한다. 그렇지 않으면 오류를 발생시킨다.
   다운로드 방법은 InputStream으로 읽어들여 FileOutputStream으로 출력한다.
- head
 : 컨테이너 개체수, 총사이즈 정보를 출력한다.
- head <container name>
 : 선택한 컨테이너의 객체(파일)수와 총사이즈를 출력한다.
- head <object name>
 : 선택한 객체의 Metadata가 있을경우에만 해당 정보를 보여준다.
   선택한 파일의 총 사이즈, 파일 타입, 또 다른 메타데이터가 있다면 해당 정보를 출력해 준다.
- put <container_name>
 : 새로운 컨테이너(디렉토리)를 생성한다.
   우선, 저장경로가 있는지 체크한 후 해당정장경로로 컨테이너(디렉토리)를 생성한다.
- put <local file>
 : 객체(파일)을 업로드한다.
   1) 업로드할 파일이 있는지 체크한다. 2) 파일명, 확장자, 파일타입를 추출한다.
   3) 컨테이너(디렉토리)가 있는지 체크한다. 4) 해당 컨테이너(디렉토리)로 파일을 저장한다.
- delete <object name>
 : 선택한 객체(파일)를 삭제한다.
- delete <container name>
 : 선택한 컨테이너(디렉토리)를 삭제한다.
Posted by 나리 짱!!! naleejang