# 설치환경


OS X Yosemite (ver. 10.10.5)

Intel core i5(2.7GHz)

8GB RAM


Ubuntu 14.04 (Virtual Box) 

DevStack (Kilo)



# 설치진행


* docker는 기본적으로 Host OS위에 새로운  OS를 생성하지 않고 Host OS의 자원을  system call을 사용하여 사용하기 때문에(cgroups, namespace) root 권한이 필요



1. Virtual Machine 생성



- Ubuntu 14.04

- 2 cpus

- 2GB ram

- network 

net 1 : NAT

net 2 : bridge network




2. 설치 후 기본설정

: 네트워크 ip, 패키지다운로드 및 파이썬 모듈을 사용하기 위한 패키지 설치 등등


$ apt-get update

$ sudo apt-get -y install git git-review python-pip python-dev

$ sudo apt-get -y upgrade



3. Docker 설치


> GPG Key 및 docker repo 추가

$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

* 한번씩 서버가 죽는 거 같아 한번은 다른 서버찾아서 했는데.. 잘 모르겠음....



$ sudo vi /etc/apt/sources.list.d/docker.list

deb https://apt.dockerproject.org/repo ubuntu-trusty main    ; on Ubuntu Trusty 14.04 (LTS)




$ sudo apt-get update



> docker 설치 사전 확인 조치


$ sudo apt-get purge lxc-docker



$ apt-cache policy docker-engine




> 추가 권장


대상 : Ubuntu 14.04 Trusty (LTS), 15.04 Vivid, 15.10 Wily

내용 : "linux-image-extra" kernel package 설치

이유 : "aufs" storage driver 지원

*aufs 참고 url : http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/12/docker/aufs


$ sudo apt-get install linux-image-extra-$(uname -r)


 


> docker 설치 진행


$ sudo apt-get install docker-engine




> 확인 


$ sudo service docker start

$ sudo docker run hello-world

sudo service docker restart




> 옵션 사항


sudo usermod -aG docker user


* docker daemon은 TCP port 대신에 UNIX socket에 바인드 함

UNIX Socket은 sudo 권한을 가져야 하기때문에 docker daemon은 항상 root 권한으로 실행되어야 함 

> docker 커맨드에서 sudo를 사용하지 않기 위해서 "docker"라는 Unix Group과 user를 등록.

docker daemon이 실행될 때, docker group에 Unix의 R/W 가능한 권한을 부여함


$ sudo vi /etc/default/grub

GRUB_CMDLINE_LINUX="cgroup_enale=memory swapaccount=1"


WARNING: Your kernel does not support cgroup swap limit. WARNING: Your

kernel does not support swap limit capabilities. Limitation discarded.

이런 메시지가 나온 경우, 메모리 스왑부분 설정




sudo update-grub



$ sudo reboot now



> docker 설치 확인


$ docker --version





4. OpenStack(Devstack, nova-docker plusgin) 설치


> nova-docker plugin 설치 진행


$ git clone -b stable/kilo https://github.com/stackforge/nova-docker.git

$ cd nova-docker

/nova-docker$ sudo pip install .






> nova-docker plugin 설치 확인


$ sudo pip list | grep nova-docker




> OpenStack Devstack 설치


$ git clone -b stable/kilo https://github.com/openstack-dev/devstack.git





$ cd devstack

/devstack$ vi local.conf



local.conf는 여기서 복사해서 사용했음.

https://github.com/smakam/openstack/blob/master/docker/local.conf_novadocker

* novnc 기능의 사용을 위해 "enable_service n-novnc"를 추가 

* public network gateway 지정하기



/devstack$ ./stack.sh


> 설치완료



> nova rootwrap filter 설정

$ sudo cp nova-docker/etc/nova/rootwrap.d/docker.filters /etc/nova/rootwrap.d/ 


* openstack rootwrap : https://wiki.openstack.org/wiki/Rootwrap




5. nova with docker 


> Openstack 사용권한


$ cd devstack

/devstack $ . openrc admin


* demo는 . openrc demo


=> . openrc admin를 수했했는데, glance 이미지랑 인스턴스가 demo tenant로 생성되길래 환경변수 뿌려보니..

tenant name이 demo 였음


OS_TENANT_NAME="demo"

OS_USERNAME="admin"



> docker 이미지 생성


$ docker pull nginx    ; 받아오기


* 검색 : docker search ubuntu





$ docker images    ; 확인




$ docker save nginx | glance image-create --is-public=True --container-format=docker --disk-format=raw --name nginx    ; glance image로 등록




$ glance image-list    ; 확인




$ nova boot --flavor m1.small --image nginx nginxtest    ; 인스턴스 생성




$ docker ps    ; docker 동작 process 확인



$ nova list    ; instacne 확인




6. dashboard









# Ubuntu 컨테이너 기반의 인스턴스 생성


> search 명령어 사용




> ubuntu 이미지 pulling



* 버전 명시는 저런식으로 가능



> docker 이미지 저장 후 glance 이미지로 등록





> Dashboard 확인




> 인스턴스 생성




vnc 접속이 안되서 해당 옵션 주고 다시 시도...

devstack은 서비스가 아닌 screen기반이라고 함(정확히 뭔지는 모르겠지만)

nova.conf를 수정한 후 screen update를 수행해 적용할 수 있음


네트워크 설정해야함

























































OpenStack 소스레벨 접근하기


[inatall script]


[API 사용하기]

# dev Doc

# SDK

- jcloud : 클라우드 관련하여 거의 모든 소스를 커버하고있음

  > github에 올라간 잘 짜여진 예제 소스들 참고하자!

- pkgcloud 


[contribute]

- openstack.org에서 회원으로 가입 한 후 개발자커뮤니티와 연동하여 개발

- 슬쉐에 공유된 부대표님 ppt보고 해보자


[writings]

- 개발자가 알아야할 가상화 정보를 많이... 가이드? 해주고있다..


-----------------------------------------------------------------------------------------



1. keystone

 $ keystone user-list

 $ keystone --debug user-list
   : curl부분이 실제 실행되는 부분

root@ubjuno-contnet:~# which keystone
/usr/bin/keystone

$ vi /usr/bin/keystone

* 다른곳의 소스를 imporing만 하고있음.
그부분을 찾자!


root@ubjuno-contnet:~# ps -ef | grep keystone
keystone  2471     1  3 19:42 ?        00:01:03 /usr/bin/python /usr/bin/keystone-all
keystone  3849  2471  0 19:43 ?        00:00:00 /usr/bin/python /usr/bin/keystone-all
keystone  3850  2471  0 19:43 ?        00:00:00 /usr/bin/python /usr/bin/keystone-all
keystone  3851  2471  0 19:43 ?        00:00:00 /usr/bin/python /usr/bin/keystone-all
keystone  3852  2471  0 19:43 ?        00:00:00 /usr/bin/python /usr/bin/keystone-all
root      9110  8463  0 20:17 pts/1    00:00:00 grep --color=auto keystone
root@ubjuno-contnet:~#
root@ubjuno-contnet:~# which keystone-all
/usr/bin/keystone-all
root@ubjuno-contnet:~#
root@ubjuno-contnet:~# vi /usr/bin/keystone-
keystone-all     keystone-manage
root@ubjuno-contnet:~# vi /usr/bin/keystone-all

* main을 찾아요. main이 구현되어있음.

* wsgi, 데몬으로 서비스가 http프로토콜의 경우 웹서버를 띄우지 않아도 웹서버에 올려준거처럼 되어있음
(일반적으로 wsgi는 웹서버의 기능을 떼어 위의 부가서비스들을 따로 운영하게 한다. 미니멀을 지향?, 해당 부가서비스들은 쓰레드로 동작되어 콜되어지는 형태)
* monkeypatch
 - use_eventlet()에 넣어서 돌리면 스레드를 돌려서(green이라는 스레드 풀같은걸로) wsgi로 올려서 OpenStack상의 데몬을 띄운다.


=>임베디드 어쩌고저쩌고?


* 웹에서 쓰레드가 필요한 이유...? 웹서비스들을 스레드로 돌려야 가벼움(자원을 공유하므로)


* admin_workers / public_workers를 구분하여 

server로 ㄱㄱ


root@ubjuno-contnet:~# vi /usr/lib/python2.7/dist-packages/keystone/openstack/common/service.py

- python 2,3버전 대는 완전 다름.
- 소스단에서의 가상화라는 것을 제공하는데(3버전), 가상화하여 묶어서 소스영향력을 줄인다.

* 파이썬 라이브러리들은 지속가능한 걸 선호해야함(너무 금방 사라져버리니까.. 안정화된 걸 골라써야햇)

* tree명령어로 keystone 구조보기
$ tree -L 1 /usr/lib/python2.7/dist-packages/keystone

* 파이썬도 컴파일을 하면 중간코드 형태로 파일이 떨어진다. (.pyc)
*

root@ubjuno-contnet:~# tree -L 1 /usr/lib/python2.7/dist-packages/keystone/auth/
/usr/lib/python2.7/dist-packages/keystone/auth/
├── controllers.py
├── controllers.pyc
├── core.py
├── core.pyc
├── __init__.py
├── __init__.pyc
├── plugins
├── routers.py
└── routers.pyc

1 directory, 8 files


root@ubjuno-contnet:~# tree -L 1 /usr/lib/python2.7/dist-packages/keystone/assignment/
/usr/lib/python2.7/dist-packages/keystone/assignment/
├── backends
├── controllers.py
├── controllers.pyc
├── core.py
├── core.pyc
├── __init__.py
├── __init__.pyc
├── routers.py
├── routers.pyc
├── schema.py
└── schema.pyc

1 directory, 10 files


root@ubjuno-contnet:~# tree -L 1 /usr/lib/python2.7/dist-packages/keystone/assignment/backends/
/usr/lib/python2.7/dist-packages/keystone/assignment/backends/
├── __init__.py
├── __init__.pyc
├── kvs.py
├── kvs.pyc
├── ldap.py
├── ldap.pyc
├── sql.py
└── sql.pyc

0 directories, 8 files

* identity controllers : 메소드와 url을 매핑해주는 로직
- v2 deprecated... 
- v3_to_v2() : 현재 버전 2를 버리지 못하고 해당 함수등을 사용해서 v3로 그냥 맵핑을 시켜주는 형태로 가고있음. 나중에 v2는 한번에 버릴 수 있겠지..

root@ubjuno-contnet:~# vi /usr/lib/python2.7/dist-packages/keystone/assignment/backends/sql.py
* sql 만들기
* create table...
=> DDL, SQL RPM .. 왜 이부분에 프로그래머블하게 SQL을 만들어서 쿼리하는 식으로 가는건가?
-> 결론... sql을 몰라도 (여러 DB를 다룰때..) 정책적으로 SQL 생성이 가능하도록...



# ERD 

여기까지 MVC!
-------------------------------------------------------------------------

root@ubjuno-contnet:~# vi /usr/lib/python2.7/dist-packages/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py
: ovs를 구동시키는 소스들이 다 들어있네

* 전통적인 아주 예전 스타일의 소스코드 스타일인 이유.... 
- 스레드 풀을 받아오기 위해 일수있어,
- 하지만 인프라에대한 소스인데 어쩜 이럴 수 있지?


root@ubjuno-contnet:~# vi /usr/lib/python2.7/dist-packages/neutron/agent/dhcp_agent.py
* dhcp agent
- 런처(server)처럼 떠있다가 dnsmasq를 제어하는 형식





할거 많다...............

------------------------------------------------------------------
 453  tree -L 1 /usr/lib/python2.7/dist-packages/
 454  tree -L 1 /usr/lib/python2.7/dist-packages/keystone
 455  tree -L 1 /usr/lib/python2.7/dist-packages/keystone/auth/
 456  tree -L 1 /usr/lib/python2.7/dist-packages/keystone/middleware/
 457  tree -L 1 /usr/lib/python2.7/dist-packages/keystone/assignment/
 458* tree -L 1 /usr/lib/python2.7/dist-packages/keystone/assignment/b
 459  tree -L 1 /usr/lib/python2.7/dist-packages/




------------------------------------------------------------------

[이 외...]

oslo
분산처리
하둡
디자인패턴

파이썬 <-> R 











# 테스트 항목

1. Windows 7 professional 64bit

2. WIndows Server 2012 

3. Ubuntu 12.04 Cloud용 

4. Centos 



# 테스트 목적

1. 실제 클라우드 리소스가 어느정도로 퍼포먼스를 내는지 확인하기 위함..


# 차후 목표

1. 그냥 간단히 막쓰는 private cloud를 제공하는 서버를 만들고

2. HA나 Proxy, DB, Web서버 구축

3. 아두이노 센서 데이터를 받아서 분석....


# 사전에..

> 리눅스에서 자원사용 확인하기 http://jiming.tistory.com/admin/entry/post/?id=63


참고사이트 :
1. Openstack Document
http://docs.openstack.org/image-guide/content/windows-image.html
2. 위 문서대로 진행한 한국블로그
http://heavenkong.blogspot.kr/2014/04/create-windows7-virtual-machine-image.html
2. cloudbase init & windows7 & openstack
http://cloud-ninja.org/2014/05/14/running-windows-7-guests-on-openstack-icehouse/
3. cloud-init for Windows instances (www.cloudbase.it)
http://www.cloudbase.it/cloud-init-for-windows-instances/

[출처] http://heavenkong.blogspot.kr/2014/04/create-windows7-virtual-machine-image.html

Create Windows7 Virtual Machine Image for OpenStack

Reference:
http://docs.openstack.org/image-guide/content/

  1.  virt-manager 
  2.  VirtIO driver
  3.  Sysprep
  4.  Cloudbase.init 


Requirements: 

windows7 iso file: 
http://www.w7forums.com/threads/official-windows-7-sp1-iso-image-downloads.12325/
select version by language ~
virtIO iso file:
http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/
select iso file to download ~
cloudbase.init fle: 
http://www.cloudbase.it/cloud-init-for-windows-instances/
Here select https://www.cloudbase.it/downloads/CloudbaseInitSetup_Beta.msi file to download ~

1. Using virt-manager
yum install libvirt
yum install qemu-kvm
yum install virt-manager

service libvirtd start
virt-manager

New VM -> Name: vm_windows& -> Choose "Local install media(ISO image or CDROM)"
Use ISI image:
/root/openstack-images/X17-24329.iso
OS type:
Windows 7 

Memory 2048MB
CPUs 2

Select managed or other existing storage ( This is for adding virtual CD of installing VirtIO Driver)
New volume Name: vm_windows7.img
Format: qcow2
Max Capacity: 20000MB(20GB)
Allocation: 20000MB(20GB)

Forward
click customize configuration before install (This is for adding new hardware)
Finish
Add Hardware

select managed or other existing storage
Browse: /root/openstack-images/virtio-win-0.1-74.iso
Device type: IDE cdrom

Click Begin Installation

Click Next ~
2. Load driver as shown below ~
Begin to install ~
Restart ~
User: kisti
PW: ****
It will be shown as follow~

3. sysprep Run
In windows7, there is a tool called sysprep for use as a virtual machine image.
C:\Windows\System32\sysprep
execute sysprep.exe file
Click General (일반화)
OK(it needs to restart the windows7)


4. Install cloudbase.init

Install cloudbase.init


5. Other settings
Ethernet 컨트롤러 driver install
computer right click -> 관리-> 장치 관리자

load VirtIO driver and update ~ After updated as shown bellow~

shutdown Windows ~
6. Get image file
In the default directory /var/lib/libvirt/images, will find vm_windows7.img file ~
Run this command, virsh undefine vm_windows7

then you can use this image file to create virtual machine with windows7 in openstack ~

하다 보면 생성된 이미지가 블루 스크린(blue screen)이 뜨면서 설치 오류가 나는걸 볼수 있는데 해결 방법은 guest windows7에 microsoft .Net framework를 설치하면 된다. 

따로 설치할 필요없이 윈도우 오피스를 깔면 포함되어 설치가 된다. 


[출처]http://heavenkong.blogspot.kr/2014/04/create-windows7-virtual-machine-image.html


<www.cloudbase.it  서비스들>
- OpenStack Compute Installer
- Cloud-Init for WIndows instances
- Neutron Hyper-V plugins
- OpenStack Cinder-Volume on Windows Storage Server 2012
- OpenStack Windows Server 2012 R2 Evaluation
- OVS on Hyper-V
등등 많음

[OpenStack 정기세미나]

일시 : 2015.01.15 (목) 19:00~21:30
장소 : 토즈 강남2호점
내용 :
  Session 1. 다른 시각으로 본 SDN - 포티넷 코리아 이상훈님
  Session 2. 개발자분들을 대상으로 네트워크 엔지니어가 바라보는 오픈스택 네트워킹
                     - KrDAG 서종호님
  Session 3. OpenStack 네트워크와 SDN - KrDAG 최영락님



< Session 1. 다른 시각으로 본 SDN >

#1. SDN 삼국지
a. IBM, HP등의 회사들이 End-to-End로 IT를 점령하던 시기에서
b. IT 산업혁명을 거치며 소품종 대량생산 체계로 전환
    - OS-HW 분리
    - 전문 Chipset 회사
    - 분야별 SW 분리
e. 네트워크 업계에선 Cisco같은 벤더들이 승승장구
    - 전문 ASIC 자체 개발
    - 전용 network OS를 만들어 제품에 탑제
    - 전용 Protocol 개발
f. 이렇게 30년... 다품종 소량생산 체계로 전환
g.  더이상 네트워크 업계에서는 돈이 안되기 시작
h. 네트워크 벤더들이 서버쪽으로 접근하기 시작(예로 Cisco가 스토리지와 서버를 만듬)
i. SOA + 사용자(SNS)를 기반으로 SDN 등장
    - Cisco.. 무겁고 비싸고 Cisco가 배신해서 횡포라도 부리는 날엔..? OTL
      => SDN의 개념이 대두

#2. SDN의 개념
    - 실체의 갭
    - 바라보는 시작의 차이 (SDN은 네트워크계의 SOA ??)

#3. 각자의 시점
a. ISP 입장에서의 SDN
    - 관리의 자동화
    - 리소스 최적화
    - NFV와의 연계
b. 클라우드 사업자 입장
    - Multi Tenant (기존과는 비교할 수 없이 굉장이 많은 숫자의 테넌트를 나눌 수 있게 됨)
    - VPC (아마존서비스)
c. 그외
    - 범용 Chip 기반
    - 활성화
    - 자동화
    - 네트워크를 벗어난 비지니스와의 연계


< Session 2. 개발자분들을 대상으로 네트워크 엔지니어가 바라보는 오픈스택 네트워킹 >
#1. 네트워크 기본지식
a. IP
b. NAT
    - 1:1 NAT : DNAT
    - 1:N NAT : SNAT
c. VLAN
    - 같은 물리네크워크 환경에서 여러개의 가상 네트워크로 분리
d. 802. 1Q Trunk
    : 서로다른 VLAN 패킷을 태그를 달아서 패킷을 구분하기위해 사용
e. 단말 IP 할당
    - 수동
    - 자동 : DSCP, Dnsmasq(nova에서 DHCP를 위해 실행되는 프로세스)
f. LAN 확장
    - 아무생각없이 LAN 화장시 문제가 발생 할 수 있음
    - 대량의 백그라운드 트래픽 발생(broadcast등)
    - 보안상 문제 발상
g. VXLAN
 : L3환경을 넘어가는 두 네트워크 그룹을 같은 네트워크 환경으로 제공할 수 있게하는 기술

#2. nova network
a. flat : 1개 네트워크만 사용가능. 수동으로 instance ip를 할당
b. flat DHCP : flat에다가 DHCP 가능
c. VLAN : 테넌트간 동일 네트워크 설정이 불가능. 4096개라는 갯수 제약
            : 물리 케이블은 1개이지만 VLAN태그를 사용해 여러개의 테넌트로 나눌 수 있음
    - 내부 다수 VM이 SNAT을 통해 public ip로 변환되어 외부 통신
      (다수 단말이 하나의 공인 IP를 가지고 NAT 수행)
    - 외부에서 내부 VM의 floating ip로 들어올때는 DNAT을 사용해야 함.
d. single host & multi host
    - single host - 장비가 죽거나 부하가 걸리면 ..?
    - multi host - (compute노드 + network 노드), neutron에서의 DVR

#3. Neutron
a. namespace기능
    - over lapping ips 가능 : 테넌트 별 동일 네트워크를 쓸 수 있게 해줌
    - plugin <ml2> : 컴퓨팅 노드간 서비스 할 수 있고, 벤더의 기능을 plug 할 수 있음
b. network node와 compute node간의 네트워크는 VLAN, VXLAN, GRE등의 Host간 데이터를 전송
c. 네트워크 모델
    - provider router with private network
        : 테넌트가 분리되어 있으나 같은 라우터를 공유해 서로 통신이 됨
    - pertenent routers wih privae network
        : 테넌트 별 라우터가 분리되어있음
d. DVR 개념
    - single host
    - multi host : network node를 경유하지 않고 compute node끼리 통신이 가능하게 함
e. plugin
    - NSX
    - midekhura의 midonet
    - Arista + F5
    - Cisco, Juniper

# 4. 서비스
    - LBaaS
    - VPNaaS : vPC on AWS : Cisco CSR1KV
    - FWaaS : 라우터 단에서 제어


< Session 3. OpenStack 네트워크와 SDN  >
#1. nova network
a. Fixed IP
b. Float IP
c. 구성방안
    - Flat (곧 없어질 예정)
    - Flat DHCP
        : 수동으로 IP할당하기 힘드니가 linux의 오픈소스 DHCP서비스인 Dnsmasq 사용
    - VLAN DHCP
        : VLAN tagging을 사용하여 네트워크를 분리
    - VLAN + Flat + Flat DHCP
d. 네트워크 가상화
    - 서버가상화
    - 네트워크 가상화
    - Quathum의 등장 : 2008년 OpenFlow관련 눈물을 읽은 대학 교수들이 Openstack에 적용. Network서비스가 복잡해짐에따라 nova-network만으로 커버가 불가능
    - VLAN은 4096개 네트워크로 나눌 수 있음
       (GRE tunneling)
    - VxLAN
    - 2012년 나사에서 OpenStack이 분리되면서
       네트워크 벤더들이 OpenStack에 들어오기 시작
      (네트워크 시설 이중화를 위한 vendor하드웨어 사용)

#2. SDN 등장
a. 구조
    - app 부분 -> OpenStack 이용
    : Openstack의 OFConfig, OVSDB : NW 장비가 꺼졌냐 커졌냐 등 물리적인 관리를 전담하는 서비스도 OpenStack에 포함
    - Controller + 네트워크 장비 -> SDN
c. Ryu : 파이썬으로 작성된 오픈소스 SDN 컨트롤러
    => 프로그램을 통해 switch기능 구현 가능(로드밸런싱, 방화벽구현 등)

#3. SDN 초기시장에서의 Openstack 변화
a. Quamtum의 상표권 문제로 neutron으로 이름 변경
b. Neutron과 ML2
  : L2를 모듈화시켜서 사용을 유연하게 하고자 함.
  : 벤더 플러그인을 잘 쓰고 싶어서 ML2를 발표한 걸수도 있음.(실제로 cisco가 발표)
  : Ryu plugin -> ML2 with ofagent
c. 기존 neutron은 이중화에 대한 문제를 갖고있음.
d. 이중화를 위해 DVR 등장
    - nova-network, multihost 기능 활용
    - network node HA
    - East-west traffic 관리
e. 분산 라우터가 생기면 트ㅐ픽을 분리할 수 있음

#4. 상용시장에서 요구되는 네트워크 요구사항 (Juno의 DVR과 NFV)
a. juno에서 NFV를 언급하기 시작 - NFV에서 Openstack개념이 필요하게 됨.
b. 네트워크 유연성의 철학이 Openstack에 지속적으로 언급됨.
c. Openstack, 오픈소스




tip1. opendaylight는 잘 사용하지 않음..?
tip2. wireshark 최신버전에서 SDN 패킷 분석이 가능함

+ Recent posts