# IaaS 오픈소스 OpenStack 개요, OpenStack SDK 사용법(Golang)

2020. 11. 16. 18:49 개발 이야기/오픈소스

 

안녕하세요. 해커의 개발일기 입니다.

 

게으름을 핑계로 정말 오랫만에 글을 쓰는 것 같습니다.

개인적으로 하고 있는 프로젝트도 있고, 공부할것도 많고 대학원 공부도하고 .. 

 

하루가 48시간이었으면 좋겠습니다...

 

오늘은 IaaS가 어떤 것인지에 대해서 알아보는 시간을 갖고, 

IaaS 오픈소스 프로젝트인 OpenStack, 이어서 Golang OpenStack SDK 사용법을 알아보도록 하겠습니다.

 

 

 

먼저 IaaS가 뭘까요 ? 가장 간단하게 해석해보겠습니다.

 

IaaSInfrastructure as a Service의 약자인데요 

네트워크, 스토리지, 서버 등 필요에 따라 인프라 자원을 사용할 수 있게 

클라우드 서비스로 제공하는 것

 

쓰다보니 위키백과와 같아졌네요 .. ㅎㅎ

자, 이렇게 말씀드려도 이해가 안가신다면 

 

AWS 서비스 있잖아요. 그 클릭 몇번이면 서버를 사용할 수 있고,

클릭 몇번이면 로드벨런서, 스토리지 등을 사용할 수 있는 그런거!

 

이런 IaaS 서비스를 제공, 사용할 수 있는 프로젝트 중에 가장 유명한

오픈소스 프로젝트인 OpenStack이 있습니다.

아키텍처를 한번 보겠습니다.

github.com/openstack

 

Mirrors of opendev.org/openstack

Read-only mirrors of all OpenStack code repositories (hosted at https://opendev.org/openstack by the OpenStack community) - Mirrors of opendev.org/openstack

github.com

 

 오픈스택은 여러개의 프로젝트로 구현되어 있는데요 Networking을 담당하는 Neutron, HardWare Lifecycle을 담당하는 Ironic, 컴퓨팅 시스템을 담당하는 Nova 등 IaaS 서비스 규모에 걸맞게 다양한 기능들이 필요하기 때문에 이를 나눠서 개발하고 있는 것 같습니다. 제 생각에는 전문적인 분야들이 나뉘어 있으므로 개발자들이 좀더 집중할 수 있지 않은가.. 라는 생각도 해봤습니다. 아래는 오픈스택의 github 모습입니다. 아키택처 그림처럼 프로젝트 단위로 나뉘어 있는 것을 볼 수 있습니다.(100% 파이썬입니다 파이썬 굿)

그러면 한번 어떻게 IaaS를 지원하고 있는지 설치한 후(Devstack을-이용한-Openstack-설치하기 참조) 로그인해보면 아래와 같은 페이지를 볼 수 있는데요

1. 인스턴스 시작하기

2. Flavor 선택(Flavor는 서버의 스펙을 관리하는 부분)

2. 사용자

3. 콘솔

4. 네트워크

 

 테스트 삼아 설치해봤지만 UI도 바로 사용해도 될만큼 완성도가 높아보였습니다(물론 개인차..) 실제로 인스턴스도 만들어보고 했는데 정말 잘 돌아가는 것 같더라구요. 이런 오픈소스를 수정해서 Cloud 서비스를 구축한다면 어떻까요 ? 아마도 현존하고 있는 클라우드 서비스들은 이 OpenStack이나 혹은 다른 오픈소스 IaaS 프로젝트를 이용해서 커스텀한 것 같습니다. 자, 그러면 어떻게 커스텀할까요? 

바로 OpenStack SDK 를 사용하면 되는데요. Python 프로젝트 답게 대표 SDK는 파이썬으로 되어 있습니다. 문서화도 잘되어 있는 것 같고, 제 생각에는 어렵지 않게 사용할 수 있도록 잘 다듬어 놓은 것 같았습니다.

github.com/openstack/openstacksdk

 

openstack/openstacksdk

Unified SDK for OpenStack. Mirror of code maintained at opendev.org. - openstack/openstacksdk

github.com

 

저는 Golang SDK를 이용해서 한번 테스트 코드를 만들어 봤는데요. 이유는 .... 업무상 찾아보다가 한번 golang으로 짜볼까 해서 만들어보게 되었습니다. 

github.com/rackspace/gophercloud

 

rackspace/gophercloud

A Go SDK for OpenStack. IN FEATURE FREEZE. See Issue #592 - rackspace/gophercloud

github.com

사용 방법을 간략히 설명해드리면, 먼저 OpenStack에서 인증을 관장하는 identity url로 인증을 받은 후 이를 이용해 정보를 조회해 오는 방식입니다.

아래는 인증 정보를 보내고 provider를 리턴받아 이를 이용해서 client를 생성하는 로직이구요.

opts := gophercloud.AuthOptions{
   IdentityEndpoint: "http://172.27.142.53/identity/v3/",
   Username:         "admin",
   Password:         "test",
   TenantID:         "65f23670a0f54d47917710f04c4b075f",
   DomainID:         "default",
}

provider, err := openstack.AuthenticatedClient(opts)

if err != nil {
   log.Fatal("failed", zap.String("err", "openstack client create error "))
}

client, err := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{})
if err != nil {
   log.Warn("failed", zap.String("err", "openstack client create error "))
}
if client != nil {
   log.Info("success", zap.String("success", "openstack client created "+client.ProviderClient.TokenID))
}

위에서 생성한 client를 이용해서 flaver list를 가져오는 코드랍니다. 정보 조회 수준이라 아주 간단하죠 ?

// flavors list 로직
flavorsPager := flavors.ListDetail(client, flavors.ListOpts{})
// Define an anonymous function to be executed on each page's iteration
_ = flavorsPager.EachPage(func(page pagination.Page) (bool, error) {
   flavorList, _ := flavors.ExtractFlavors(page)

   for _, f := range flavorList {
      // "f" will be a flavors.Flavor
      log.Info("success", zap.String("get flavor name", f.Name))
      log.Info("success", zap.Int("get flavor disk", f.Disk))
      log.Info("success", zap.Int("get flavor RAM", f.RAM))
      log.Info("success", zap.Int("get flavor Swap", f.Swap))
      log.Info("success", zap.Int("get flavor VCPUs", f.VCPUs))
   }
   return true, nil
})

// images 종류 가져오기
imagesPager := images.List(client, images.ListOpts{})
_ = imagesPager.EachPage(func(page pagination.Page) (bool, error) {
   imageList, _ := images.ExtractImages(page)

   for _, i := range imageList {
      // "i" will be a images.Image
      log.Info("success", zap.String("get images name", i.Name))
      log.Info("success", zap.Int("get images MinDiskGigabytes", i.MinDiskGigabytes))
      log.Info("success", zap.String("get images RAM", i.DiskFormat))
      log.Info("success", zap.String("get images Swap", i.File))
      log.Info("success", zap.String("get images VCPUs", i.Owner))
   }
   return true, nil
})

 이런식으로 이미지를 만들고, 인스턴스를 생성하고 이미지를 백업하고, 스토리지를 생성하는 등의 행위를 입맛데로 수정할 수가 있습니다. 하지만 네트워크 쪽 개발도 해보는 중에 golang SDK로는 네트워크 토폴로지를 그리지 못하는 것 같았는데요. golang은 오래전에 개발이 멈춘듯 보였기 때문에, 이는 아마 python sdk 에만 개발이 되어 있는게 아닌가.. 하는 생각이 들었습니다.

물론 자세히 보지 않아서 제가 못찾은 것일 수도 있습니다!

 

준비한 내용은 여기까지구요. OpenStack SDK를 이용해서 멋진 클라우드 서비스를 만들어보시길!