개강과 동시에 이전까지 실습해보던 ONOS, Mininet에서 OvS라고 불리는 Open vSwitch로 방향이 변경되었다. 물론, 다른 블로거나 사람들이 써놓은 글귀를 읽는 것 역시 도움이 되겠지만, 처음 학습하는 만큼 OvS 공식 페이지, OvS GitHub에서 제공하는 문서들을 먼저 보고 있다. 아직까지는 OvS가 정확하게 무슨 역할과 기능을 담당하고, 어떻게 응용될 수 있는지 정확히는 모르겠다. (조금 더 OvS에 대해서 구체적으로 이해한 뒤, OvS란 무엇인가에 대해서 포스팅을 할 예정이다.) 그러나 SDN과 OvS의 관계에 대해서 검색을 해보니 상당히 밀접하게 연관되어 있으며, SDN 구현을 위해 핵심적인 역할을 담당하는 것은 확인할 수 있었다.



OvS에 대한 이론적인 이해에 앞서, 실습을 통해 OvS가 어떤식으로 활용되는지 파악해 볼 요량이다. 공식 페이지에서 제공하는 튜토리얼을 따라해보며, 새로이 알게된 부분에 대해서 정리를 하려한다. 튜토리얼 진행을 시작하자마자 부딪힌 문제는 튜토리얼 진행을 위한 준비물이었다. 사실 공식 페이지에 게재된 튜토리얼 자료를 보면, 다수의 호스트가 필요한 것이 대부분이며, 심한 것은 각각의 호스트에 다수의 NIC 카드가 설치된 환경을 요구하고 있다. 필자는 이들 중에서 조건이 덜 까다로운 것을 꼽아, 실제로 수행 해 본 과정을 기술하려 한다.



Monitoring VM Traffic Using sFlow



이것이 오늘의 튜토리얼 제목이다. 제목을 누르면 공식 페이지에서 제공하는 해당 글을 읽을 수 있도록 링크했으니 참고하기 바란다. 우선 이번 튜토리얼의 목적은 'sFlow Collector'라는 것을 활용하여 두 개의 VM에서 전송되는 트래픽을 모니터링 하는 것이다.



1. 환경설정


위의 그림은 공식 페이지에서 제공하고 있는 그림이다. 오늘 실습을 위해서는 위와 같은 세팅이 필요한데, 일단 두 개의 호스트, 두 개의 피지컬 네트워크가 요구된다. 각각 조건에 대해서 자세히 알아보자.


- Host 1: 실제로 OvS와 KVM을 이용한 버추얼머신들이 올라가는 호스트다. 그림상으로는 두 개의 NIC 카드(eth0, eth1)를 요구하지만, 필자는 해당 조건을 만족하는 디바이스가 없어서, Data Network와 Management Network를 통합하여 하나의 Network만 사용했다. Host 1 세팅을 위해 사용한 머신은 그냥 굴러다니는 Dell PC 하나에 Ubuntu Server 14.04 버전을 사용했다.


- Host 2(Monitoring Host): 모니터링만을 위한 Host 2에는 마찬가지로 굴러다니는 Dell PC 하나에 Ubuntu Desktop 14.04 버전을 사용했다. 이 Host 2에는 sFlowTrend라는 소프트웨어만 설치해서 구동하기 때문에 GUI가 제공되는 Desktop 버전으로 설치했다.


- Data Network: 실제로 두 VM으로 부터 데이터 트래픽을 전송하는 네트워크지만, 가지고 있는 Host 1의 NIC가 하나인 관계로 Management Network와 따로 구분하여 이용하지 않았다. 공식 페이지의 내용에서도 해당 네트워크는 반드시 필요한 것은 아니라고 아래와 같이 명시하고 있다.

For experimentation, this physical network is optional. You can instead connect all VMs to a bridge that is not connected to a physical interface.


- Management Network: 실제로는 Data Network로 나가는 트래픽을 확인을 위한 네트워크였지만, 위와 같은 이유로 Data Network와 구분하여 사용하지 않았다.


Host 2에서 사용하는 sFlowTrend 프로그램은 무료로 제공되는 프로그램인데, Java 환경에서 sFlow를 수집해주는 역할이다. sFlow는 기본적인 5 tuple 정보(Protocol, src/dst IP, src/dst Port)와 L2 정보(MAC, Interface, vLan)까지 바로바로 서버에 정보를 보내주는 방식으로 동작한다.



2. Host 1 Setting


위 그림과는 미묘하게 다른데, 내가 가진 호스트는 OS 설치 당시 eth1을 디폴트로 설정했기 때문에 eth0이 없고, eth1만 있음을 미리 밝힌다. 세팅을 위해서는 상당히 많은 과정이 필요한데, 너무 자세히 다루지 않고 각각의 명령어마다 간략하게 설명을 진행하려한다.


[1]

가장 먼저 Host 1에 업데이트 및 OvS를 설치하도록 하자.

$sudo apt-get update

$sudo apt-get install openvswitch-switch


[2]

다음은 /etc/network/interface 파일을 변경해주도록 한다. 이는 기존의 eth1에 할당된 네트워크 정보를 새로이 만들 브릿지 br0에 물려주기 위함이다. 해당 파일(/etc/network/interface)을 vi 텍스트 편집기로 열어서 eth1에 해당하는 부분을 br0로 변경해주자.

$sudo vi /etc/network/interface


auto eth1

iface eth1 inet static

address    xxx.xxx.xxx.xxx

netmask    xxx.xxx.xxx.xxx

...


$sudo vi /etc/network/interface


auto br0

iface br0 inet static

address    xxx.xxx.xxx.xxx

netmask    xxx.xxx.xxx.xxx

...


[3]

새로운 브릿지 br0를 생성하고, br0에 eth1 포트를 추가해주자.

$sudo ovs-vsctl add-br br0 

$sudo ovs-vsctl add-port br0 eth1

추가한 결과를 확인하기 위해서는 아래의 명령어를 이용한다.

$sudo ovs-vsctl show


명령어를 통해 출력되는 것을 보면, 브릿지 br0에 eth1 포트가 정상적으로 추가된 것을 확인할 수 있다. 필자의 스크린 캡쳐는 튜토리얼이 모두 완료된 상태에서 촬영한 것이므로 다르지만, 브릿지 br0에 포트 eth1이 추가된 것만 확인하도록 하자.





[4]

변경했던 /etc/network/interface 파일이 적용되도록 interface를 내리고, 다시 올린다. eth1의 ip는 0으로 설정한다. 이미 해당 포트를 브릿지 br0에 추가했고, /etc/network/interface 설정에서 br0에 IP를 기존 eth1의 IP로 할당했으므로 네트워크 연결에는 문제가 없다.

$sudo ifconfig eth1 0

$sudo ifconfig br0 0

$sudo ifup br0

$sudo ifconfig br0 up

$sudo ifconfig eth1 up


[5]

VM 생성을 위해 필요한 KVM을 설치하고, VM에 설치할 OS 파일을 다운받도록 하자. 필자는 호스트와 마찬가지로 VM에 우분투 서버를 올렸다. 우분투에서 제공하는 URL이 정상적으로 동작하지 않을 때가 있다. 웹에 검색을 통해 다른 곳에서 제공되는 URL을 통해 다운 받을 것을 권장한다.

$sudo apt-get install qemu-kvm libvirt-bin

$wget https://releases.ubuntu.com/14.04.3/ubuntu-14.04.3-server-amd64.iso


[6]

위 그림에서 확인해보면 각 VM 아래에는 tap들이 달려있는데, 이것이 VM의 NIC 역할을 해주는 것처럼 보인다. 각 VM에서 이용할 tap을 생성하자. 위 그림과는 다르게 VM1에서 사용할 탭의 이름을 tap1, VM2에서 사용할 탭의 이름을 tap2로 생성했다.

$sudo ip tuntap add mode tap tap1

$sudo ifconfig tap1 up


$sudo ip tuntap add mode tap tap2

$sudo ifconfig tap2 up 

ifconfig 명령어를 통해 해당 탭들이 정상적으로 올라왔는지 확인하자. 위의 스크린 캡쳐와 마찬가지로 필자의 상태는 튜토리얼이 모두 완료된 상태이므로 다르게 나타날 수 있다. 필자가 튜토리얼을 진행할 때에는 tap의 이름을 각각 vm1, vm2로 했기 때문에 아래 화면에서 vm1이 곧 tap1이고, vm2가 tap2 다. 모두 완료된 상태에서 글을 작성하기 때문에 네이밍이 다른 점을 양해바란다.





[7]

VM을 생성하고, VM에 다운로드 받았던 OS 이미지 파일을 통해 운영체제를 설치하도록 하자. VM을 총 두 개를 생성하는데, 아무래도 OS 설치과정이 포함되어 있기 때문에 하나 완료하고 나머지 하나를 진행하면 너무 오래걸린다. 두 VM을 병행하여 제작토록하자. 필자가 설치한 운영체제의 이미지 파일명은 ubuntu-14.04.3-server-amd64.iso다.

$sudo qemu-img create vm1.img -f qcow2 10G

$sudo qemu-img create vm2.img -f qcow2 10G


$sudo kvm -m 512 -name vm1 -smp cpus=1,maxcpus=1 -device virtio-net-pci,netdev=net0,mac='EE:EE:EE:EE:EE:55' -netdev tap,id=net0,ifname=tap1,script=no -boot d vm1.img -cdrom ubuntu-14.04.3-server-amd64.iso -vnc :5 -daemonize

$sudo kvm -m 512 -name vm2 -smp cpus=1,maxcpus=1 -device virtio-net-pci,netdev=net0,mac='EE:EE:EE:EE:EE:66' -netdev tap,id=net0,ifname=tap2,script=no -boot d vm2.img -cdrom ubuntu-14.04.3-server-amd64.iso -vnc :6 -daemonize


[8]

VM에 보다 손쉽게 접근하기 위해서 Host 1에는 xvnc4viewer를 설치하고, 윈도우 PC(Host 1, Host 2 외에 컨트롤을 위한 Host)에는 VNC Viewer를 설치하자. 구글링을 통하면 손쉽게 구할 수 있을 것이다.

$sudo apt-get install xvnc4viewer

윈도우에서 VNC Viewer를 실행하면 아래와 같은 화면이 나오는데, Host 1의 IP:5(VM1) 또는 IP:6(VM2)을 입력해주자. 5와 6의 숫자는 위에서 VM을 생성할 때 뒤 쪽에 입력했던 번호다. 즉 [Host 1의 IP:5]를 입력하면 VM1을 원격으로 다룰 수 있으며 [Host 1의 IP:6]을 입력하면 VM2를 원격으로 컨트롤 할 수 있다.





해당 VM에 접속하면 OS 설치하는 화면이 출력되는데, 아마도 네트워크 세팅을 수동으로 해줘야 할 것이다. 각 VM의 IP address는 192.168.0.5, 192.168.0.6으로 할당하여 VNC 번호와 동일하게 하자. 큰 의미는 없고 [MAC 주소의 마지막 숫자, VNC 포트 번호, IP 마지막 번호]를 통일해서 기억하기 쉽게하자는 뜻이다.

IP address: 192.168.0.5  //  192.168.0.6

Netmask: 255.255.255.0  //  255.255.255.0

Gateway: 192.168.0.1  // 192.168.0.1

Name server addresses: 8.8.8.8  //  8.8.8.8            


[9]

설치가 완료되면 각 VM을 일단 종료하자.

$sudo shutdown -P now


[10]

브릿지 br0에 NAT 설정을 위해 MASQUERADE 해주자. VM 내부적으로는 192.168.0.X 대의 Private 망을 사용하는데 VM에서도 Public 망을 이용할 수 있게 끔 NAT 설정을 해주자.

$sudo iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE


[11]

게이트웨이 역할을 위한 브릿지 br_private을 하나 더 생성하고, 각 VM의 tap을 br_private에 연결하자. 그리고 VM이 연결된 br_private를 br0에 연결한다.

//br_private 생성

$sudo ovs-vsctl add-br br_private


//br_private에 VM의 tap을 연결

$sudo ovs-vsctl add-port br_private tap1

$sudo ovs-vsctl add-port br_private tap2


//br0와 br_private을 연결하기 위한 포트를 각각의 브릿지에 생성

$sudo ovs-vsctl add-port br_private po_tobr0

$sudo ovs-vsctl add-port br0 po_toprivate


//br0와 br_private을 연결

$sudo ovs-vsctl set interface po_tobr0 type=patch

$sudo ovs-vsctl set interface po_toprivate type=patch

$sudo ovs-vsctl set interface po_toprivate options:peer=po_tobr0

$sudo ovs-vsctl set interface po_tobr0 options:peer=po_toprivate


[12]

마지막으로 /etc/network/interface 파일에 브릿지 br_private에 대한 정보를 추가하고, 인터페이스를 올리면 마무리된다.

$sudo vi /etc/network/interface


auto br_private

iface br_private inet static

address 192.168.0.1

netmask 255.255.255.0



$sudo ifup br_private

$sudo ifconfig br_private


[13]

다시 VM을 구동시키고, VNC Viewer를 통해 원격으로 접속해보자. 또한 각 VM에서 핑 테스트를 통해 정상적으로 VM이 Public 망에 접속됐는지 확인하자.

// Host 1

$sudo kvm -m 512 -name vm1 -smp cpus=1,maxcpus=1 -device virtio-net-pci,netdev=net0,mac='EE:EE:EE:EE:EE:55' -netdev tap,id=net0,ifname=tap1,script=no -boot d vm1.img -vnc :5 -daemonize

$sudo kvm -m 512 -name vm2 -smp cpus=1,maxcpus=1 -device virtio-net-pci,netdev=net0,mac='EE:EE:EE:EE:EE:66' -netdev tap,id=net0,ifname=tap2,script=no -boot d vm2.img -vnc :6 -daemonize


// VM1 or VM2

$ping www.google.com

핑 테스트가 정상적으로 동작한다면 Host 1의 세팅의 90% 이상이 성공적으로 완료된 것이다.


[14]

sFlowTrend 사용을 위한 설정이 필요하다. Host 1에서 아래의 스크립트를 입력하고, 각 스크립트가 의미하는 바는 공식 페이지의 설명을 참조하길 바란다.

$ COLLECTOR_IP=[Host 2의 IP]

$ COLLECTOR_PORT=6343 (6343: sFlowTrend의 default port #)

$ AGENT_IP=eth1

$ HEADER_BYTES=128

$ SAMPLING_N=64

$ POLLING_SECS=10


$sudo ovs-vsctl -- --id=@sflow create sflow agent=${AGENT_IP} target=\"${COLLECTOR_IP}:${COLLECTOR_PORT}\" header=${HEADER_BYTES} sampling=${SAMPLING_N} polling=${POLLING_SECS} -- set bridge br0 sflow=@sflow



3. Host 2(Monitoring Host) Setting


[1]

sFlowTrend 설치 이전에 Java 설치 및 PATH 설정이 선행되어야 한다. vi 텍스트 편집기로 /etc/bash.bashrc 파일을 열어서 아래의 한 줄을 추가해주자. 

$sudo apt-get install openjdk-7-jdk

$sudo vi /etc/bash.bashrc


//추가할 부분

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64


$sudo -s

#source /etc/bash.bashrc


[2]

자바 설치 및 PATH 설정이 완료되면, sFlowTrend 다운로드 페이지로 이동하여 Linux Installer를 다운 받고 설치하자. 해당 파일은 쉘 스크립트 파일로 작성되어있는데, 실행이 안된다면 chmod 명령어를 이용하여 권한을 변경한 뒤 실행해보자. 정상적으로 실행되면 Starting Installer... 라고 출력되면서 설치화면이 나올 것이다. 참고로 Host 2는 GUI를 제공하는 Ubuntu Desktop 환경이다. 설치 화면이 안내하는 대로 따라하면서 설치를 완료하자. 그리고 프로그램을 실행시켜보면, 아래와 같은 화면이 나올 것이다.





[3]

화면 우측 아래에 초록색으로 불빛이 깜빡이는데, 이 불빛이 바로 Host 1으로 부터 sFlow 데이터를 수신하고 있음을 의미한다. 프로그램을 실행하면 가장 먼저 나오는 것이 Dashboard지만 각 탭으로 들어가서 확인해보면 다양한 형태로 시각화되는 것을 확인할 수 있다. 또한 지금은 시각적으로 크게 변하는 것을 확인할 수 없지만, 각 VM에서 큰 용량의 파일을 보내거나, 다운 받으면 그래프의 형태가 급진적으로 변하는 것을 알 수 있다.







4. 마치며...


사실 해당 튜토리얼보다 어려웠던 것이 Host 1을 세팅하는 부분인데, 내가 이전에 선배들이 제작한 관련실습자료를 따라해 본 경험이 있어서 큰 문제 없이 진행할 수 있었다. 튜토리얼 실습을 통해서 OvS를 사용법은 어느정도 숙지할 수 있었지만, 실제로 OvS를 어떤식으로 이용할 수 있을 지는 여전히 궁금하다. 공식 페이지에서 제공하는 다양한 OvS 관련 튜토리얼을 수행해보고, 관련된 논문이나 글귀를 참조하여 OvS를 능숙하게 다루고, 이용할 수 있도록 성장해야겠다. 또한 sFlowTrend는 비록 모니터링을 위해서 사용했던 소프트웨어지만, 데이터를 다양한 포맷으로 시각화하여 제공하므로 제법 유용하게 사용할 수 있을 것 같다. 아직은 시각화 된 자료를 이해하고 분석하는 역량이 부족하여, 제공되는 자료를 충분히 활용하지 못하는 것 같다. 다시 한 번 꼼꼼하게 시각화된 그래프와 자료들을 살펴봐야 겠다.



5. 참고


http://openvswitch.org/support/config-cookbooks





 개강을 앞두고 연구실 생활을 하면서 OvS나 Kafka, Flume, Docker, Mesos, Spark, Zeppelin 등 이전까지는 접해보지 못했던 다양한 것들을 얕게나마 경험하고 있다. 그 중 오늘 포스팅할 소재는 ONOS라는 것으로, 필자도 오픈소스 프로젝트의 일환이자 SDN 및 NFV와 밀접한 연관이 있다는 것을 알고있을 뿐 정확하게는 프로젝트의 의미를 이해하고 있지 않다. 학습을 진행하면서 부족한 부분을 진행하기로 하고, 오늘은 이 ONOS 설치에 대한 이슈를 정리하고자 한다. 사실 어제 몇 시간동안 설치를 시도했으나 성공하지 못했다. 그런데 이전까지 진행됐던 과정을 모두 제거하고, 새로이 설치를 진행해보니 무난하게 잘 되어 진행 과정을 정리해본다. 글에 앞서 설치에 정말 큰 도움을 준 블로그가 있어서 감사의 말씀을 전한다.


먼저, 필자는 Ubuntu Desktop 14.04 LTS 64bit를 이용해 설치를 진행했음을 알린다.


1. GIT


 ONOS 설치를 위해서는 사전에 몇 가지 과정이 선행되어야 하는데, 따라해보면 그리 어렵지 않다. 대부분의 오픈소스들이 그러하 듯 ONOS 역시 Git Repository를 통해 소스를 배포하므로 GIT 설치를 진행해보자.

$ sudo apt-get install git


2. JAVA 1.8


 다음은 ONOS가 동작하기 위해 필요한 자바 1.8 버전을 설치가 필요하다.

$ sudo apt-get install software-properties-common

$ sudo apt-apt-repository ppa:webupd8team/java

$ sudo apt-get update

$ sudo apt-get install oracle-java8-installer


 설치된 자바의 환경설정을 위해서 아래의 명령어를 이용하고, 정상적으로 설정이 되었는지 확인해보자.

$ export JAVA_HOME=/usr/lib/jvm/java-8-oracle

$ env | grep JAVA_HOME


3. Maven, Karaf


 ONOS는 Maven과 Karaf를 이용하여 실행과 컴파일이 진행된다. 아직 Maven, Karaf에 대해서는 아는 내용이 없는데, 추후 학습이 진행되면서 추가해 볼 생각이다. ONOS에서 제안하는 Maven 및 Karaf 버전은 Apache Maven 3.3.1, Apache Karaf 3.0.3이므로 해당 버전을 다운받고, 적당한 폴더에 압축을 해제하자.

$ cd ~ 

$ mkdir Applications

$ cd Downloads

$ wget http://download.nextag.com/apache/karaf/3.0.3/apache-karaf-3.0.3.tar.gz

$ wget http://archive.apache.org/dist/maven/maven-3/3.3.1/binaries/apache-maven-3.3.1-bin.tar.gz

$ tar -zxvf apache-karaf-3.0.3.tar.gz -C ../Applications

$ tar -zxvf apache-maven-3.3.1-bin.tar.gz -C ../Applications


4. ONOS Source Download


 이전에 설치했던 GIT을 이용하여, 이제 ONOS 소스를 다운 받자. 다양한 버전을 받을 수 있는데 필자가 사용한 버전은 onos-1.4 버전이다.

$ cd ~

$ git clone https://gerrit.onosproject.org/onos

$ cd onos

$ git checkout onos-1.4

$ git pull --rebase origin master


5. 환경설정


 정상적으로 동작하기 위해서 ONOS 환경설정이 필요하다. 아래의 내용은 부팅할 때마다 해줘야한다. 이 과정이 귀찮다면, 쉘 스크립트로 작성해서 저장해도 무방하다.

$ export ONOS_ROOT=~/onos

$ source $ONOS_ROOT/tools/dev/bash_profile


 위의 설정을 해도 정상적으로 동작하지 않는 경우가 발생했는데, 지인으로부터 해결책을 받을 수 있었다. 위 코드와 더불어 아래의 내용을 /etc/profile에 추가해주자.

$ sudo vi /etc/profile


JRE_HOME=/usr/lib/jvm/java-8-oracle/jre

MAVEN_HOME=~/Applications/apache-maven-3.3.1

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$M2_HOME/bin

export JRE_HOME

export MAVEN_HOME

export PATH



6. ONOS 설치


 환경 설정까지 끝마쳤다면, Maven을 사용하여 ONOS를 빌드해보자.

$ cd ~/onos

$ mvn clean install


 정상적으로 이전 과정들이 진행되고, 환경설정이 완료되었다면 문제없이 빌드가 완료될 것이다. 해당 코드에는 빌드 후 테스트 과정이 포함되어있기 때문에 시간이 꽤나 소요되므로 인내를 가지고 기다려보자. 성공적으로 빌드가 완료되었다면 BUILD SUCCESS라는 메시지를 확인할 수 있을 것이다.


7. ONOS 실행


 실행에 앞서 ONOS가 실행되는 IP를 세팅해줘야 한다. SDN 컨트롤러의 IP를 설정해주자.

$ export ONOS_IP=<ONOS IP Address>


 이제 모든 준비가 완료되었다. ONOS를 실행시켜보자.

$ ok clean


 아래와 같은 화면이 출력된다면 정상적으로 ONOS가 동작중인 것이다.




8. 마치며...


 막상 설치를 하고보니 크게 어려운 과정은 아니었지만, 설치과정에서 반복되는 오류가 어디에서 발생한 것인지 알아내는 것이 어려웠다. 되짚어보면 환경 설정하는 부분에서 정상적으로 설정되지 않아서 발생한 문제 같은데, 모든 내용을 지우고 반복해보니 이상없이 설치되는 것을 확인할 수 있었다. 이에 앞서, 버추얼박스를 이용하여 ONOS Tutorial을 수행해봤는데, 너무 무겁게 돌아가는 탓에 아예 반응을 하지 않을 정도로 심한 렉이 생겨서 VM을 이용한 ONOS 구동은 포기했다. 아직 정확히 ONOS가 무엇인지, 무슨 기능을 제공할 지 아는 것이 없지만 시작이 반이라는 말처럼, 앞으로 ONOS에 대한 학습을 진행해보려 한다.


9. 참고


http://sola99.tistory.com/

http://uni2u.tistory.com/41