> ## Content Index
> Fetch the complete content index at: https://www.popit.kr/llms.txt
> Use this file to discover other available public pages before exploring further.

# 오픈스택 아키텍처 살펴보기
- URL: https://www.popit.kr/openstack-architecture/
- Published: 2016-09-29T02:55:30.000Z
- Updated: 2016-09-29T00:56:15.000Z
- Author: Seungkyu Ahn
- Tags: #소프트웨어, OpenStack, 아키텍처, 소스분석

오픈스택은 프로젝트 마다 자신의 고유 기능을 갖고 있으며 서로 유기적으로 연결된다고 할 수 있습니다. 예를 들어 Nova 는 VM (Virtual Machine) 생성/삭제/조회와 관련된 기능을 갖고 있으며, Glance 는 OS 이미지 생성/삭제/조회 기능을 갖고 있습니다. VM 을 생성하기 위해서는 OS 이미지 파일이 필요한데 Glance 와 통신하여 이미지를 가져옵니다. 오픈스택의 프로젝트는 모두 다음과 같은 공통점이 있습니다.

- Rest API 를 위한 API 서버가 있다.
- 비지니스 로직을 담당하는 1이상의 데몬 서버가 있다.
- 인증을 위한 Keystone 플러그인이 있다.
- Rest API 를 쉽게 호출할 수 있게 client 라이브러리를 가지고 있다.
- 필요한 메타 데이터 정보는 DB 를 활용한다.

위와 같은 공통된 아키텍처의 특징 때문에 다음과 같은 규칙도 있습니다.

- 프로젝트간 통신은 Rest API 를 사용한다. 예를 들어 Nova 서버에서 Glance API 서버에 호출하기 위해서는 Nova 서버에 python-glanceclient 라이브러리를 import 해서 쉽게 호출할 수 있습니다.
- 프로젝트내에 데몬 간의 통신은 Queue 를 통해서 한다. Queue 를 활용할 때도 규칙이 있는데 이 부분은 소스를 설명하면서 추후에 하도록 하겠습니다.

## Conceptual architecture

아래 다이어그램은 중요 프로젝트에 대한 오픈스택의 conceptual architecture 입니다.

![openstack_kilo_conceptual_arch](https://www.popit.kr/content/images/wp/2016/09/openstack_kilo_conceptual_arch-600x485.png)

출처 : http://docs.openstack.org/admin-guide/common/get-started-conceptual-architecture.html#get-started-conceptual-architecture

오픈스택은 Infrastructure 를 제공하는 S/W 이므로 결국 VM 을 중심으로 모든 작업이 이루어집니다. 그런 의미에서 VM 이 중심에 있고, 나머지 박스는 각 프로젝트를 표현하고 있습니다. (개인적으로 제 마음에는 안들지만 따로 그리기에는 힘들어서 그냥 이대로) Horizon 이나 CLI 를 통해 VM create 요청이 오면 Nova API 서버가 제일 먼저 요청을 받습니다. Nova 는 Keystone 을 호출해서 인증을 체크하고 리소스 스케줄링으로 VM 이 생성될 Compute Host 서버를 선정합니다. 이어서 Neutron 을 호출해서 네트워크의 fixed ip (private ip) 를 결정한 후 Glance 를 호출해서 OS 이미지를 가져옵니다. 이 때 Glance 가 바라보는 이미지 저장소는 Swift, file system, Ceph 등 다양하게 지정할 수 있습니다. 마지막으로 하이퍼바이저를 호출해서 VM 인스턴스를 생성합니다. 각각의 과정은 단계별 진행사항을 알 수 있도록 상태값을 데이터베이스에 저장합니다.

어떻게 보면 오픈스택은 MSA (Microservices Architecture) 아키텍처로 구성되어 있습니다. 각 서비스들이 Rest API 로 통신하고 이런 서비스를 lookup 할 수 있게 Keystone 을 통해서 endpoint 서비스를 제공하고 있습니다. 물론 서비스 하나의 덩치가 이제는 무지 커졌긴 하지만 말입니다.

## Nova API

오픈스택 소스를 분석할려면 entry point 인 API 서버 부터 시작해야 하는데 처음 소스를 접한다면 제대로 이해하기가 쉽지 않습니다. 서비스를 어떻게 시작하는지, 프로세스는 몇 개를 띄우는지를 설명하지는 않겠습니다. 여기서는 HTTP Request 가 어떻게 Routing 되는지를 설명하도록 하겠습니다.

우선 제일 먼저 Nova 소스를 아래와 같이 받습니다.

`$ git clone http://git.openstack.org/openstack/nova.git && cd nova/nova`

다른 프로젝트의 소스들은 다음의 링크에서 받을 수 있습니다. [https://git.openstack.org/cgit](https://git.openstack.org/cgit?ref=popit.kr)

1 레벨 디렉토리만을 표시하여 보여주고 있으며 API 는 두번째 폴더인 api 폴더에 있습니다.

![nova-directory](https://www.popit.kr/content/images/wp/2016/09/nova-directory-296x600.png)

API 는 WSGI 및 Routes 라이브러리를 활용하는데 오픈스택은 Oslo 라는 OpenStack Common Libraries 를 통해서 지원을 하고 있습니다. Oslo 는 python 라이브러리의 장점이자 단점인 디펜던시 때문에 나타난 프로젝트로 데몬 서비스와 같은 공통적인 부분을 관리하고 있습니다.

서비스를 Invoke 하는 부분은 nova/wsgi.py 에 나와 있습니다.

![nova_wsgi_src](https://www.popit.kr/content/images/wp/2016/09/nova_wsgi_src-600x428.png)

URI 에 포함되는 단어로 python 파일을 invoke 하는 구조 입니다. 예를 들어 VM 을 생성하는 URI는 POST 방식의 "/servers" 로 필요한 인자 값은 HTTP Request Body 로 보내며, VM 리스트를 조회하는 URI 는 GET 방식의 "/servers" 입니다. 이렇게 URI 가 servers 라면 해당 소스는 nova/api/openstack/compute/servers.py 를 호출하게 됩니다. POST 방식의 VM 의 생성은 servers.py 의 ServersController 클래스내 create 메소드를 호출하게 됩니다.

![nova_api_openstack_compute_servers_src_png](https://www.popit.kr/content/images/wp/2016/09/nova_api_openstack_compute_servers_src_png-600x289.png)

create 메소드에서는 인자로 넘어온 Request 객체와 Body 객체를 활용해서 클라이언트가 요청한 VM 생성 파라미터값을 파싱하여 이후 로직을 타게 됩니다.

다음에는 API 이후에 진행되는 VM 생성 소스를 살펴보도록 하겠습니다.