Libcloud와Libvirt 2013-02-13

2013. 10. 23. 21:07Cloud/멀티클라우드

1. Libcloud와Libvirt

 

Apache Libcloud는 여러 클라우드 서버 프로바이더 간의 인터페이스를 제공하는 파이썬 기반 클라이언트 라이브러리로서 개발자들이 여러 클라우드 서비스 사이에서 동작하는 소프트웨어를 쉽게 개발 할 수 있도록 지원한다. 개발 서비스로는 클라우드 서버(아마존 EC2, RackSpace 등) , 클라우드 저장소 (아마존 S3, Rackspace의 CloudFILEs 등)이 있다.

다시 말해, Libcloud는 클라우드 서버 제공업체와 상호 작용을 위해 만들어진 클라이언트 라이브러리 이며, 개발자가 클라우드 서비스와 관리 어플리케이션을 쉽게 제작하기 위함을 돕기 위해 만들어졌다.

Libvirt는 가상화 플랫폼을 관리하는 오픈소스 API이다. LIbvirt는 KVM, Xen, Vmware ESX등 다양한 가상화 기술에 사용할 수 있다. Libvirt는 C언어로 된 라이브러리이지만, 파이썬, 펄, OCaml, 루비, 자바 PHP언어에 바인딩 할 수 있다.

보통 경우에 따라 여러 종류의 하이퍼바이저를 통해 가상 머신을 생성하거나 관리해야 할 때도 있다. Libvirt는 이런 다양한 종류의 하이퍼바이저를 통합적으로 관리하기 위해 만든 API이다.

예를 들어 가상 머신의 운행을 중지하고 싶다면 해당 가상 머신의 하이퍼바이저가 제공하는 API나 명령을 이용하여 운행을 중지해야 한다. 하지만 서로 다른 하이퍼바이저를 사용하는 가상 머신이 여러대 있다고 가정하면, 이 상황에서 현재 운행중인 가상 머신을 모두 중지하려 하면 일일이 별도의 명령을 실행해야 한다. 다행이도 libvirt는 하이퍼바이저의 종류에 상관없이 하나의 API로 원하는 명령을 내릴 수 있도록 지원한다.

따라서 하이퍼바이저의 의존성을 없애고 여러 타입의 가상머신을 마이그레이션하거나 전체적인 관리기능을 만드는데 큰 도움이 된다.

2. Libcloud, Libvirt의 차이점

Apache Libcloud API는 멀티 클라우드를 지원하는 표준화된 파이썬 라이브러리 이며, Libvirt는 가상머신을 다양한 하이퍼바이저의 종류에 상관 없이 생성,제어,관리 기능을 통합적으로 하기 위해 만든 API이다. 차이점은 Libvirt가 서버 가상화 소프트웨어라면 Libcloud API는 클라우드 서버 제공업체와 상호작용을 위해 만들어진 클라이언트 라이브러리라 할 수 있다.

API

내용

 

 

 

 

Libvirt,

- 서로 다른 하이퍼바이저를 사용하는 가상 머신들을 통합적으로 관리 하기 위함

Libvirt가 지원하는 목록

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Libcloud

Jcloud

deltacloud

 

 

 

 

 

- 서로 다른 클라우드 공급업체간에 상호 운용성 표준화를 위해 만든 API

- 각 Cloud Provider 간에 제공하는 API, 응답형식(XML, jSON, TEXT), 인증방법(Shared token/secret, HMAC based, HTTP basic/ digest auth, x509 certificate based) , 서명 메커니즘 등이 달라, 이를 표준화하기 위해 만든 API

 

 

 

3. Libcloud와 Libvirt의 API 구성 차이

API

구성

Libvirt

Connectiong API – 하이퍼바이저 연결

Geust Domain API – 가상 머신 관리

 

 

Libcloud

Compute API – Cloud Provider 들이 제공하는 가상 Server를 관리

Storage API – Cloud Provider들이 제공하는 Storage Service를 관리

LoadBalancer API – Cloud Provider 들 간의 Loadbalance를 관리

DNS API – Cloud Provider간의 DNS를 관리

 

 

Libcloud와 Libvirt의 Connect는 Libcloud는 Cloud Provide를 연결하며 연결된 핸들러를 통해 작업을 진행 하는 반면, Libvirt는 하이퍼바이저를 연결하여 연결된 핸들러를 통해 작업을 진행 한다.

API

작업 과정

 

Libvirt

1) 하이퍼바이저 연결 설정

2) 하이퍼바이저 핸들을 통한 작업 수행

3) 하이퍼바이저 연결 해제

 

Libcloud

1) Cloud Provider 연결 설정

2) Cloud Provider드라이버를 통해 노드를 만들고 노드 (인스턴스 객체) 를 통해 작업 을 수행 한다

3) Cloud Provider 연결 해제

 

Libvirt와 Libcloud간에 Connect하는 방법은 연결 하는 대상이 다름에 따라 구성이 다른데, 이는 다음과 같다

< Libvirt의 Connecting API>

Libvirt의 경우, 연결 설정을 위해 가장먼저 VirConnectOpen() 함수를 호출한다. VirConnectOpen()함수 호출이 성공적으로 이뤄지면 시스템에 명령을 전달할 때 사용되는 하이퍼바이저 핸들 포인터를 얻을 수 있다. 다음은 VirConnectOpen()함수의 원형이다.

VirConnectPtr virConnectOpen(const char*name)

파라미터 Const char*name 파라미터에 다음과 같은 URL값을 입력한다.

Driver[+transport]://[username@][hostname][:port]/[path][?extraparameters]

각 URL의 항목에 대한 설명은 다음과 같다.

Driver – 하이퍼바이저 타입에 따른 드라이버이름을 입력한다. 지원하는 드라이버는 다음과 같다.

드라이버

설명

Qemu

Qemu와 kvm 타입 지원

Xen

Xen 3.1버전 이하 타입 지원

Xenapi

새로운 xen타입 지원

Uml

UML 타입 지원

Lxc

리눅스 컨테이너 타입 지원

Vbox

버추얼박스 타입 지원

Openvz

Openvz 컨테이너 타입 지원

Esx

VMware ESX 타입 지원

One

Opennebula 타입 지원

Phyp

파워 하이퍼바이저 지원

 

URI를 사용하여 연결 설정이 성립되면 다른 libvirt API를 사용하여 호스트나 가상 머신에 대한 작업을 처리 할 수 있다. 수행하려는 작업을 모두 완료하고 난 후에 반드시 Virconnectclose()함수를 사용하여 연결 설정을 닫는다. libvirt함수를 사용하여 호스트를 제어 할 때 virConnectOpen() 함수와 virConnectClose() 함수로 끝을 내야한다.

 

< Libcloud- Connecting With a Driver>

from libcloud.compute.types import Provider

from libcloud.compute.providers import get_driver

EC2_ACCESS_ID = 'your access id'

EC2_SECRET_KEY = 'your secret key'

Driver = get_driver(Provider.EC2)

conn = Driver(EC2_ACCESS_ID, EC2_SECRET_KEY)

nodes = conn.list_nodes()

# [<Node: uuid=..., state=3, public_ip=['1.1.1.1'], provider=EC2 ...>, ...]

Libcloud의 경우 해당 서비스를 제어하기 위한 Porvider의 Driver를 받아오고 받아온 Driver를 통해 노드를 생성한다.

 

< Libcloud – Creating a Node >

from libcloud.compute.types import Provider

from libcloud.compute.providers import get_driver

RACKSPACE_USER = 'your username'

RACKSPACE_KEY = 'your key'

Driver = get_driver(Provider.RACKSPACE)

conn = Driver(RACKSPACE_USER, RACKSPACE_KEY)

images = conn.list_images()

# [<NodeImage: id=3, name=Gentoo 2008.0, driver=Rackspace ...>, ...]

sizes = conn.list_sizes()

# [<NodeSize: id=1, name=256 server, ram=256 ... driver=Rackspace ...>, ...]

# create node with first image and first size

node = conn.create_node(name='test', image=images[0], size=sizes[0])

# <Node: uuid=..., name=test, state=3, public_ip=['1.1.1.1'], provider=Rackspace

또한, Libcloud는 여러 개의 Provider를 동일한 API로 동시에 호출할 수 있다.

from libcloud.compute.types import Provider

from libcloud.compute.providers import get_driver

EC2_ACCESS_ID = 'your access id'

EC2_SECRET_KEY = 'your secret key'

SLICEHOST_API_KEY = 'your api key'

RACKSPACE_USER = 'your username'

RACKSPACE_KEY = 'your key'

EC2Driver = get_driver(Provider.EC2)

SlicehostDriver = get_driver(Provider.SLICEHOST)

RackspaceDriver = get_driver(Provider.RACKSPACE)

 

drivers = [ EC2Driver(EC2_ACCESS_ID, EC2_SECRET_KEY),

SlicehostDriver(SLICEHOST_API_KEY),

RackspaceDriver(RACKSPACE_USER, RACKSPACE_KEY) ]

 

nodes = [ ]

for driver in drivers:

nodes += driver.list_nodes()

print nodes

# [ <Node: provider=Amazon, status=RUNNING, name=bob, ip=1.2.3.4.5>,

# <Node: provider=Slicehost, status=REBOOT, name=korine, ip=6.7.8.9>, ... ]

# Reboot all nodes named 'test'

[node.reboot() for node in nodes if node.name == 'test']

 

 

'Cloud > 멀티클라우드' 카테고리의 다른 글

[Paper Review] Metacloud - Wind of Change: From Vendor Lock-in to the Meta Cloud  (0) 2013.10.23
Jcloud  (0) 2013.10.23
Deltacloud 2013-02-21  (0) 2013.10.23
Libcloud 2013-02-14  (0) 2013.10.23
Libvirt Overview 2013-02-13  (0) 2013.10.23