백엔드

사내 IaaS 구축하기

CyberI 2018. 6. 25. 15:13

1 오픈스택이란

IT 개발자로 일을 하다 보면 클라우드 컴퓨팅이란 단어는 한번쯤 들어 보셨을 겁니다. 클라우드 컴퓨팅이란 쉽게 말해 네트워크가 가능한 디바이스를 통해 클라우드라는 공간에서 데이터를 읽고 처리하고 관리하는 시스템을 말합니다.

클라우드 컴퓨팅의 종류로는 서비스에 따라 IaaS, PaaS, SaaS로 구분됩니다.

IaaS(Infrastructure as a Service)는 서버, 스토리지, 네트워크를 가상화 시켜 필요한만큼 인프라 자원을 사용할 수 있게 제공하는 서비스입니다. AWS(Amazon Web Service)를 생각하면 됩니다.

PaaS(Platform as a Service)는 개발을 위한 플랫폼이 미리 구축되어 있고 이 플랫폼 위에서 개발 및 배포를 

게 해주는 서비스를 말합니다. 정의를 내리기 까다로운 형태인데, 가장 유사한 서비스로는 Google App 

Engine 정도가 있습니다.

SaaS(Software as a Service)는 클라우드 상에서 서비스되고 있는 소프트웨어를 말하며, 사용자가 웹이나 앱으로 사용가능한 형태의 서비스입니다. Dropbox, Google Docs 등 수많은 소프트웨어가 있습니다.

오픈스택이란 간단히 말해 오픈소스로 이루어진 IaaS 구축 플랫폼입니다.

2010 7 RackspaceNASA가 같이 시작한 오픈소스 프로젝트로써 리눅스 OS 위에서 IaaS를 구축할 수 있도록 가상화를 지원하고 CLI 및 대시보드로 관리할 수 있도록 해줍니다.

많은 세부 프로젝트로 구성되어 있는 오픈소스 프로젝트이며 그 중 6개의 중요한 세부 프로젝트가 IaaS를 구축할 수 있게 도와줍니다.

 Nova  서버의 가상화를 지원하고 관리
 Neutron  네트워크 가상화를 지원하고 관리(Software Define Network)
 Swift  Restful API로 오프젝트 스토리지 지원
 Glance  서버 가상화에 필요한 OS 이미지 관리
 Keystone  프로젝트 및 가상화 인증 관리
 Cinder  블록 디바이스의 볼륨을 관리

오픈스택 시스템을 잘 다루기 위해선 각 프로젝트별로 논리 아키텍처를 이해를 하고 바탕이 되는 많은 기술들의 이해가 필요합니다. 하이퍼바이저, 오브젝트 스토리지 등 기술적 이해가 많이 필요하나 최근에 들어선 잘 다듬어진 대시보드로 인해 많이 어렵지 않게 사용 가능해졌습니다.

2 오픈스택 설치

사내 IaaS 구축을 위해 오픈스택을 설치해보도록 하겠습니다.

기본으로는 오픈스택을 각 프로젝트별로 설치하는 것이 정석이나 이 과정을 한번에 처리해주는 솔루션들이 있습니다. 대표적으로 devstack, packstack, trystack 등이 있습니다. 그 중 RedHat이 지원하는 RDO 프로젝트에서 만든 packstack으로 설치해보겠습니다.

Centos7 설치와 구성

Centos7을 설치할 때 일반적으로 설치할 때와 동일하게 설치하나 packstack을 위해 세 가지만 유의하면 됩니다.

1)   파티션을 자동으로 하지않고 수동 파티션으로 한 후 /home의 용량을 / 로 이관.

openstack은 가상화된 서버 인스턴스를 /var/lib/nova 밑의 디렉토리에 보관합니다. 따라서 해당 디렉토리의 용량이 충분하지 못하면 볼륨 생성이 불가능하여 가상 서버를 만들지 못하게 됩니다. Centos 설치 시 자동으로 파티션하게 되면 /home에 대부분의 용량을 할당하게 되므로 이를 /로 어느 정도 옮겨야 합니다.

2)   IP dhcp를 통해 자동으로 얻어오지않고 static으로 설정.

/etc/sysconfig/network-scripts/ifcfg-enp3s0 의 내용을 아래처럼 수정합니다.

  BOOTPROTO=static
  IPADDR=192.168.0.69
  NETMASK=255.255.255.0


  GATEWAY=192.168.0.1


  DNS1=192.168.0.1
  ONBOOT=yes

packstack 설치 시 정적 IP로 설정되어 있지않으면 오류 문구를 보여주며 설치가 진행되지 않습니다. 이를 정적 설정으로 변경해주면 정상 설치 됩니다.

3)   리눅스 방화벽 비활성화

  systemctl disable firewalld
  systemctl stop firewalld


  systemctl disable NetworkManager


  systemctl stop NetworkManager


  systemctl enable network
  systemctl start network

리눅스 자체 방화벽이 있는 경우, 오픈스택의 restful api가 정상 동작 하지않을 수 있습니다. 이를 비활성화 하고 오픈스택 설치 후 오픈스택의 의 보안 정책을 사용하도록 합니다.

packstack 설치

1) Software Repository 업데이트

packstackyum을 통하여 설치할 것입니다. 기본 Repository에는 packstack이 없으니 추가해줍니다.

  yum install -y https://rdoproject.org/repos/rdo-release.rpm
  yum update -y

2) packstack 설치

  yum install -y openstack-packstack

3) 네트워크 구성도 설계

이제 packstack을 이용하여 오픈스택을 설치할 준비를 마쳤습니다. 하지만 그 전에 가장 중요한 네트워크 구성도를 그려보겠습니다.

네트워크 구성도를 그려서 이해하지 않으며 오픈스택 설치 후 가상화된 서버와의 통신이 원활하지 않는 경우가 많기 때문입니다.

공유기를 통해 인터넷을 사용하는 보편적인 네트워크 망에서 오픈스택 네트워크 구성도를 그려봤습니다. 여기서 중요한 것은 네트워크 타입을 OVSPort OVSBridge로 이용하여 물리적 이더넷 포트인 enp3s0를 브릿지 포트로 지정된 br-ex와 연결하여 오픈스택의 가상 서버들이 실제 인터넷과 연결되도록 해야 합니다.

이 작업은 원래 리눅스의 이더넷 조정 및 openstack 설치 후 neutron config를 수정하는 추가 작업이 필요하나 packstack을 통해 설치하면 한번에 처리가 됩니다.

4) 오픈스택 설치

네트워크 구성이 적용되도록 오픈스택을 설치합니다. 설치, 기본 구성, 테스트까지 진행함으로 시간이 오래 걸립니다.

packstack --allinone --provision-demo=n --os-neutron-ovs-bridge-mappings=extnet:br-ex --os-neutron-ovs-bridge-interfaces=br-ex:enp3s0 --os-neutron-ml2-type-drivers=vxlan,flat

설치가 종료되면 기존의 enp3s0의 내용이 변경되고 br-ex가 생긴 것을 볼 수 있습니다.

  /etc/sysconfig/network-script/ifcfg-enp3s0
  DEVICE=enp3s0
  TYPE=OVSPort
  DEVICETYPE=ovs
  OVS_BRIDGE=br-ex


  ONBOOT=yes


  /etc/sysconfig/network-script/ifcfg-br-ex
  DEVICE=br-ex
  DEVICETYPE=ovs
  TYPE=OVSBridge
  BOOTPROTO=static
  IPADDR=192.168.0.70
  NETMASK=255.255.255.0
  GATEWAY=192.168.0.1
  DNS1=192.168.0.1
  ONBOOT=yes

5) 대시보드 접속

http://serverIp 로 접속하면 오픈스택 대시보드로 접속이 가능합니다.

기본 계정 정보는 /root 디렉토리의 packstack 설치 후 생성되는 keystonerc_admin 파일을 열어보면 정보가 있습니다.

  unset OS_SERVICE_TOKEN
      export OS_USERNAME=admin
      export OS_PASSWORD='21997a54d23c4773'
      export OS_AUTH_URL=http://192.168.0.69:5000/v3
      export PS1='[\u@\h \W(keystone_admin)]\$ '
 
  export OS_PROJECT_NAME=admin
  export OS_USER_DOMAIN_NAME=Default
  export OS_PROJECT_DOMAIN_NAME=Default
  export OS_IDENTITY_API_VERSION=3

6) 사용자 계정 및 프로젝트 생성

인증 > 프로젝트, 인증 > 사용자 화면을 이용하여 원하는 사용자 계정을 생성합니다.

대시보드가 잘 되어 있어 따로 설명하지는 않겠습니다.

 

Neutron 네트워크 구성

대시보드 접속하면 먼저 네트워크 구성을 해줘야 합니다. 그래야 설치 전 그렸던 네트워크 구성도대로 통신이 이루어집니다.

먼저 admin 계정으로 외부 네트워크를 생성해 줍니다.

관리 > 네트워크 > 네트워크 화면에 접속하여 네트워크 생성 버튼을 클릭합니다.

아래와 같이 진행합니다.

 

생성 버튼을 클릭하여 생성하면 아래와 같이 인터넷망과 연결된 외부 네트워크가 생성된 걸 볼 수 있습니다.

이제 사용자 계정으로 접속하여 사설 네트워크를 생성합니다.

 

프로젝트 > 네트워크 > 네트워크 화면으로 들어가 아래와 같이 진행합니다.

이제 외부 네트워크가 사설 네트워크를 연결해주는 라우터를 생성하겠습니다.

 

프로젝트 > 네트워크 > 라우터 화면으로 들어가 라우터 생성 버튼을 클릭하여 아래와 같이 외부네트워크를 선택하고 생성합니다.

생성된 라우터를 클릭하여 세부 화면으로 들어가 인터페이스 탭을 클릭합니다.

인터페이스 추가 버튼을 클릭하여 방금 생성한 사설 네트워크를 연결합니다.

이제 프로젝트 > 네트워크 > 네트워크 토폴로지 화면으로 들어가 네트워크 구조가 정상적으로 생성됐는지 확인합니다.

 

 

정상적으로 네트워크가 구성된 걸 볼 수 있습니다.

 

하지만 아직 한가지 작업이 남아 있습니다. 네트워크 생성 시 서브넷 세부 사항을 보면 Pool 주소 할당 부분이 있습니다. 내부 사설 네트워크의 경우 굳이 설정해주지 않아도 문제가 따로 발생하지 않으나 외부 네트워크의 경우 공유기의 dhcp 서버랑 충돌이 생겨 내부 가상 서버에 Floating IP 할당이 되지않아 외부 접근이 불가능한 경우가 있습니다. 따라서 Pools을 부분을 공유기의 dhcp 할당 범위에서 벗어난 범위로 지정해 주어야합니다. 화면에서 보듯이 현재는 90번부터 99번까지 할당되도록 설정을 했습니다. 공유기 역시 관리 기능을 이용하여 충돌이 나지 않도록 설정해 주어야 합니다.

이것까지 완료하면 네트워크 구성은 완전히 마쳤습니다.

 

Glance 이미지 추가

이제 가상 서버를 생성하기 위해 OS 이미지를 추가해보겠습니다.

오픈스택에 사용되는 OS 이미지는 기존의 물리적으로 설치하는 이미지와 다르게 cloud image로 각 OS 메이커에서 따로 배포되고 있습니다.

VM으로 생성할 이미지는 ubuntu server로 받아보겠습니다.

리눅스 서버에서 wget을 이용하여 이미지를 받습니다.

wget https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img

 

현재 ubuntu 이미지는 etc/hosts 파일에 자동으로 lock이 걸려있어 hostname DNS Server 처리를 못하는 버그가 있어 이것을 수정해야 합니다.

virt-edit -a xenial-server-cloudimg-amd64-disk1.img /etc/cloud/cloud.cfg

 

사용법은 vi와 동일합니다.

manage_etc_hosts: true

줄에 위의 문구를 삽입 후 저장하고 나옵니다.

그리고 변경된 이미지를 FTP를 통해 작업 PC로 내려받습니다.

대시보드에 접속하여 프로젝트 > Compute > 이미지 화면으로 이동합니다.

이미지 생성 버튼을 눌러 아래와 같이 기입 후 이미지를 생성합니다.

이미지가 생성되면 아래와 같이 생성된 이미지를 볼 수 있습니다.

Nova 인스턴스(가상 서버) 생성

이미지까지 업로드를 했으니 이제 가상 서버를 만들어 보도록 하겠습니다. 오픈스택 내에서는 가상 서버를 인스턴스라고 부릅니다.

먼저 생성 이후 외부 접근을 위해 키 페어를 만들어 둡니다.

프로젝트 > Compute > 키 페어 화면으로 들어가 키 페어를 생성합니다.

 

생성과 동시에 keypair.pem을 다운로드 받게 됩니다. 해당 key를 저장해 놓습니다.

 

프로젝트 > Compute > 인스턴스로 들어가 인스턴스 생성 버튼을 클릭합니다.

 

이름을 지정합니다.

이미지를 선택합니다.

가상서버에 얼만큼 자원을 할당할 건지 미리 정해놓은 세트에서 선택합니다. m1.small을 선택하여 가상 CPU1개 디스크 볼륨을 20GB로 잡습니다.

내부 네트워크 부분을 설정합니다.

생성한 키 페어로 설정합니다.

 

이제 인스턴스 시작을 눌러 인스턴스를 생성합니다.

몇 가지 내부 작업을 실행하고 내부 IP를 부여한 후 인스턴스가 생성되었습니다.

 

인스턴스명을 클릭하여 들어가면 개요, 로그 및 콘솔 등으로 인스턴스를 확인할 수 있습니다.

인스턴스 외부 접근 설정(Floating IP)

인스턴스 생성까지 진행했지만 VNC Console로 서버가 구동된 것을 확인했을 뿐 해당 서버에 직접 작업이 가능한 상태가 아닙니다.

따라서 외부에서도 접근하고 ssh를 이용할 수 있도록 설정합니다.

 

먼저 프로젝트 > 네트워크 > Floating IP로 들어가 프로젝트에 IP 할당 버튼을 클릭합니다.

외부에서 프로젝트 내의 인스턴스에 접근할 수 있도록 유동 IP를 할당 받는 작업입니다.

 

아래처럼 96IP를 할당 받았습니다.

오른쪽의 작업의 연결 버튼을 클릭하여 인스턴스랑 연결시켜 줍니다.

인스턴스 화면에서 유동 IP가 연결된 것을 볼 수 있습니다.

외부 접근이 가능하게 하려면 하나 더 작업을 해야 합니다. 바로 보안 정책입니다.

프로젝트 > 네트워크 > 보안 그룹 화면에 들어갑니다.

현재 Default 정책이 하나 있는데 규칙 관리 버튼을 클릭합니다.

규칙 추가를 눌러 ping과 관련된 ICMPSSH TCP 프로토콜을 열어 줍니다.

이제 로컬 PC에서 커맨드 창을 열어 외부에서 접속이 되는지 확인합니다.

ping 192.168.0.96

외부에서 정상적으로 ping이 가는 것을 볼 수 있습니다.

 

마지막으로 다운로드 받은 keypair.pem 파일을 이용하여 ssh에 접속해보겠습니다.

ssh -i keypair.pem ubuntu@192.168.0.96

SSH까지 접속이 되는 것을 확인했습니다.

 

마지막으로 인스턴스 안에서 인터넷이 연결되는 것을 확인해 보겠습니다.

wget google.com

index.html 파일을 잘 받아오는 것을 확인할 수 있습니다.

사내 IaaS 구축 진행과정 설명을 마치도록 하겠습니다.

감사합니다.