본문 바로가기

Technical/Cloud, Virtualization, Containers

[Openstack #1] Mac OS에서 오픈스택(Mitaka v5) 환경 구성 - Multi-node Openstack POC(개념증명)


1. 오픈스택이란?

Openstack은 소규모부터 중대규모를 아우르는 IAAS(Infra As A Service)를 가능하게 하는 오픈소스 클라우드 플랫폼 솔루션입니다. 2010년, Rackspace사의 클라우드 파일 플랫폼과 NASA의 Nebula를 기반으로 통합, 협력하는 방식으로 진행되기 시작한 이 프로젝트의 첫 코드명은 Austin(2010). 이후 Diablo(2011), Essex(2012), Havana(2013), Icehouse, Juno(2014), Kilo(2015), Liverty, Mitaka(2016) 를 거져 2016년 10월에 Newton 버전이 출시될 예정으로 개발이 진행되고 있지요.


Python 언어를 기반으로 만들어진 이 클라우드 플랫폼은 Apache License 2.0 이 적용되어 있기 때문에 상용/비상용에 관계 없이 누구나 자유로이 채택하여 변경, 사용할 수 있을 뿐 아니라, 완성도 면에서 충실하고 잘 관리된 프로젝트의 퀄리티로 인해 수많은 전문가와 기업들이 관심을 가지고 개발에 참여하거나 자사의 제품에서 오픈스택을 지원하기 위해 연구개발을 진행하고 있는 Hot 한 기술 아이템이자 클라우드 컴퓨팅 플랫폼과 네트워킹 분야의 패러다임을 이끌고 있는 녀셕이기도 합니다.


원래는 Spec이 어느 정도 되는 서버 장비가 최소 2대 이상 있어야 설치, 운영을 해 볼 수 있지만, 가정 또는 소규모 연구실에서도 자체 Lab Test 정도는 해 볼 수 있도록 Triple-O(Openstack On Openstack) 구성에 대한 문서를 오픈스택 진영에서 직접 소개하고 있읍니다.

참고: ☞ https://wiki.openstack.org/wiki/TripleO).


2. 들어가며

본 포스팅에서는 필자의 맥북(MacBook Pro Sierra, Quadcore 16GB, SSD 256GB) 상에서 (1) VirtualBox 로 가상머신(CentOS 7.2)을 만들고, (2) Packstack을 이용해서 각각의 가상머신을 Openstack용 controller, Network, Compute 노드로 설치, 설정하여, 만들어진 오픈스택 클라우드 환경에서 (3) 실제로 VM을 생성하고 네트워크로 접속해보고, (4) LBaaS 서비스를 설치한 뒤 LB와 2개의 VM을 이용한 로드밸런싱 환경을 간단히 테스트해 보는 과정 전체를 기술해 둡니다.


중요한 점은, 본인이 포스팅하는 대다수의 블로깅에서 일관되게 지키려고 하는 원칙 중의 하나이긴 하지만, 과정 하나 하나를 직접 내 손으로 수행해 본 결과를 그대로 표현하고 기술함으로써 설치나 설정 과정에서 필요한 원리와 방식에 대해 더 구체적으로 들여다볼 수 있는 기회를 보는 이에게 제공해 주고자 한다는 점입니다. 내가 알지 못하고 무언가를 표현하는 것은, 보는 이에게 도움도 되지 않을 뿐 아니라 시간과 지면 낭비라고 생각하며, 플라스크를 만든 아르민 로나허가 말했듯이, "추상적인 내용보다 구체적인 경험을 나누는 것" 이 더 효과적인 소통과 전달의 수단이 될 수 있기 때문이지요.




본 포스팅의 작업과정에 가장 핵심적인 내용들이 위의 그림에 요약되어 표현되어 있으니, 잘 이해되도록 그림을 자세히 들여다 보기를 권하며, 아래 내용부터는 간략히, 다소 간결한 표현으로 써내려 갑니다.



3. 버추얼박스 가상머신 준비



우선 가상머신에 설치할 OS인 CentOS 7.2 를 다운로드(일반적으로 Ubuntu일 경우 Devstack 을 통해서, CentOS 나 Redhat일 경우 Packstack 을 통해서 Openstack 을 설치하게 됨).


  • VirtualBox 에서 VM 생성


위 그림에 해당하는 4개의 VM을 생성한다. Control 노드는 메모리를 4GB~8GB 정도 주는 것이 좋으며, Admin은 버추얼박스에서 GUI(웹브라우저 사용)이 가능하도록 데스크톱 형태로 설치해야 한다.


  • VM 네트워크 카드(NIC) 설정

그림을 잘 들여다 보면 기본적인 설정사항이 상세히 표시되어 있는데, 본 포스팅에서는 VirtualBox 에서 3가지의 네트워크(각각 외부, 데이터, 관리용)를 준비해야 한다. 이 중에서 외부(External) 네트워크는 인터넷 접속용, 데이터는 VM에 할당되는 서비스 네트워크, 관리용은 Openstack이 VM을 관리하기 위한 용도.

데이터 및 관리용 네트워크는 VirtualBox 의 호스트전용 어댑터 방식(NAT방식으로 해도 작동은 하지만, Virtualbox 내부에서만 동작하는 네트워크이므로 이 정도로 충분함)으로 생성하고, 외부용 네트워크는 맥북 호스트에서 VM에 접속도 가능하고, VM에서 외부 인터넷으로도 접속이 가능하도록 브리지모드로 생성.

호스트전용 어댑더 방식을 위해 아래 그림의 과정과 같이 vboxnet0 네트워크를 우선 생성한다(VirtualBox 환경설정 > 툴바의 네트워크 선택 > 호스트전용 네트워크 선택 > 우측 + 아이콘 클릭).


IPv4 주소는 변경할 필요 없이 그대로 둔다.


DHCP 서버를 눌러서 내용 확인 후 변경 없이 그대로 확인


마우스 커서를 들이대면 설정된 네트워크 정보가 보인다. 그냥 확인.


VM에서 사용할 호스트전용 네트워크가 준비되었으므로 다음 섹션의 VM별 네트워크 구성표에 따라 각각 어댑터를 할당하고 맨 위의 구성도를 보면서 스텍을 적당히 조절하며 4개의 VM을 생성한다. 앞의 3개의 노드들은 가급적 GUI가 없는 서버모드로 OS를 설치해야 하며, 마지막의 Admin VM은 웹브라우저를 통해 Controller VM의 Horizon 웹포탈에 접속해야 하므로 GUI 가 가능하도록 생성하되, 네트워크 정보는 Controller 와 같은 구성으로 하면 운영, 관리에 무리가 없을 것이다.


  • 각 VM 네트워크 카드(NIC) 구성

VM구분

(노드)

 NIC1

 NIC2

 NIC3

방식

(vbox)

장치명

용도

방식

(vbox)

장치명

용도

방식

(vbox)

장치명

용도

 Controller

bridge

enp0s9

API

(외부)

vboxnet0

eth0

control

(관리용)

 

 

 

 Network

bridge

enps09

API

(외부)

vboxnet0

eth0

control

(관리용)

vboxnet0

eth1

tenant

(데이터)

 Compute

 

 

 

vboxnet0

eth0

control

(관리용)

vboxnet0

eth1

tenant

(데이터)


   * 용도별 network segment(IP 대역)

     - API(외부용): 192.168.0.6~ ... Vbox VM외부, 즉 Virtualbox(즉 호스트의 하이퍼바이저 레벨) 에서는 bridge 장치로 인식되며, VM 내부에서는 ifcfg-enp0s9 장치로 관리됨(물리장치명 enp0s9 는 맥북의 경우이며, 일반 조립PC의 RTL 계열 등의 네트워크 카드는 단순히 eth0 와 같은 명칭이 될 수도 있다)

     - Control(관리용): 10.10.10.6~ ... Vbox VM 내부에서는 ifcfg-eth0 로 관리됨

     - Tenant(데이터): 10.10.20.6~ ... Vbox VM 내부에서는 ifcfg-eth1 으로 관리됨

   * 모든 Adapter 는 Virtualbox 에서 생성시 '무작위모드 허용' 으로 설정

   * vboxnet0 방식의 NIC은 모두 '반가상네트워크'로 설정


글 처음에 보이는 시스템 구성도와 아래의 네트워크 구성도는 Openstack 설치, 설정과정의 핵심 구조와 원리를 담은 설계도에 해당하므로 충분히 들여다 보고 잘 이해해 두도록 한다 그래야만 차후에 본인 스스로 실무적 요구사항을 담은 구성도를 직접 그려낼 수 있게 될 것이다.




4. 오픈스택 노드 들의 네트워크 개별 설정 - (1)


이제 위의 구성도와 표에 맞게 각 노드의 네트워크를 세부적으로 설정해 보자


  • 인터넷에서 패키지를 다운로드할 수 있도록 DNS 접속 주소를 설정

# vi /etc/resolv.conf # --> 자신의 인터넷 환경에 맞게 DNS 등록. 잘 모르면 8.8.8.8 하나만.

nameserver 168.126.63.1

nameserver 168.126.63.2


  • Controller 노드

  호스트명을 다음과 같이 변경하고 로그아웃 후, 다시 로그인


# hostnamectl set-hostname openstack-ctrl


  API용 외부 네트워크(enp0s9)

[root@openstack-ctrl ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s9

DEVICE=enp0s9

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=192.168.0.6

NETMASK=255.255.255.0

[root@openstack-ctrl ~]# vi /etc/sysconfig/network-scripts/route-enp0s9

default via 192.168.0.1 dev enp0s9

 

  관리용 내부 네트워크(eth0)

[root@openstack-ctrl ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.10.6

NETMASK=255.255.255.0


[root@openstack-ctrl ~]# systemctl restart network

[root@openstack-ctrl ~]# yum install -y net-tools


  Controller 노드는 Openstack 인프라 내에서 시간동기화(ntpd) 서버 기능을 해야 하므로 다음과 같이 ntpd 서버로 설정한다


[root@openstack-ctrl ~]# yum clean all; yum install -y ntp

[root@openstack-ctrl ~]# vi /etc/ntp.conf

restrict 10.10.10.0 mask 255.255.255.0 nomodify notrap

server kr.pool.ntp.org

server time.bora.net

server time.kornet.net

[root@openstack-ctrl ~]# systemctl enable ntpd

[root@openstack-ctrl ~]# systemctl start ntpd

[root@openstack-ctrl ~]# ntpq -pn


  • Network 노드

  호스트명을 다음과 같이 변경하고 로그아웃 후, 다시 로그인


# hostnamectl set-hostname openstack-net


  API용 외부 네트워크(enp0s9)

[root@openstack-net ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s9

DEVICE=enp0s9

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=192.168.0.7

NETMASK=255.255.255.0

[root@openstack-net ~]# vi /etc/sysconfig/network-scripts/route-enp0s9

default via 192.168.0.1 dev enp0s9

 

  관리용 내부 네트워크(eth0)

[root@openstack-net ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.10.7

NETMASK=255.255.255.0


  데이터용 내부 네트워크(eth1) 

[root@openstack-net ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.20.7

NETMASK=255.255.255.0


[root@openstack-net ~]# systemctl restart network

[root@openstack-net ~]# yum install -y net-tools


  Controller 노드에 맞추어 시간동기화(ntp) 기능을 설정


[root@openstack-net ~]# yum clean all; yum install -y ntp

[root@openstack-net ~]# vi /etc/ntp.conf

server  10.10.10.6

[root@openstack-net ~]# systemctl enable ntpd

[root@openstack-net ~]# systemctl start ntpd

[root@openstack-net ~]# ntpq -pn

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

 10.10.10.6      LOCAL(0)         6 u  92m   64    0   60.402   37.293   0.000


5. 오픈스택 설치를 위한 각 노드 계정 및 네트워크 설정 - (2)


  • Controller, Network, Compute 노드에서 각각 오픈스택 설치/운영을 위한 stack 이라는 계정을 생성하고 권한을 부여
# useradd stack
# passwd stack  # --> specify a password
# echo "stack ALL=(root) NOPASSWD:ALL" | sudo tee -a /etc/sudoers.d/stack
# sudo chmod 0440 /etc/sudoers.d/stack

  • Compute 노드는 외부 네트워크에 직접 연결할 수 있는 NIC이 없음(위의 표: VM NIC 구성표 참조)


시스템 구성도와는 다르게 Compute 노드에 Network 노드처럼 NIC을 하나 더 추가해 주면 되지만, 여기서는 원칙대로 진행한다. 하지만 이렇게 되면 Compute 노드에서 새로운 패키지를 설치할 수 없게 되므로, Network 노드(를 게이트웨이로 해서)를 통해 외부 접속이 가능하도록 해 보자. 우선, Network 노드에서 다음을 수행한다.


# yum install -y iptables-services

# systemctl start iptables

# systemctl enable iptables

# iptables -F

# iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE

# iptables -A FORWARD -i eth0 -j ACCEPT

# service iptables save

# vi /etc/sysctl.conf

net.ipv4.ip_forward=1

# sysctl -p

   ※ [주의1] 붉은 글씨로 표기된 enp0s9 장치명은 Openstack 설치가 완료된 이후에는 br-ex 로 바꿔서 사용되어야 한다. 아래에서 다시 설명함

  • Compute 노드(openstack-cmp1, openstack-cmp2, ...)

  호스트명을 다음과 같이 변경하고 로그아웃 후, 다시 로그인


# hostnamectl set-hostname openstack-cmp1



  데이터용 내부 네트워크(eth1) 

[root@openstack-cmp1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.20.8

NETMASK=255.255.255.0


     다음으로 Compute 노드에서 다음과 같이 네트워크와 게이트웨이를 설정한다.

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.10.8

NETMASK=255.255.255.0

# vi /etc/sysconfig/network-scripts/route-eth0

default via 10.10.10.7 dev eth0

# systemctl restart network
# yum install -y net-tools

# ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

64 bytes from 8.8.8.8: icmp_seq=1 ttl=53 time=45.7 ms

64 bytes from 8.8.8.8: icmp_seq=2 ttl=53 time=39.8 ms ...


  Controller 노드에 맞추어 시간동기화(ntp) 기능을 설정한다


[root@openstack-cmp1 ~]# yum clean all; yum install -y ntp

[root@openstack-cmp1 ~]# vi /etc/ntp.conf

server  10.10.10.6

[root@openstack-cmp1 ~]# systemctl enable ntpd

[root@openstack-cmp1 ~]# systemctl start ntpd

[root@openstack-cmp1 ~]# ntpq -pn

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

 10.10.10.6      LOCAL(0)         6 u  92m   64    0   60.402   37.293   0.000


6. 오픈스택 설치를 위한 각 노드들의 패키지 설정


  • 각 노드의 리포지토리를 변경하고 필수 패키지를 설치


이제 모든 3개 노드(Controller, Network, Compute)에서 BaseRepo 를 다음과 같이 변경하고, 필수 유틸리티와 종속성 패키지를 순서대로 빠짐 없이 설치한다(Openstack 버전에 따라 다소 차이가 있을 수 있으며, 아래는 2016.9월 시점 Mitaka v5 기준). 참고로 활발히 개발이 진행되고 있는 Openstack 의 버전에 따라, 본 포스팅의 경우처럼 다수의 의존성 패키지를 따로 설치하지 않고 yum update 를 통해 기본적인 패키지 업데이트를 진행한 다음, 최소한의 의존성 패키지를 따로 설치하는 경우도 생각해 볼 수 있다.


# vi /etc/yum.repos.d/CentOS-Base.repo

#mirrorlist=...모든 섹션에서 mirrorlist 줄을 comment

#baseurl=...모든 섹션에서 baseurl 줄을 comment, 그 줄 아래에 다음 줄을 각각 추가

baseurl=http://ftp.daumkakao.com/centos/$releasever/os/$basearch/

# yum install -y net-tools

# yum install -y wget


# --> 종속성 패키지 설치

# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/python-markdown-2.4.1-1.el7.centos.noarch.rpm

# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/python-cheetah-2.4.4-5.el7.centos.x86_64.rpm

# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/python-werkzeug-0.9.1-2.el7.noarch.rpm

# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/python-itsdangerous-0.23-2.el7.noarch.rpm

# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/python-flask-0.10.1-4.el7.noarch.rpm

# wget wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.2.1511/os/x86_64/Packages/python-jinja2-2.7.2-2.el7.noarch.rpm

# wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.2.1511/cloud/x86_64/openstack-liberty/common/python-babel-1.3-6.el7.noarch.rpm

# wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.2.1511/os/x86_64/Packages/python-markupsafe-0.11-10.el7.x86_64.rpm

# sudo yum install -y python-pygments

# sudo rpm -ivh python-markdown-2.4.1-1.el7.centos.noarch.rpm

# sudo rpm -ivh python-cheetah-2.4.4-5.el7.centos.x86_64.rpm

# sudo rpm -ivh python-werkzeug-0.9.1-2.el7.noarch.rpm

# sudo rpm -ivh python-itsdangerous-0.23-2.el7.noarch.rpm

# sudo yum install -y  pytz

# sudo rpm -ivh python-babel-1.3-6.el7.noarch.rpm

# sudo rpm -ivh python-markupsafe-0.11-10.el7.x86_64.rpm

# sudo rpm -ivh python-jinja2-2.7.2-2.el7.noarch.rpm

# sudo rpm -ivh python-flask-0.10.1-4.el7.noarch.rpm


  • 각 노드의 /etc/hosts 파일에 다음의 3개 라인을 추가

10.10.10.6 openstack-ctrl

10.10.10.7 openstack-net

10.10.10.8 openstack-cmp1


  • 마찬가지로 각 3개 노드에서 보안 등 각종 관리패키지를 오픈스택 설치가 가능해 지도록 구성

# systemctl disable firewalld

# systemctl stop firewalld

# systemctl disable NetworkManager

# systemctl stop NetworkManager

# yum remove -y NetworkManager

# systemctl enable network

# systemctl start network


# vi /etc/selinux/config #--> liberty 부터는 불필요 해졌으므로 생략

...

SELINUX=permissive

...



7. Packstack 으로 Openstack 자동 설치하기

Packstack은 Controller 노드에서 answer 파일을 읽어 들여서 자신을 포함하여 하위 노드(Network 노드, Compute 노드들)에서 각종 소프트웨어들을 설치/설정하는 스크립트를 단계적으로 실행해 주는 역할을 한다(Redhat 제공 RDO 프로젝트 참고: www.rdoproject.org). 이를 위해 각 하위 노드에 암호 없이 접속이 가능해야 한다. 


  • Controller 노드에서 각 노드로 Passwordless ssh 설정

[root@openstack-ctrl ~]# ssh-keygen 

[root@openstack-ctrl ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.7

[root@openstack-ctrl ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.8


#--> 암호 없이 정상적으로 접속되는지 확인

[root@openstack-ctrl ~]# ssh openstack-net

[root@openstack-ctrl ~]# ssh openstack-cmp1


  • Packstack repo 설정 및 설치 시작

[root@openstack-ctrl ~]# yum install -y https://www.rdoproject.org/repos/rdo-release.rpm

[root@openstack-ctrl ~]# yum install -y openstack-packstack

[root@openstack-ctrl ~]# su - stack

[root@openstack-ctrl ~]# sudo packstack --gen-answer-file=answer.txt

[root@openstack-ctrl ~]# sudo vi answer.txt

=== OVS(Openvswitch) 기반 샘플 answer 파일 다운로드 ===

=== answer.txt 로 복사후 편집, 사용 ===


[root@openstack-ctrl ~]# sudo packstack --answer-file=answer.txt

Welcome to the Packstack setup utility



The installation log file is available at: /var/tmp/packstack/20160828-041734-_nTMcZ/openstack-setup.log



Installing:

Clean Up                                             [ DONE ]

Discovering ip protocol version                      [ DONE ]

Setting up ssh keys                                  [ DONE ]

Preparing servers                                    [ DONE ]

Pre installing Puppet and discovering hosts' details [ DONE ]

Adding pre install manifest entries                  [ DONE ]

Installing time synchronization via NTP              [ DONE ]

Setting up CACERT                                    [ DONE ]

Adding AMQP manifest entries                         [ DONE ]

Adding MariaDB manifest entries                      [ DONE ]

Adding Apache manifest entries                       [ DONE ]

Fixing Keystone LDAP config parameters to be undef if empty[ DONE ]

Adding Keystone manifest entries                     [ DONE ]

...

Adding Nagios server manifest entries                [ DONE ]

Adding Nagios host manifest entries                  [ DONE ]

Copying Puppet modules and manifests                 [ DONE ]

Applying 10.10.10.8_prescript.pp

Applying 10.10.10.7_prescript.pp

Applying 10.10.10.6_prescript.pp

10.10.10.8_prescript.pp:                             [ DONE ]      

10.10.10.6_prescript.pp:                             [ DONE ]      

10.10.10.7_prescript.pp:                             [ DONE ]      

Applying 10.10.10.8_chrony.pp

Applying 10.10.10.7_chrony.pp

Applying 10.10.10.6_chrony.pp

10.10.10.8_chrony.pp:                                [ DONE ]   

10.10.10.6_chrony.pp:                                [ DONE ]   

10.10.10.7_chrony.pp:                                [ DONE ]   

Applying 10.10.10.6_amqp.pp

Applying 10.10.10.6_mariadb.pp

10.10.10.6_amqp.pp:                                  [ DONE ]    

10.10.10.6_mariadb.pp:                               [ DONE ]    

Applying 10.10.10.6_apache.pp

10.10.10.6_apache.pp:                                [ DONE ]   

Applying 10.10.10.6_keystone.pp

Applying 10.10.10.6_glance.pp

Applying 10.10.10.6_cinder.pp

10.10.10.6_keystone.pp:                              [ DONE ]     

10.10.10.6_glance.pp:                                [ DONE ]     

10.10.10.6_cinder.pp:                                [ DONE ]     

Applying 10.10.10.6_api_nova.pp

10.10.10.6_api_nova.pp:                              [ DONE ]     

Applying 10.10.10.6_nova.pp

Applying 10.10.10.8_nova.pp

10.10.10.6_nova.pp:                                  [ DONE ] 

10.10.10.8_nova.pp:                                  [ DONE ] 

Applying 10.10.10.8_neutron.pp

Applying 10.10.10.7_neutron.pp

Applying 10.10.10.6_neutron.pp

10.10.10.8_neutron.pp:                               [ DONE ]    

10.10.10.6_neutron.pp:                               [ DONE ]    

10.10.10.7_neutron.pp:                               [ DONE ]    

Applying 10.10.10.6_osclient.pp

Applying 10.10.10.6_horizon.pp

10.10.10.6_osclient.pp:                              [ DONE ]     

10.10.10.6_horizon.pp:                               [ DONE ]     

Applying 10.10.10.6_ring_swift.pp

10.10.10.6_ring_swift.pp:                            [ DONE ]       

Applying 10.10.10.6_swift.pp

10.10.10.6_swift.pp:                                 [ DONE ]  

Applying 10.10.10.6_heat.pp

10.10.10.6_heat.pp:                                  [ DONE ] 

Applying 10.10.10.6_provision.pp

Applying 10.10.10.6_provision_glance

10.10.10.6_provision.pp:                             [ DONE ]          

10.10.10.6_provision_glance:                         [ DONE ]          

Applying 10.10.10.7_provision_bridge.pp

10.10.10.7_provision_bridge.pp:                      [ DONE ]             

Applying 10.10.10.6_gnocchi.pp

10.10.10.6_gnocchi.pp:                               [ DONE ]    

Applying 10.10.10.6_mongodb.pp

Applying 10.10.10.6_redis.pp

10.10.10.6_mongodb.pp:                               [ DONE ]    

10.10.10.6_redis.pp:                                 [ DONE ]    

Applying 10.10.10.6_ceilometer.pp

10.10.10.6_ceilometer.pp:                            [ DONE ]       

Applying 10.10.10.6_aodh.pp

10.10.10.6_aodh.pp:                                  [ DONE ] 

Applying 10.10.10.6_nagios.pp

Applying 10.10.10.8_nagios_nrpe.pp

Applying 10.10.10.7_nagios_nrpe.pp

Applying 10.10.10.6_nagios_nrpe.pp

10.10.10.8_nagios_nrpe.pp:                           [ DONE ]        

10.10.10.7_nagios_nrpe.pp:                           [ DONE ]        

10.10.10.6_nagios.pp:                                [ DONE ]        

10.10.10.6_nagios_nrpe.pp:                           [ DONE ]        

Applying Puppet manifests                            [ DONE ]

Finalizing                                           [ DONE ]


 **** Installation completed successfully ******


Additional information:

 * Time synchronization installation was skipped. Please note that unsynchronized time on server instances might be problem for some OpenStack components.

 * File /root/keystonerc_admin has been created on OpenStack client host 10.10.10.6. To use the command line tools you need to source the file.

 * To access the OpenStack Dashboard browse to http://10.10.10.6/dashboard .

Please, find your login credentials stored in the keystonerc_admin in your home directory.

 * The installation log file is available at: /var/tmp/packstack/20160906-010456-B6ViYg/openstack-setup.log

 * The generated manifests are available at: /var/tmp/packstack/20160906-010456-B6ViYg/manifests



  • 유의해야 할 사항

본 글에서 제공되는 answer.txt 샘플파일은 2016.9월 시점 Mitaka 기준의 것으로, LBaas 설치 옵션(CONFIG_LBAAS_INSTALL)을 켜게 되면 설치 단계에서 "neutron server 실행 오류가 유발되고 있으므로 초기 설치시에는 일단 제외하고 LBaas는 글 후반에 별도로 다룸


Neutron L2 Agent와 Neutron ML2 Mechanism driver는 openvswitch만을 적용하였다.  메커니즘 드라이버는 필요에 따라 linuxbridge, arista, cisco nexus 등을 여건에 맞게 콤마로 구분하여 추가하면 됨


간혹 설치 중간 중간에 노드의 상태가 불안정하여 오류가 발생하거나 더 이상 진행되지 않는 등의 경우가 생기기도 하는데, 강제 종료 후 다시 시도해 보거나, 전체 노드를 리부트 후 재시도 또는 최악의 경우 VM을 다시 만들어 초기 상태에서 재시도를 해야 하는 경우가 있을 수도 있음


잦은 설치 오류로 인하여 /var/log 디렉토리의 서비스별 로그 디렉토리에 log 파일이 넘쳐서 Vbox VM의 디스크가 Full 될 수도 있음에 유의



8. Network 노드 - Neutron 네트워크(OVS bridge) 인터페이스 설정


이제 설치과정의 막바지. Network 노드의 브리지 인터페이스를 다음과 같이 설정해 주어야 한다 


  • Network 노드 브리지 인터페이스 설정

[root@openstack-net ~]# ifconfig

br-ex: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::b4c4:87ff:fe82:a949  prefixlen 64  scopeid 0x20<link>

        ether b6:c4:87:82:a9:49  txqueuelen 0  (Ethernet)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 13  overruns 0  frame 0

        TX packets 8  bytes 648 (648.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


enp0s9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.0.7  netmask 255.255.255.0  broadcast 192.168.0.255

        inet6 fe80::a00:27ff:fe2f:5037  prefixlen 64  scopeid 0x20<link>

        ether 08:00:27:2f:50:37  txqueuelen 1000  (Ethernet)

        RX packets 27435  bytes 37349433 (35.6 MiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 8894  bytes 643839 (628.7 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 10.10.10.7  netmask 255.255.255.0  broadcast 10.10.10.255

         ...

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 10.10.20.7  netmask 255.255.255.0  broadcast 10.10.20.255

         ...

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifconfig 로 네트워크 구성을 살펴 보면 br-ex(외부 연결 브리지)에는 IP 주소가 할당되어 있지 않고, enp0s9 에 외부 연결용 IP(192.168.0.7)이 할당되어 있는 것을 볼 수 있다. 


이제 enp0s9 에 할당된 외부 네트워크 정보를 br-ex(외부용 브리지 인터페이스) 로 옮기고, ifcfg-enp0s9를 br-ex와 연결하는 작업을 해야 한다. 다음의 과정을 따라가 보자.


[root@openstack-net ~]# cd /etc/sysconfig/network-scripts/

[root@openstack-net ~]# cp ifcfg-enp0s9 ifcfg-br-ex

[root@openstack-net ~]# vi ifcfg-br-ex

DEVICE=br-ex

DEVICETYPE=ovs

TYPE=OVSBridge

BOOTPROTO=static

IPADDR=192.168.0.7

NETMASK=255.255.255.0

BROADCAST=192.168.0.255

GATEWAY=192.168.0.1

DEFROUTE=yes

ONBOOT=yes

NM_CONTROLLED=no

IPV4_FAILURE_FATAL=yes

IPV6INIT=no


[root@openstack-net ~]# vi ifcfg-enp0s9

DEVICE=enp0s9

DEVICETYPE=ovs

TYPE=OVSPort

OVS_BRIDGE=br-ex

ONBOOT=yes

NM_CONTROLLED=no

IPV6INIT=no



[root@openstack-net ~]# systemctl restart network

[root@openstack-net ~]# ifconfig

br-ex: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.0.7  netmask 255.255.255.0  broadcast 192.168.0.255

        inet6 fe80::b49c:2aff:fe19:7e4c  prefixlen 64  scopeid 0x20<link>

        ether 08:00:27:2f:50:37  txqueuelen 0  (Ethernet)

        RX packets 31966  bytes 5704088 (5.4 MiB)

        RX errors 0  dropped 1  overruns 0  frame 0

        TX packets 7268  bytes 1153521 (1.1 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



enp0s9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::a00:27ff:fe2f:5037  prefixlen 64  scopeid 0x20<link>

        ether 08:00:27:2f:50:37  txqueuelen 1000  (Ethernet)

        RX packets 1191146  bytes 714542018 (681.4 MiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 17821  bytes 2222494 (2.1 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

네트워크 재시작 후 네트워크 구성을 ifconfig 로 확인해 보면, br-ex에 외부 연결용 네트워크 정보가 할당되어 있고, enp0s9의 ethernet(MAC) 주소가 br-ex 의 MAC 주소와 동일한 값을 가진 것을 확인할 수 있다.


9. Compute 노드 - 네트워크 게이트웨이 설정


  • Compute 노드에서 외부로 접속할 필요가 있을 경우에만 해당


앞서 설명했듯이 Compute 에는 외부로 직접 연결 가능한 네트워크가 없으므로, Network 노드를 통해서만 외부 접속이 가능하다.  위의 [주의1] 에서 설명한 부분의 파란 글씨에 해당하는 설정을 Network 노드에서 수행(위에서 설명한 대로 enp0s9는 br-ex 로 변경)한 다음 다음과 같이 설정해 두면 된다.


[root@openstack-cmp1 ~]# cd /etc/sysconfig/network-scripts/

[root@openstack-cmp1 ~]# vi ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

IPADDR=10.10.10.8

NETMASK=255.255.255.0


[root@openstack-cmp1 ~]# vi route-eth0

default via 10.10.10.7 dev eth0


[root@openstack-cmp1 ~]# systemctl restart network



Controller 노드의 환경변수 설정 스크립트 복사


  • Network 노드, Compute 노드에서 CLI 명령 실행이 필요할 경우에 대비하여 스크립트 복사


Controller 노드의 keystonerc 관련 파일들을 다음과 같이 Network 노드, Compute 노드에 복사해 둔다


[root@openstack-ctrl ~]# scp keystonerc_* root@openstack-net:~

[root@openstack-ctrl ~]# scp keystonerc_* root@openstack-cmp1:~



10. Horizon 웹을 통해 Cloud 플랫폼 사용 준비 과정


  • Horizon 웹 UI 사용 준비 - 클라우드 네트워크 설정


시스템 구성도의 Admin VM에 해당하는 VM에서, firefox 웹브라우저를 통해 http://10.10.10.6으로 접속, admin 계정과 answer.txt 에서 지정한 암호를 통해 로그인


tenant 서비스를 위해서 demo 프로젝트를 사용한다고 가정했을 때,  해당 프로젝트에서 사용할 네트워크를 생성, 설정하는 과정을 다음과 같이 진행한다.



사용하지 않는 기본 Router 삭제(Admin->System->Router->demo 프로젝트-public라우터), Public 네트워크 정보(Admin->System->Network->admin 프로젝트-public subnet)을 삭제 



networks 패널에서, '+Create Network' 을 선택하고 admin 프로젝트에 대해 public 네트워크를 새로이 생성(본 케이스에서는 vxlan 방식, shared - External network).



생성된 public 네트워크 항목을 선택하여, 하단의 '+Create Subnet' 을 클릭,  실제로 사용할 외부 네트워크 정보(CIDR, Gateway, DNS 등)을 Subnet, Subnet Detail 항목 선택을 통해 각각 등록


admin 계정을 로그아웃하고, tenant 서비스를 설정/사용하기 위한 demo 계정으로 로그인

앞에서 admin 을 통해 생성, 설정한 네트워크를 사용하기 위해, 왼쪽 메뉴에서 Project->Network->Router 패널을 선택하고 '+Create Router' 을 클릭하려 demo 프로젝트에서 사용할 라우터를 생성. External Network 항목에 대해, 앞서 생성했던 public 네트워크를 선택



'+Create Gateway' 클릭을 통해 외부 네트워크와의 연결을 위한 게이트웨이를 설정




'+Add Interface' 클릭을 통해, 앞서 생성한 사설 네트워크와의 연결을 위한 인터페이스를 추가


좌측 메뉴의 Network 패널에서 Network Topology 를 선택하여 현재 구성된 네트워크의 구조를 확인한다. 여기까지 성공적으로 진행하였다면 클라우드 환경을 본격적으로 사용하기 위한 전체 설정 과정은 완료한 것이며, 다음의 필수 준비과정 몇 가지를 거치면 모든 준비가 끝나고 VM을 생성, 관리할 수 있게 됨.


11. VM 인스턴스 생성 관리를 위한 준비 & 실행 단계


  • security Group 생성


  • Key Pair 생성



  • Floating IP 생성



  • VM Image 확인


  • 생성된 VM 목록




12. LBaas(LB As A Service) 의 설정과 테스트


LBaas 의 설치 방법에 대해서는 여기를 주로 많이 참조하게 되는데(Kilo 버전 기준), 현재 시점의 Mitaka에 적용시에 적욥하지 않은 일부 오류가 숨어 있으므로 아래의 내용으로 진행하면 크게 무리 없이 성공적으로 수행 가능



  • Controller, Network 노드에서 각각 haproxy, lbaas 설치
[root@openstack-ctrl ~]# yum install -y haproxy openstack-neutron-lbaas


  • Controller 노드에 driver, plugin 설정
[root@openstack-ctrl ~]# vi /etc/neutron/neutron_lbaas.conf
service_provider = LOADBALANCER:Haproxy:neutron_lbaas.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
[root@openstack-ctrl ~]# vi /etc/neutron/neutron.conf
service_plugins 리스트에 lbaas 추가
[root@openstack-ctrl ~]# systemctl restart neutron-server.service

  • Network 노드에 lbaas agent 설정
[root@openstack-net ~]# vi /etc/neutron/lbaas_agent.ini
device_driver = neutron.services.loadbalancer.drivers.haproxy.namespace_driver.HaproxyNSDriver
user_group = haproxy
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver

[root@openstack-net ~]# systemctl restart neutron-lbaas-agent.service
[root@openstack-net ~]# systemctl enable neutron-lbaas-agent.service

  • Horizon(Controller 노드) 설정
[root@openstack-ctrl ~]# vi /etc/openstack-dashboard/local_settings
'enable_lb': True

[root@openstack-ctrl ~]# systemctl restart httpd.service


이제 Openstack Horizon 에 로그인하여 Network 패널 아래에 Load Balancer 라는 서브 패널이 나타나며, Load balancer 설정 및 사용이 가능해 짐을 볼 수 있다.


다음에 다룰 내용은?


2016년 10월에 Mitaka 후속 버전으로 Newton 버전에 릴리즈되었습니다. 다음에 다룰 내용은 최신의 Newton 버전이 되겠으며, 본 포스팅과 중복되는 부분은 제외하고, 기본적인 설치/설정 과정의 요약 정리와 함께 로드밸런싱을 위한 VM 이미지의 준비, Haproxy 기술을 활용한 LB의 대상이 되는 VM에 웹서버를 설정하고 부하 분산의 작동 테스트를 포함하여, answer 파일의 개별설정과 VM의 HOT(Heat Orchestration Template)에 의한 VM 자동증설(Auto-scale: Scale out/in)에 대해서 다루어 보도록 하겠습니다. 


- Barracuda -