Posted by 사랑줍는거지
,

[가정 & 조건]

  • OpenNebula(이하 ONE) 4.0 버전 설치 과정 정리 목적. (by Source) (Pacage로 진행해도 무방)
  • 모든 테스트는 VMware Player상에서 Nested KVM기반으로 진행하였으나, Physical환경에서도 동일.
  • OS 플랫폼으로 Ubuntu 13.04 64bit 사용
  • ONE-Server와 KVM-01 서버 두개의 Machine 기반 시나리오.
  • 각각의 호스트네임은 "one-server" 및 "kvm-01"로 한다.
  • 각 Machine은 최신 패키지로 업그레이드 되어 있다. (apt-get dist-upgrade)
  • ONE 관리자 계정은 "oneadmin"으로 한다.
  • 편의상 모든 작업은 ubuntu 계정으로 진행.
  • Hypervisors Machine의 Network모듈은 "Open vSwitch"를 사용 한다.
  • Network IP는 로컬 사정상 Static로 하였음. 적절히 상황에 맞게 설정하면 된다.
  • 두 Machine 모두 NIC는 1개로 진행.


[ONE-Server]


1. HostName 확인/조정

(가정 & 조건 설정)

$ sudo vi /etc/hosts

127.0.0.1 one-server


$ sudo vi /etc/hostname

one-server


2. 패키지 업그레이드 (의존성 반영)

$ sudo apt-get -y dist-upgrade


3. ONE Source 다운로드 및 압축 해제

(from http://dev.opennebula.org/packages/)

$ whoami

ubuntu

$ pwd

/home/ubuntu


$ wget http://dev.opennebula.org/packages/opennebula-4.0.0/opennebula-4.0.0.tar.gz

$ tar zxvf opennebula-4.0.0.tar.gz

$ cd opennebula-4.0.0

$ ls

include install.sh LICENSE NOTICE README.md SConstruct share src


4. ONE운영에 필요한 Ubuntu 패키지 설치 (의존성)

(Reference: http://opennebula.org/documentation:rel4.2:build_deps => Debian/Ubuntu)

$ sudo apt-get install -y g++ libxmlrpc-c3-dev scons libsqlite3-dev libmysqlclient-dev libxml2-dev libssl-dev liblog4cpp5-dev ruby ruby-dev sqlite3


5. ONE 관리자 계정/그룹 생성 및 PW설정

(패스워드는 적절히 설정 한다.)

$ sudo groupadd --gid 1001 oneadmin

$ sudo useradd --uid 1001 -g oneadmin -s /bin/bash -d /var/lib/one oneadmin

$ sudo passwd oneadmin

$ sudo echo "oneadmin    ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers


6. ONE 빌딩 (by scons)

(mysql을 DB로 사용할 경우, "scons mysql=yes")

$ whoami

ubuntu

$ pwd

/home/ubuntu/opennebula-4.0.0.0


$ scons

(생략)


7. ONE 설치/확인

$ whoami

ubuntu

$ pwd

/home/ubuntu/opennebula-4.0.0.0


$ sudo ./install.sh -u oneadmin -g oneadmin


$ sudo mkdir -p /var/run/one /var/lock/one

$ sudo chown oneadmin:oneadmin /var/run/one /var/lock/one


$ cd /var/lib/one

$ ls

datastores remotes vms


8. ONE 운영에 필요한 rubygem을 통한 추가적인 패키지 의존성 해결

(apt-get에서 이미 설치된 것은 통과 처리)

$ cd /usr/share/one

$ ls

examples install_gems tgt websockify


$ sudo ./install_gems

(중략)

Press enter to continue... => [엔터]

(중략)

* sunstone

* quota

* cloud

* ozones_server

* auth_ldap

Press enter to continue... => [엔터]

(생략)


9. ONE 운영을 위한 SSH-Key 생성 및 SSH 설정

$ su - oneadmin

$ whoami

oneadmin

$ pwd

/var/lib/one


$ ssh-keygen -t rsa

=> [엔터]

=> [엔터]

=> [엔터]


$ echo "ConnectTimeout 5

Host *

StrictHostKeyChecking no" > .ssh/config


10. ONE 관리자 인증설정

(Password는 적절히 등록. 본 예제에서는 "passw0rd"로 함. 숫자 0)

$ whoami

oneadmin

$ pwd

/var/lib/one


$ mkdir .one

$ echo "oneadmin:passw0rd" > .one/one_auth

$ chmod 600 .one/one_auth


11. ONE 서비스 시작 및 상태 확인

(혹, Start 수행이 정상적이지 않다면, "one stop" 수행 후, 다시 "one start"를 시도 해본다.)

$ whoami

oneadmin


$ one start

$ oneuser list

  ID NAME            GROUP      AUTH           VMS            MEMORY         CPU

   0 oneadmin        oneadmin   core             -                 -           -

   1 serveradmin     oneadmin   server_c         -                 -           -


$ oneuser list -x

<USER_POOL>

  <USER>

    <ID>0</ID>

    <GID>0</GID>

    <GNAME>oneadmin</GNAME>

    <NAME>oneadmin</NAME>

    <PASSWORD>7c6a61c68ef8b9b6b061b28c348bc1ed7921cb53</PASSWORD>

    <AUTH_DRIVER>core</AUTH_DRIVER>

    <ENABLED>1</ENABLED>

    <TEMPLATE/>

    <DATASTORE_QUOTA/>

    <NETWORK_QUOTA/>

    <VM_QUOTA/>

    <IMAGE_QUOTA/>

  </USER>

  <USER>

    <ID>1</ID>

    <GID>0</GID>

    <GNAME>oneadmin</GNAME>

    <NAME>serveradmin</NAME>

    <PASSWORD>1e6686daf58dd9d12961183474a9f80a236c7bdf</PASSWORD>

    <AUTH_DRIVER>server_cipher</AUTH_DRIVER>

    <ENABLED>1</ENABLED>

    <TEMPLATE/>

    <DATASTORE_QUOTA/>

    <NETWORK_QUOTA/>

    <VM_QUOTA/>

    <IMAGE_QUOTA/>

  </USER>

  <DEFAULT_USER_QUOTAS>

    <DATASTORE_QUOTA/>

    <NETWORK_QUOTA/>

    <VM_QUOTA/>

    <IMAGE_QUOTA/>

  </DEFAULT_USER_QUOTAS>

</USER_POOL>


12. ONE sunstone-server 실행

$ whoami

oneadmin


$ sunstone-server start




[KVM-01]


1. HostName 확인/조정

(가정 & 조건 설정)

$ sudo vi /etc/hosts

127.0.0.1 kvm-01


$ sudo vi /etc/hostname

kvm-01


2. 패키지 업그레이드 (의존성 반영)

$ sudo apt-get dist-upgrade


3. VT기술 지원 확인 (CPU)

$ sudo egrep "vmx|svm" /proc/cpuinfo


4. KVM & Open vSwitch 패키지 설치

$ sudo apt-get -y install nfs-common openssh-server ruby qemu-kvm libvirt-bin pm-utils openvswitch-datapath-source openvswitch-common openvswitch-switch openvswitch-brcompat


5. Libvirt에 기본 NAT 네트워크를 비활성화 한다.

(상황에 따라 Network 연결이 끊길 수 있다. 만일에 대비해 Local 작업을 위한 Console을 준비 해둔다.)

$ sudo virsh net-destroy default

$ sudo virsh net-autostart --disable default


6. Hypervisor의 네트워크 설정 (파일 정보만 수정)

(주의) brcompat 는 OVS 1.10 이후부터 리눅스의 전통적인 bridge명령인 brctl과 호환되지 않는다.(removed)

$ sudo echo "auto lo

iface lo inet loopback


auto eth0

iface eth0 inet manual

up ifconfig  0.0.0.0 up

down ifconfig  down


auto br0

iface bro inet static

address 172.21.18.148

netmask 255.255.255.0

gateway 172.21.18.1

" > /etc/network/interfaces


$ sudo vi /etc/default/openvswitch-switch

#BRCOMPAT=no

=>

BRCOMPAT=yes


7. Open vSwitch에 Bridge/Port 설정 및 확인

$ sudo ovs-vsctl add-br br0

$ sudo ovs-vsctl add-port br0 eth0


$ sudo ovs-vsctl show

Bridge "br0"

Port "eth0"

Interface "eth0"

Port "br0"

Interface "br0"

type: internal

ovs_version: "1.9.0"


8. ONE 운영 계정 생성

$ sudo groupadd --gid 1001 oneadmin

$ sudo mkdir /var/lib/one

$ sudo useradd --uid 1001 -g oneadmin -s /bin/bash -d /var/lib/one oneadmin

$ sudo usermod -a -G kvm oneadmin

$ sudo usermod -a -G libvirtd oneadmin

$ sudo chown oneadmin:oneadmin /var/lib/one

$ sudo echo "oneadmin    ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers


* (Note)

Libvirt/QEMU 프로세스에 동적으로 적용되는 파일의 소유권(Ownership) 비활성화

# vi /etc/libvirt/qemu.conf

dynamic_ownership = 0






[참조 원문 블로그 주소]

http://opennebula.org

http://kloudology.com/2013/06/16/opennebula-4-0-home-lab-part-3-installing-kvm-and-open-vswitch-on-ubuntu-13-04/




















Posted by 사랑줍는거지
,

OpsWorks는 기존의 AWS Cloud Formation의 대안격으로 보인다. 현재는 Beta서비스 중이지만, 개념이 Cloud Formation보다 훨씬 직관적인 것 같다. 물론 Chef에 대해 어느정도 배경지식이 있어야 하겠다.

(이런게 진짜, "as-a-Service" 아니겠나~ "I"냐 "P"냐 "S"냐는 경계가 모호해진지 오래라 의미 없고..)


이번 스레드에서는 OpsWorks상에서 Custom Cookbook(getting-started)를 적용하는 흐름을 간단히 정리해 두는 것이 목적이다.


먼저 OpsWorks 특징에 대해 파악된 부분만 우선 정리 하자면,


  • 단일 인스턴스가 최종 Goal이 아닌, 하나의 Stack(다 계층 구조의 시스템 전체)를 쉽게 배포/설정을 지원.
  • 하나의 Stack은 다수의 Layer로, 또 각 Layer는 다수의 Instance로, 또 각 Instance는 다수의 App으로 구성 된다.
  • 주요 도구는 이름에서도 드러나듯이, OpsCode사의 Chef가 주요 역할을 담당한다.
  • 일반적으로 통용되는 Stack구조(MySQL, PHP, node.js, 등)는 별도의 Cookbook이 필요 없이 기본 제공이 된다. 
  • Cookbook 적용시, 사용자 입력값이나, 개개의 Private한 값은 Data Bag이 아니라 JSON 형식으로 전달한다.
  • 사용자 정의 값을 기술한 JSON 내용은, Static하게 또는, 매번 실행시마다 1회성(Dynamic)으로 전달 할 수도 있다. 단, Static과 Dynamic에 동일 값이 있으면, Dynamic값이 Static값에 Override되어 우선순위가 높은 것으로 판단된다. (확인 필요)
  • (기타 특징들은 파악 되는대로 계속 업데이트 예정...)

[본론] OpsWorks에서 Chef의 기본 에제인 "getting-started" cookbook을 적용하는 예제 실습

가정
  • Stack이나 Layer에 대한 실습이 아니므로, 단일 레이어에 PHP템플릿 인스턴스 하나에 getting-started적용 진행.
  • "getting-started" 소스는 SSH Key기반의 GitHub에 등록되어 있다.
  • GitHub에 준비해둔 "getting-started"에 수정한 내역은 아래와 같다.
    (cookbooks/getting-started/templates/default/chef-getting-started.txt.erb)
    (붉은 색 부분을 추가 하였으며, 해당 값은 JSON으로 전달 한다.)
  • Welcome to Chef!


    This is Chef version <%= node[:chef_packages][:chef][:version] %>.

    Running on <%= node[:platform] %>.

    Version <%= node[:platform_version] %>.

    Custom <%= node['deploy']['test_string'] %>

  • Stack, Layer, Instance 등을 생성하는 방법은 아래 문서를 참조한다. 너무 쉽기도 하고 설명도 잘되어 있다.
    http://awsdocs.s3.amazonaws.com/opsworks/latest/opsworks-ug.pdf

실습 내용 요약
  • "getting-started" Cookbook을 PHP가 설치될 Instance에 추가로 적용시키고, "getting-started" 내용 일부를 수정/추가 하여, JSON으로 전달된 값들이 정상적으로 반영되는지까지 확인한다.

[실습 과정]
  1. "test"라는 이름으로 Stack 생성
    (최초 Stack을 생성하면 녹색 원에 숫자가 "0"일 것이다. 이 캡쳐는 테스트 후에 작성한 것이라, "1"로 표시된 것일 뿐..)

  2. Layer 생성 (Custom Cookbook 적용이 목적이므로, 어느 것이든 관계 없다. 본 실습에서는 App Server에서 PHP로 하였다.

  3. "getting-started" Cookbook을 실제로 적용시킬 Instance 하나를 생성.

  4. 과정(2)에서 생성한 Layer의 편집 모드로 진입하여, "getting-started" Cookbook의 위치, SSH-Key 정보, 사용자 정의 Value를 포함하는 JSON 정보등을 설정.

  5. 설정을 마쳤으니, 실제로 "getting-started" Cookbook을 대상 Instance에 적용해 본다.

    (Custom Chef JSON에서 Override로 값을 재정의 할 수 있다.)


  6. 수행 Log 학인

    (/tmp/ 디렉토리에 "getting-started"의 default 레시피대로 파일이 에러 없이 작성되었다.)


  7. 생성 파일 내용 확인
    (과정상 "Custom call518"로 표시되어야 하나, 캡쳐 그림은 여러가지로 테스트 한 결과임)
[END]
아주 기초적인 흐름만 테스트 해보았다. 서두에 링크해둔 PDF(User Guide)를 참고해서, 사용자 Cookbook이 수행되는 타이밍(전체 Stack을 구성하다 보면 Cookbook간의 순서가 중요하다.)도 조절해 보고, Stack, Layer, Instance에서 App목록까지 Custom Cookbook으로 전달해야 할 일이 많을 텐데, 그러한 부분까지 테스트 해볼 예정이다. 그러기 위해서 가장 기초적인 내용을 정리 해둔 것.... 


Posted by 사랑줍는거지
,