จากตอนที่แล้วเราได้ทำความรู้จักกับ OpenNebula ไปแล้ว สำหรับในตอนที่ 2 นี้เราจะมาติดตั้ง OpenNebula กัน OpenNebula ออกแบบมาโดยใช้โครงสร้าง Cluster เดิมที่มีอยู่แล้วได้ ดังนั้นจาก Minimum Configuration เดิมซึ่งสามารถใช้งานได้เลย จากภาพเราจะมีเครื่อง Front End (Head Node) เพื่อทำหน้าที่จัดการ Image Repository, VMs, Scheduling ใน Cluster Node ที่เชื่อมต่ออยู่ จาก Minimun Configuration เครื่อง Front End จะมีการ์ดแลนอย่างน้อย 2 ใบ ใบหนึ่งเชื่อมต่อไปยังเครือข่ายภายนอก หรือ Internet ส่วนอีกใบหนึ่งจะเชื่อมต่อกับ Cluster Node ดังภาพ สำหรับเครื่อง Node มีการ์ดแลนอย่างน้อย 1 ใบ

เครื่อง Front End จะทำหน้าที่ควบคุม VM และ Image Repository ดังนั้นเครื่อง Front End จะเปิด Services NFS เพื่อให้เครื่อง Node ทั้งหมดเข้ามาเรียกใช้ VM Image จากเครื่อง Front End ได้ ดังนั้นในการขยายขนาด Stroage คุณสามารถเลือกใช้ Distributed Storage เพื่อเพิ่มจำนวน Node และ Storage ได้ในตัว (วิธีการนี้ไม่ขอพูดถึงในเนื้อหาครับ) สำหรับเครื่อง Cluster Node แนะนำให้เป็นเลขคู่ 2,4,6,8 เป็นต้น สำหรับ Cluster Node ที่เราจะติดตั้งมี 2 เครื่อง

การติดตั้ง OpenNebula ทำได้หลายวิธีตั้งแต่ติดตั้งจาก Source Code ไปจนถึงติดตั้ง Binary Package ของแต่ละ Linux Distribution ได้ สำหรับ Linux Distribution ที่เราจะมาติดตั้งกันวันนี้คือ Ubuntu Server 10.04 LTS ส่วนการติดตั้ง OpenNebula เราจะใช้ OpenNebula Express 2.0 เพื่อย่อยระยะเวลาและความยุ่งยากในการติดตั้ง มาลงมือกันเลย

ทำความเข้าใจก่อนลงมือ จากโครงสร้าง Cluster ข้างต้น เครื่อง Front End มี 2 NIC ขาหนึ่งต่อเครือข่ายภายนอก public network (eth0) ส่วนอีกใบหนึ่งจะเชื่อมต่อกับ Cluster Node (eth1) ที่เป็น private network ในเครือข่าย 192.168.2/24

เครื่อง Front End ติดตั้ง Ubuntu Server 10.04 LTS ในตอนที่ตัวติดตั้งถามชุดโปรแกรมที่ต้องการ ให้เลือกติดตั้งเฉพาะ OpenSSH server เมื่อติดตั้งเสร็จ ให้ Config NIC ใบที่ 2 เชื่อมต่อกับ Cluster Node ที่เป็น private network โดยใช้ IP Address 192.168.2.1 แก้ไขไฟล์ /etc/network/interfaces เพิ่มค่าลงไปดังนี้

auto eth1
iface eth1 inet static
address 192.168.2.1
netmask 255.255.255.0

เครื่อง Front End จะทำหน้าที่เป็น Router เพื่อ forward package จากเครื่องใน private network ออกไปภายนอกได้ ดังนั้นเราต้องตั้งค่าให้กับ Firewall เพื่อ forward package ดังนี้

แก้ไขค่า /etc/sysctl.conf กำหนดค่า ในส่วน net.ipv4.ip_forward ดังนี้

net.ipv4.ip_forward = 1

และทำ IP masquerading ทุกครั้งที่ boot ในไฟล์ /etc/rc.local:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

ที่เครื่อง Node ติดตั้ง Ubuntu Server 10.04 LTS ในตอนที่ตัวติดตั้งถามชุดโปรแกรมที่ต้องการ ให้เลือกติดตั้ง OpenSSH server และ Virtual Machine host เมื่อติดตั้งเสร็จ ให้ Config NIC ใบที่ 1 (eth0) เป็น IP Address ดังนี้ 192.168.2.2 และ Gateway เป็นเครื่อง Front End แก้ไขไฟล์ /etc/network/interfaces เพิ่มค่าลงไปดังนี้

auto eth0
iface eth0 inet static
address 192.168.2.2
netmask 255.255.255.0
gateway 192.168.2.1

กลับไปที่เครื่อง Front End ให้ติดตั้ง OpenNebula โดยติดตั้งจาก OpenNebula Express ดังนี้

wget http://dev.opennebula.org/attachments/download/244/opennebula_express-2.0.tar.gz
tar zxvf opennebula_express-2.0.tar.gz
cd opennebula_express-2.0
./install

ตัวโปรแกรมจะให้เลือกการติดตั้งดังนี้

Select deployment type (press '0' to exit):
1) Ubuntu 10.04 - KVM - NFS
2) Ubuntu 10.04 - KVM - SSH
3) CentOS 5.5 - Xen - NFS
4) CentOS 5.5 - Xen - SSH

เลือกข้อ 1 เพื่อติดตั้ง OpenNebula โดยใช้ Ubuntu Server 10.04 LTS และใช้ KVM เป็น Hypervisor จากนั้นโปรแกรมจะถาม Network Address เพื่อกำหนดให้เครือข่ายใดเชื่อมต่อกับ NFS Server ได้ ให้ใส่ 192.168.2.0/24 จากนั้นรอติดตั้งจนเสร็จ

user@frontend:~$ sudo -iu oneadmin
oneadmin@frontend:~$ onevm list
ID USER NAME STAT CPU MEM HOSTNAME TIME

oneadmin@frontend:~$ onehost list
ID NAME RVM TCPU FCPU ACPU TMEM FMEM STAT

ถ้าได้ผลลัพท์ข้างต้น ถือว่าใช้ได้ครับ ;) ทีนี้ให้คัดลอกไฟล์ node-install.sh ไปยังเครื่อง Node แล้วสั่ง

./node-install.sh

เมื่อติดตั้งเสร็จ เครื่อง Node จะ mount ไปยัง NFS Server ที่เครื่อง Front-End ทีนี้ให้ Config Network Bridge ไปยัง eth0

แก้ไขไฟล์ /etc/network/interfaces แก้ไขในส่วน eth0 ให้เป็นดังนี้

# The primary network interface
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
address 192.168.2.2
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255
gateway 192.168.2.1
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

ตอนนี้เราได้เครื่อง Node มาแล้ว 1 เครื่องสำหรับ Private Cloud ของเราแล้ว ทีนี้ให้คุณ copy ไฟล์ node-install.sh ไปยังเครื่อง Node เครื่องอื่นๆ และตั้งค่า Bridge ให้เรียบร้อย เมื่อได้เครื่อง Node ครบแล้ว ให้เพิ่ม Node ทั้งหมดลงใน Front End ดังนี้

oneadmin@frontend:~$ onehost create node01 im_kvm vmm_kvm tm_nfs
oneadmin@frontend:~$ onehost create node02 im_kvm vmm_kvm tm_nfs
oneadmin@frontend:~$ onehost create node03 im_kvm vmm_kvm tm_nfs
oneadmin@frontend:~$ onehost create node04 im_kvm vmm_kvm tm_nfs
oneadmin@frontend:~$ onehost list
ID NAME CLUSTER RVM TCPU FCPU ACPU TMEM FMEM STAT
0 node01 default 0 800 800 800 4057060 3916772 on
1 node02 default 0 800 775 700 4057060 3893936 on
2 node03 default 0 800 778 700 4057060 3893936 on
3 node04 default 0 800 800 800 4057060 3916772 on

ตอนนี้เราได้ Node เพื่อรองรับการ provisioning แล้ว แต่ตอนนี้ยังทำไม่ได้ครับ เราต้องเพิ่ม Virtual Network และ VM image กันก่อน เพื่อความสะดวกให้เอาไฟล์ตัวอย่าง ซึ่งเป็น ttylinux มาทดสอบดังนี้ ที่เครื่อง Front End ให้ download ttylinux มาดังนี้

mkdir -p templates/ttylinux
cd templates/ttylinux/
wget http://dev.opennebula.org/attachments/download/170/ttylinux.tar.gz
tar xvzf ttylinux.tar.gz

ให้คุณสร้างไฟล์ template ชื่อ vmlan.net สำหรับ VMs ดังนี้

NAME = "VM LAN"
TYPE = RANGED
BRIDGE = br0
NETWORK_ADDRESS = 192.168.2.128
NETWORK_SIZE = 126
NETMASK = 255.255.255.0
GATEWAY = 192.168.2.1
NS = x.x.x.x

ตรง NS ให้กำหนด IP Name Server ที่คุณต้องการใช้ จากนั้น register virtual network ดังนี้

oneadmin@frontend:~$ onevnet create vmlan.net
oneadmin@frontend:~$ onevnet list
ID USER NAME TYPE BRIDGE P #LEASES
0 username VM LAN Ranged br0 N 0

เมื่อลงทะเบียน VM LAN แล้วให้คุณสร้างไฟล์ template ชื่อ ttylinux.one สำหรับ Virtual Machine ดังนี้

NAME = ttylinux
CPU = 1
MEMORY = 128

DISK = [
source = "/home/oneadmin/templates/ttylinux/ttylinux.img",
target = "hda",
readonly = "no" ]

NIC = [ NETWORK = "VM LAN" ]

FEATURES=[ acpi="no" ]

GRAPHICS = [
type = "vnc",
listen = "0.0.0.0",
port = "5902" ]

เมื่อได้ไฟล์ template แล้วคุณสามารถสั่ง start vm ได้เลย ด้วยคำสั่ง

oneadmin@frontend:~$ onevm create ttylinux.one

เมื่อสั่ง start vm แล้วให้ดูสถานะของ VM ด้วยคำสั่ง onevm list ดังนี้

oneadmin@frontend:~$ onevm list

ID USER NAME STAT CPU MEM HOSTNAME TIME
0 oneadmin ttylinux runn 0 0 node04 00 00:00:19

จากข้อมูลข้างต้น VM ชื่อ ttylinux มีสถานะกำลัง running และใช้ เครื่อง Node เครื่องที่ 4 (node04) เป็นตัวประมวลผลอยู่ คุณอาจสงสัยว่าทำไม OpenNebula เลือกเครื่อง Node04 แทนที่จะเป็น Node01 ที่เป็นเครื่องแรก ก็เพราะว่า OpenNebula จะเลือก Node ที่มี resource เหลือมากที่สุดในขณะนั้นก่อน นั่นหมายความว่าคุณไม่จำเป็นต้องกำหนด Node ที่ต้องการ deploy VM เลย เพราะ OpenNebula จะเป็นผู้เลือกให้นั่นเอง

หากคุณต้องการเข้าใช้เครื่องให้คุณใช้ vncviewer ดังนี้

vncviewer node04:5902

สำหรับการติดตั้ง OpenNebula และการตั้งค่าพื้นฐานมีเพียงเท่านี้ ในตอนต่อไปจะเป็นการสร้าง VM Image เพื่อใช้งานใน Private Cloud ของเราครับ

opentaps ออกรุ่น 1.5 ซึ่งเป็นระบบบริหารจัดการทรัพยากร (ERP) และระบบลูกค้าสัมพันธ์ (CRM) ซึ่งระบบพัฒนาต่อยอดจาก Apache OFBiz 10.04 และใช้ Tomcat 6.0.26 ออกแบบมาเพื่อใช้งานบน Amazon Elastic Computing Cloud (EC2) opentab มี default template ให้เลือกใช้ผ่าน EC2 ได้โดยตรง ซึ่งใช้เวลาการติดตั้งทั้ง ERP และ CRM เพียง 15 นาที ก็พร้อมใช้งาน สำหรับการชำระเงินบริษัทสามารถจ่ายเป็นชั่วโมงการใช้งานของ EC2 เท่านั้นทำให้การหันมาใช้งาน ERP+CRM แบบ Open Source ทำได้ง่ายมากขึ้น และได้ระบบ ERP+CRM ใช้งานรวดเร็วขึ้น ลงทุนเริ่มต้นน้อยลงอีกด้วย คุณสามารถอ่านกรณีศึกษาจากเว็บไซต์ opentaps และดูวิดีโอสาธิตการติดตั้ง ERP+CRM ใน 15 นาทีบน YouTube จะเห็นได้ว่าการติดตั้งและเริ่มใช้ ERP+CRM บน Cloud ง่ายนิดเดียว

RedHat และ Eucalyptus เริ่มผนึกกำลัง เป้าหมายต้องการให้ Eucalyptus เป็นส่วนเสริมเข้าไปยัง RedHat Enterprise ซึ่งการพัฒนาในช่วงเริ่มต้น ต้องการให้ Eucalyptus สร้าง Private Cloud ที่เหมือนกับ Amason EC2,S3 และ EBS ให้สามารถเชื่อมต่อกับ Delta Cloud ของ RedHat ได้ ทั้ง 2 บริษัทต้องการให้ RedHat Enterprise Virtualization สามารถบริหารจัดการ Eucalyptus ได้เช่นกัน ซึ่งการพัฒนาร่วมกัน Code ที่ได้จะใช้ Open Source License ซึ่ง CEO ของ Eucalyptus คาดว่าการพัฒนาร่วมกันแบบเต็มที่จะเกิดขึ้นในช่วงกลางปีหน้าและรุ่น Beta จะออกตามมาหลังจากนั้น

ที่มา – H-Online

สร้าง Cloud Infrastructure ด้วย OpenNebula มาถึงตอนที่ 3 แล้วหลังจากเราสร้าง Cluster ของ Private Cloud กันไปในตอนที่แล้ว ตอนนี้จะกล่าวถึงการสร้าง Services Image ให้กับ OpenNebula กันครับ OpenNebula ใช้เทคโนโลยีที่มีอยู่เข้ามาปรับใช้ได้อย่างลงตัว ไม่ว่าจะเป็นการใช้งาน Virtualization อย่าง Xen, KVM หรือ แม้กระทั่ง VMWare ผ่าน OpenNebula Driver การจัดการ Disk Image หรือ Service Image เราสามารถใช้ Image ได้หลากหลาย ไม่ว่าจะเป็น raw, qcow, qcow2, VirtualBox, หรือแม้กระทั่ง VMWare ได้เช่นกัน

ในตอนนี้เรามาสร้าง Service Images ด้วยวิธีง่ายๆ ที่คุณหรือใครๆ ก็ทำได้ผ่านทางโปรแกรม GUI โดยไม่ต้องจิ้มคำสั่งกันแล้ว ผมพยายามหาวิธีง่ายๆ ให้น่ะครับ :) วิธีนี้คือการใช้ Virt-Manager ครับ ท่านที่ใช้ Ubuntu Desktop ก็สั่งติดตั้ง Virt-Manager ผ่านทาง Software Center กันได้เลย

เมื่อติดตั้งเสร็จแล้วก็สร้าง VM แล้วติด Linux อะไรก็ได้ลงไปก็ได้ ของผมเป็น Ubuntu Server เลือกติด OpenSSH Server ลงไปด้วยนะครับ

เมื่อติดตั้งเสร็จแล้ว ให้ Stop VM แล้วใช้ Nautilus เข้าไปที่ /var/lib/libvirt/images คุณจะเห็นรายชื่อ Image ที่คุณสร้าง VM ไว้

ให้คุณคัดลอก Image ที่ได้ไปไว้ที่เครื่อง Front End แล้วสร้าง VM Template

NAME = ubuntu-server
CPU = 1
MEMORY = 128

DISK = [
source = "/home/oneadmin/templates/ubuntu/ubuntu.img",
target = "sda",
readonly = "no" ]

NIC = [ NETWORK = "VM LAN" ]

FEATURES=[ acpi="no" ]

GRAPHICS = [
type = "vnc",
listen = "0.0.0.0",
port = "5903" ]

จากนั้นสั่ง Create VM กันได้เลย

oneadmin@frontend:~$ onevm create ubuntu.one

เมื่อสั่ง onevm list คุณจะพบว่า VM รันขึ้นมาแล้วครับ ;) ใช้ vncviewer เข้าไปดูได้เช่นเดิม การสร้าง Service Image นี้เป็นวิธีง่ายๆ แต่ OpenNebula สามารถสอดแทรกอะไรที่มากกว่านี้เข้าไปที่ Image ขณะ Boot ได้ เช่น ssh key, ตั้งค่า IP Address อัตโนมัติ หรือแม้กระทั่งสั่งติดตั้งโปรแกรมเพิ่มเติมคุณก็สามารถทำได้ วิธีนี้เราเรียกว่าการแทรก Context ตัว Context จะเป็น config ที่เพิ่มเข้าไปใน VM template แต่ context จะถูกสร้างเป็น Disk Image ขณะ Start VM และกำหนดเป็น Drive CDROM รอการใช้งาน เมื่อ VM Boot ขึ้นมาเราสามารถหยิบเอาของจาก Context มาใช้ได้ผ่าน script ใน rc ขณะ boot ได้ เราเรียกว่า rc.context สำหรับ ท่านที่คุ้นเคยกับ Linux อยู่แล้ว คุณอาจจับ script context นี้ ใส่ลงใน rc.local ได้เลย มาแก้ไข VM template ของเรากันก่อนครับ เพิ่มส่วน context ลงไปดังนี้

CONTEXT = [
hostname = "$NAME",
ip_private = "$NIC[IP, NETWORK="VM LAN"]",
ip_public = "192.168.2.210",
files = "/home/oneadmin/templates/ubuntu/init.sh /home/oneadmin/templates/ubuntu/id_dsa.pub",
target = "sdc",
root_pubkey = "id_dsa.pub",
username = "ubuntu",
user_pubkey = "id_dsa.pub"
]

เขียน script สำหรับ init.sh ดังนี้

#!/bin/bash

if [ -f /mnt/context/context.sh ]
then
./mnt/context/context.sh
fi

if [ -n "$HOSTNAME" ]; then
echo $HOSTNAME > /etc/hostname
hostname $HOSTNAME
fi

if [ -n "$IP_PRIVATE" ]; then
ifconfig eth0 $IP_PRIVATE
fi

if [ -n "$IP_PUBLIC" ]; then
ifconfig eth0:1 $IP_PUBLIC
fi

if [ -n "$NETMASK" ]; then
ifconfig eth0 netmask $NETMASK
fi

if [ -f /mnt/context/$ROOT_PUBKEY ]; then
cat /mnt/context/$ROOT_PUBKEY >> /root/.ssh/authorized_keys
fi

if [ -n "$USERNAME" ]; then
useradd --create-home --shell /bin/bash --group admin $USERNAME
if [ -f /mnt/context/$USER_PUBKEY ]; then
mkdir -p /home/$USERNAME/.ssh/
cat /mnt/context/$USER_PUBKEY >> /home/$USERNAME/.ssh/authorized_keys
chown -R $USERNAME /home/$USERNAME/.ssh
chmod -R 600 /home/$USERNAME/.ssh
fi
fi

แล้วเอา script context ใส่ลงใน rc.local ของ Service Image ครับ

#!/bin/sh -e

mount -t iso9660 /dev/sdc /mnt

if [ -f /mnt/context.sh ]; then
./mnt/init.sh
fi
umount /mnt

exit 0

จากนั้นก็ลอง Create VM กันอีกรอบ เมื่อ VM เข้าสถานะ running แล้วให้ใช้ ssh remote เข้าไปดูครับ ถ้านึกไม่ออกว่า VM ได้ IP Address อะไรใช้คำสั่ง one show <ชื่อ VM ที่ต้องการ> หัวใจสำคัญอยู่ที่ init.sh ว่าเราจะให้ VM สร้างอะไรที่แตกต่าง อยากได้อะไรก็ใส่เข้าไปได้เลยครับ การเพิ่ม Context ดีกว่าสร้าง VM Image ขึ้นมาทึ่มๆ จริงมั๊ยครับ ;)

OpenNebula เป็นโครงการ Cloud Open Source ที่ได้รับความนิยมมากตัวหนึ่งเพราะความยืดหยุ่นและการใช้งานร่วมกับระบบอื่นๆ ได้ (ecosystem) นั่นหมายความว่าคุณสามารถติดตั้งให้ OpenNebula เป็น Cloud แบบใดก็ได้ ไม่ว่าจะเป็น Private Cloud, Public Cloud หรือ แม้กระทั่ง Hybridge Cloud การเชื่อมต่อ OpenNebula Cloud เราสามารถขยายขนาดออกไปได้เรื่อยๆ ไม่ได้ยึดติดว่าจะต้องเป็น Cloud Infra ที่ใช้ OpenNebula เหมือนกัน ในตอนนี้จะเป็นตอนสุดท้ายของเราครับ ในตอนสุดท้ายนี้คงไม่มีอะไรเป็นพิเศษ เพียงแต่อยากฝาก link ที่คุณสามารถใช้อ้างอิง เพื่อประยุกต์ใช้ OpenNebula ในการสร้างและจัดการ Cloud Infra ในรูปแบบ ที่คุณต้องการได้ โดยเข้าไปที่ OpenNebula Documentation ได้เลยครับ หน้าเดียวจบ ครบทุกอย่าง สำหรับ Web management console สำหรับ OpenNebula 2.0.x ยังไม่เรียบร้อยท่านที่สนใจช่วยทางทีม SARA พัฒนาเพิ่มเติมก็ร่วม contribute ได้ที่ Ecosystem ส่วน Management Console และ ท่านที่ใช้ Delta Cloud ห้ามพลาด OpenNebula Add-on ครับ

OpenNebula เป็นโครงการโอเพนซอร์สมีจุดประสงค์เพื่อสร้างเครื่องมือบริหารจัดการ Cloud Computing ที่มีความยืดหยุ่นในการขยายขนาด Data Center infrastructure ได้ง่าย ซึ่งมีการพัฒนามาจนถึงรุ่นที่ 2.0.1 แล้ว หลังจากโครงการนี้เดินมาในรูปแบบโอเพนซอร์สได้ระยะหนึ่งซึ่งผลงานของชุมชน OpenNebula.org และ C12G Lab ที่ช่วยกันพัฒนา เครื่องมือในการบริหารจัดการ Cloud Infra แบบ Open Source ก็ได้รับการตอบรับอย่างดี ไม่ว่าจะเป็น CERN, Chaina Mobile, ESAC, Nikhef, SARA และยังมีผู้พัฒนาต่อยอดจากโครงการนี้อีกมากเช่น StratusLab, Bon Fire, Reservoir, OCCI, D-Grid, 4 CaaSt เป็นต้น

OpenNebula ออกแบบมาเพื่อรองรับการใช้งานบน Infrastructure เดิมให้มากที่สุดซึ่งการออกแบบเน้นการเพิ่มหรือขยาย Infra ได้ยืดหยุ่น ซึ่งคล้ายคลึงกับการวางโครงสร้างในระบบคลัสเตอร์ทั่วไป จากความยืดหยุ่นคุณสมารถประยุกต์ OpenNebula เพื่อใช้จัดการ Cloud Infrastructure ในรูปแบบต่างๆ ได้ ไม่ว่าจะเป็น Private Cloud, Hybridge Cloud และ Public Cloud ในบทความนี้จะครอบคลุมเพียง Private Cloud เท่านั้น คุณสามารถอ่านเพิ่มเติมได้จากเว็บไซต์โครงการครับ

การติดตั้ง OpenNebula เพื่อสร้าง Private Cloud โครงสร้างการเชื่อมต่อจะใช้โครงสร้างเดิมเหมือนกับการเชื่อมต่อแบบคลัสเตอร์ทั่วไป ซึ่งมีเครื่อง front-end และเครื่อง node ที่จะให้ VM ไปทำงานบนนั้น ซึ่งเครื่อง node มีการเชื่อมต่อกับ front-end อย่างน้อย 1 เส้นดังภาพ

โครงสร้างอย่างง่ายสำหรับ OpenNebula มีดังนี้

  • Front-end สำหรับ run OpenNebula และ Cluster Services
  • Nodes เอาไว้ povision virtual machine ต้องสนับสนุน Hypervisor
  • Image repository เป็น storage แบบใดก็ได้เอาไว้เก็บ image ของ VM
  • OpenNebula daemon เป็น service หลักของระบบซึ่งจะจัดการ life-cycle ของ VMs และจัดการระบบอื่นๆ ใน Cluster เช่น network, stroage และ hypervisor เป็นต้น
  • Driver เป็นโปรแกรมที่ใช้เชื่อมต่อกับ cluster subsystem ในรูปแบบพิเศษเช่น hypervisor หรือ storage file system เป็นต้น
  • oneadmin ผู้ดูแลระบบ private cloud ซึ่งจะเป็นผู้จัดการ VM, Virtual Network, node และ users ในระบบ
  • Users ผู้ใช้ในระบบ OpenNebula สร้างและจัดการ virtual machine, virtual network ของตนเอง

ความต้องการของระบบ

Cluster Front-End

จะเป็นเครื่องที่เข้าถึง image repository ซึ่งควรจะมี storage ขนาดใหญ่เพื่อรองรับ VM images สำหรับ Private Cloud โดยทั่วไปจะเก็บ master image ซึ่งอาจจะ clone เมื่อสั่ง start VM เครื่อง front-end ควรวางแผนในเรื่องการจัดการ storge ด้วยซึ่งจะมากน้อยขึ้นอยู่กับจำนวน VM ที่ run อยู่บน cluster node สำหรับการติดตั้งเฉพาะ OpenNebula ใช้พื้นที่เพียง 10MB เท่านั้น

OpenNebula สามารถติดตั้วได้ 2 โหมด ดังนี้

  • system-wide : binary, log files และ configuration ทั้งหมดจะถูกติดตั้งและจัดการโดย root ซึ่งต้องใช้สิทธิ์ root ในการบริการจัดการ
  • self-contained : OpenNebula จะติดตั้งในที่ๆ กำหนดโดยระบบเอง ไม่จำเป็นต้องใช้สิทธิ์ root ในการบริหารจัดการ

Cluster Node

เครื่อง Node จะ run VMs ไม่ต้องการ storage เพิ่มเติมแต่อย่างใด ยกเว้นเครื่อง Node ไม่ได้ใช้ Share storage ร่วมกับ Node อื่นๆ ข้อมูล image จะเก็บไว้ที่เครื่อง Node แทน

Storage

เครื่อง front-end จะทำหน้าที่ export image repository ให้กับ cluster node ซึ่งขนาดของ storage ที่ใช้เก็บเป็นเรื่องสำคัญ ทั้งนี้ขึ้นอยู่กับจำนวน VM และขนาดของ image VM ด้วย ซึ่งการ start VM ตัว front-end จะ clone image ออกมาเพื่อใช้งานกับ VM ที่กำลังจะ start ดังนั้นคุณต้องมีพื้นที่เพียงพอที่ใช้เก็บ VM image ทั้งหมด

User Account

ผู้ดูแลระบบ OpenNebula จะใช้ชื่อบัญชีผู้ใช้ว่า oneadmin ซึ่งจะเป็นผู้จัดการ OpenNebula Services รวมถึงงานอื่นๆ ด้วย เช่น จัดการ VM, Virual Network, Image เป็นต้น คุณสามารถประยุกต์ใช้ NIS เข้ามาช่วยจัดการบัญชีผู้ใช้ของ OpenNebula ได้เช่นกัน

Network

สำหรับระบบเครือข่าย ไม่ได้มีอะไรเป็นพิเศษมากนัก หากต้องการได้ประสิทธิภาพให้กับ VM คุณควรจะมี NIC ที่มากกว่า 1 เชื่อมต่อไปที่ VM โดยการ bridge NIC เข้าไปที่ VM

Secure Shell Access

Front-End ทำงานกับ Node โดยผ่าน ssh โดยใช้ชื่อผู้ใช้ oneadmin ดังนั้นการเชื่อมต่อระหว่าง Front-End กับ Node ควรเชื่อมต่อแบบ ssh โดยใช้ ssh key ซึ่งการเชื่อมต่อแบบนี้ไม่จำเป็นต้องใช้ password อีกต่อไปแต่จะใช้ Key Authentication แทน

Hypervisor

เทคโนโลยี Virtualization จะต้องติดตั้งที่ cluster node ซึ่งบัญชีผู้ใช้ oneadmin ต้องสามารถควบคุมจัดการและติดตาม VM ได้ OpenNebula สามารถทำงานร่วมกับ Virtualization Technology ได้หลากหลาย เช่น Xen, KVM, VMWare เป็นต้น

เมื่อเข้าใจองค์ประกอบทั้งหมดแล้วเรามาเริ่มสร้าง Cloud Infrastructure แบบ Private Cloud กันในตอนถัดไป

หลายท่านพยายามสร้าง Image เพื่อใช้ในการสร้างบริการของตัวเอง แต่ว่าไฟล์ Image มันมีขนาดเล็กไปหน่อย :P ทำให้เพิ่มโปรแกรมที่เราต้องการใส่ลงไปไม่ได้ งานเข้าเลยมั๊ยล่ะ อย่างนี้ต้องขยายครับ สำวิธีการขยายไฟล์ Image เราสามารถใช้วิธีการการจัดการไฟล์และพาร์ทิชันทั่วๆ ไปได้ มาลองดูวิธีการกันครับ ผมดาวน์โหลด pre-packaged มาแก้ไขเพิ่มเติมโปรแกรมที่ผมต้งการ แต่ตัว Image เองจำกัดพื้นที่ขนาดเพียง 2G เท่านั้น การติดตั้งบริการหรือโปรแกรมใหญ่ๆ ทำให้พื้นที่ที่ต้องใช้ไม่เพียงพอ ดังนั้นเราต้องขยายพื้นที่ของ Image วิธีการก็ง่ายๆ ใช้คำสั่งดังนี้

sudo fsck.ext3 -f ubuntu-9.04-i386.img
sudo resize2fs ubuntu-9.04-i386.img 8G

คำสั่งข้างต้นจำทำการตรวจสอบไฟล์ Image จากนั้นเราขยายพื้นที่เป็น 8G ด้วยคำสั่ง resize2fs เท่านี้ก็เรียบร้อยแล้ว ทีนี้ให้ upload image เขาไปที่ Eucalyptus สร้าง instance ขึ้นมาใหม่ ล็อกอินแล้วตรวจขนาดดูครับ จะพบว่าเรามีพื้นที่เพิ่มขึ้นเป็น 8G แล้ว ง่ายๆ แค่นี้เอง :)

คราวที่แล้วติดค้างเรื่องเอา services ของเราไปใส่ไว้ที่ Elastic Block Storage (EBS) แต่…ทำไมต้องทำเช่นนั้น ? หลังจากสร้าง Instance จาก EMI แล้วก็ได้ VM เป็น Instance สมชื่อ ถ้า terminate ตัว VM นั้นไปทุกอย่างที่อยู่ใน Instance นั้นก็ไปทั้งหมด หากไม่มีการสำรองข้อมูลโยกมาไว้ที่ EBS ดังนั้นการขอใช้บริการ Cloud จึงเลี่ยงไม่ได้ที่จะต้องใช้ EBS ด้วยเสมอๆ ซึ่งผู้ที่เป็นเจ้าของสามารถสร้าง snapshot เองได้ หากว่าเราติดตั้ง services ลงบน EBS แทนเราก็จะสามารถ snapshot ทั้ง services และ data ได้ในตัว อีกทั้งยังประหยัด resource อื่นๆ ได้อีกมาก ที่สำคัญเราไม่ต้องซื้อ services ที่มีจำหน่ายบน Cloud Cateloge เลย อืมมมลืมบอกไปว่าวิธีการนี้ใช้ได้กับ Amazon EC2 และ Amazon S3 ด้วยครับ เอ้ามาเริ่มกันเลย

ให้คุณ start instance ขึ้นมาครับ (ขอเป็น debian instance นะครับ) จากนั้นสร้าง volume ขนาดที่คิดว่าคุณจะต้องใช้ของผมใช้ประมาณ 8GB ให้ชื่อว่า mekha

euca-create-volume -s 8 -z mekha

จากนั้น attach volume กับ instance ที่กำลังทำงานอยู่ (debian ของเรา)

euca-attach-volume -i i-31AB05AF vol-5959961D -d /dev/sdc

ตัวเลข i-31AB05AF คือ instance-id และ vol-5959961D คือ volume-id ที่เราได้มาจากตอนสร้าง instance และ volumn เปลี่ยนตามของคุณนะครับ เอ้าตอนนี้เราจะมีอุปกรณ์ /dev/sdc เพิ่มเข้ามาใน instance ของเราแล้ว จากนั้นก็เริ่มขั้นตอนการใช้ disk ปกติทั่วไป ให้ login เป็น root ใน instance ของเรา จากนั้นสร้าง partition และ format ให้เรียบร้อย

mk2efs /dev/sdc1

จากนั้นสร้าง mount point ไปยัง volume (ใช้ชือว่า /esb) และ mount ให้เรียบร้อย

mkdir /ebs
mount /dev/sdc1 /ebs

ถึงขั้นตอนนี้คุณจะได้ /ebs ที่ mount มาจาก volume ที่สร้างขึ้นแล้ว จากนั้นเรามาเริ่มประกอบระบบปฏิบัติการใหม่โดยใช้ debootstrap กัน ให้ติดตั้ง debootsrap ดังนี้

apt-get install debootstrap

จากนั้นประกอบ LSB ขั้นมาก่อน

debootstrap squeeze /ebs

หลังจาก debootstrap ประกอบ LSB เสร็จ ใน /ebs คุณก็จะได้โครงสร้างเหมือน LSB จริงๆ แต่ไม่มี kernel และ initrd เท่านั้น ทีนี้ได้เวลาลุยแล้ว mount dev, proc, sys เพื่อใช้ในการ chroot

mount proc /ebs/proc -t proc
mount sysfs /ebs/sys -t sysfs
mount -o bind /dev /ebs/dev

เอาล่ะหลังจาก mount แล้วคุณจะได้ระบบปฏิบัติการซ้อนขึ้นมาใหม่อีก 1 ตัว มา chroot กันครับ

chroot /ebs

จากนั้นให้ตั้งค่า locale ดังนี้

apt-get install locales
dpkg-reconfigure locales

ตอนนี้คุณจะได้ระบบปฏิบัติการอีกหนึ่งตัวที่พร้อมทำงานแล้ว คราวนี้มาลองติดตั้ง services สักตัวครับ ขอเป็น web server ง่ายๆ อย่าง apache2 ก็แล้วกันครับ

apt-get install apache2

ตอนนี้เราก็ได้ web server ลงบน EBS ของเราแล้ว หากเรา browse ไปที่ Public IP คุณจะเห็นหน้าเว็บ default ของ apache ละ ทีนี้เพื่อความง่าย เขียน script ชื่อ ebs-services.sh เพื่อ start/stop services บน EBS ของเราครับ

---
#!/bin/bash
if [ ! -e /ebs/start_ebs.sh ]; then
echo "EBS volume is not mounted!"
exit 1
fi
if [ "$1" = "stop" ]; then
umount /ebs/sys
umount /ebs/proc
umount /ebs/dev
chroot /ebs /etc/init.d/apache2 stop
umount -lf /ebs
else
mount -t proc proc /ebs/proc
mount -t sysfs sysfs /ebs/sys
mount -o bind /dev /ebs/dev
chroot /ebs /etc/init.d/apache2 start
fi
---

เอาไฟล์ script นี้ไปใส่ไว้ใน /ebs ตอนนี้เราก็ได้ service ติดไปพร้อมกับ volume แล้ว เวลาย้าย volume ไป attach กับ instance อื่นๆ คุณก็สามารถ start services ของคุณได้ แถมยังสร้าง snaptshot ให้กับ volume เพื่อสำรองข้อมูลได้ด้วย

มาดูวิธีการย้าย ESB volume ไปใส่ instance อื่นที่สร้างไว้รอ เราต้อง stop service ก่อนครับ ก็ run script ของเราเมื่อกี้

./ebs-services.sh

จากนั้นก็ปลด volume ออกจาก instance เดิม

euca-detach-volume vol-5959961D

จากนั้นก็ attach ไปยัง instance อื่น ของผมชื่อ i-42B208D7

euca-attach-volume -i i-42B208D7 -d /dev/sdc vol-5957061D

จากนั้นก็ login ไปที่ instance แล้วก็ mount ให้เรียบร้อย

mkdir /ebs
mount /dev/sdc1 /ebs

จากนั้นก็ start services ของเรา

./ebs/start-ebs-services.sh

แค่นี้เราก็ย้าย EBS volume พร้อม sevices ไปต่อกับ instance อื่นๆ ได้แล้ว

ในครั้งที่แล้วเราสร้าง EMI โดยการติดตั้ง OS ลงใน Disk Image ครั้งนี้ผมจะมาแนะนำวิธีแบบฉลาดแกมโกงคือวิธีการแก้ไข Disk Image ที่มีอยู่แล้ว ในโครงการ Eucalyptus มี Pre-Packaged Image ที่ใช้เป็น Guest OS อยู่แล้ว อยู่ในรูปแบบ JeOS (Just enough Operating System) ซึ่งเราสามรถเอา Image มาแก้ไขได้ :) ไม่ได้ล้อเล่นครับ เอามาแก้ไขและติดตั้งโปรแกรมหรือของที่ยังขาดได้โดยตรงเลยล่ะ วิธีการนี้เป็นวิธีการเล่นกับ Disk Image ทั่วๆ ไปที่เรามักพบเจอกันอยู่แล้ว อธิบายหลังการคร่าวๆ กันก่อน JeOS Image ที่มีอยู่แล้วก็คือ Disk Image, Kernel Image (มีทั้ง KVM และ Xen) และ Ram Disk Image (Initrd.ing สำหรับ KVM,Xen) ซึ่งเราจะต้อง mount เจ้า Disk Image นี้ขึ้นมาเป็นอุปกรณ์หนึ่งในเครื่องของเราจากนั้นก็แก้ไขเหมือนกับการใช้งาน Storage ทั่วไป

สำหรับการติดตั้งโปรแกรมหรือบริการเพิ่มเติมเราสามารถใช้เครื่องมือที่เป็น package manager ของระบบปฏิบัติการนั้นๆ ได้โดยตรง ไม่ว่าจะเป็น Apt, Yum หรือ Zypper แต่ต้องทำในสิทธิ root เท่านั้น ที่ต้องระวังคือการติดตั้งอย่าให้ Disk Image ถูกเขียนจนเต็ม หากทราบว่าขนาดของ Disk Image ไม่พอให้ขยาย Disk Image ก่อนแล้วค่อยติดตั้งโปรแกรมเพิ่มเติมลงไป และสุดท้ายอย่ายุ่งกับ Kernel เป็นดีที่สุด เพราะคุณอาจต้องไล่เก็บ Kernel ของ KVM,Xen และ Initrd.img ของ KVM, Xen ด้วย อันนี้เปลืองแรงโดยใช่เหตุ เข้าใจข้อกำหนดกันแล้วมาลงมือทำกันได้เลย

ขั้นแรกไปดาวน์โหลด Image มาก่อน อาจจะไปเก็บเอาที่ UEC Release Image หรือ Pre-Packaged Image ของ Eucalyptus ได้เช่นกัน ผมยกตัวอย่างจาก Pre-Packaged Image จาก Eucalyptus ก็แล้วกันครับ มีขนาดเล็กดีครับ :) เครื่องผมเป็น Ubuntu 9.10 32 bits ผมขอเลือก Image ของ Ubuntu 32 bit มาเล่นก็แล้วกันครับ ใครใช้ Centos, Fedora ก็เลือกเอามาปรับแต่งกันตามสะดวกครับ ขั้นแรกดาวน์โหลด Pre-packaged มาก่อน

wget http://www.eucalyptussoftware.com/downloads/eucalyptus-images/euca-ubuntu-9.04-i386.tar.gz

เมื่อได้ไฟล์มาแล้วให้คลี่ไฟล์ออกครับ

tar zxvf euca-ubuntu-9.04-i386.tar.gz

เราจะได้ directory ที่ชื่อ euca-ubuntu-9.04-i386 ในนั้นจะมี kernel, initrd.img และ disk image เรียงกันอยู่เป็นระเบียบ :) disk image ที่เราจะเอามาปรับแต่งกันอยู่ที่ไฟล์ ubuntu.9-04.x86.img เอ้ามาต่อกัน

สร้าง loop device ขึ้นมาเพื่อใช้เป็น device ในการ mount image ดังนี้

cd euca-ubuntu-9.04-i386
losetup /dev/loop5 ubuntu.9-04.x86.img

ตอนนี้ disk image จะถูกผูกอยู่กับ loop device ชื่อ /dev/loop5 ตอนนี้เราเสมือนมี disk อยู่ 1 ลูก ที่รอการ mount เจ๋งมั๊ยอ่ะ เอ้าจะช้าอยู่ใย mount มันซะเลย

mkdir /media/euca-mount
mount /dev/loop5 /media/euca-mount

หลังจาก mount แล้วเราจะเห็น file ที่มีโครงสร้างเหมือน LSB เปี๊ยบ ทีนี้อยากจะ copy อะไรใส่ลงไปเพิ่มก็ทำได้ตามสบายครับ :) สำหรับการติดตั้งโปรแกรมเพิ่มเติมให้ chroot เข้าไปแล้วใช้ package manager ของ OS นั้นๆ เป็นตัวจัดการ เท่านี้เราก็แก้ไข Pre-Packaged เพื่อสร้าง services ใหม่ๆ บน Cloud ได้เอง ง่าย และรวดเร็วครับ :) ในภาคต่อไปจะเป็นการยืดหดของ Disk Image การทำ Image ให้สนับสนุนในทุกๆ Hypervisor (KVM,Xen,Vmware,VirtualBox) และการสร้าง Services บน Elastic Block Storage

ช่วงนี้กระแส Cloud Computing ในประเทศไทยกำลังมาแรงและการใช้งานก็กำลังทะยอยเพิ่มมากขึ้น หลายบริษัทต่างพยายามเข็นผลิตภัณฑ์ของตัวเองออกมาเพื่อบอกว่ามี Cloud Solution เช่นกัน สำหรับ how-to นี้คงไม่ได้พูดถึงเรื่อง Cloud หรือที่มาที่ไปของ Cloud มากนัก แต่ขอเปลี่ยนจากการติดตั้งมาเป็นการสร้างบริการบน Cloud กันเลยดีกว่า :) ในต่างประเทศ Software As A Services เป็นจุดเปลี่ยนในภาคอุตสาหกรรมซอฟต์แวร์มาก นอกจากจะลดต้นทุนการลงทุนเรื่องฮาร์ดแวร์ของผู้ประกอบการแล้ว การ provisioning ผ่านบริการบน IaaS ทำให้การลงทุนและระยะเวลาในการ deploy application ให้กับลูกค้าสั้นลงมาก เพียง 3 นาทีลูกค้าของคุณก็สามารถใช้งานซอฟต์แวร์ของคุณผ่าน Cloud Services ได้แล้ว เจ๋งมั๊ย วันนี้ผมจะมาแนะนำการสร้าง Eucalyptus Machine Image (EMI) สำหรับ Private Cloud ในองค์กรอย่าง Eucalyptus สำหรับท่านที่ใช้ Ubuntu Enterprise Cloud ก็สามารถใช้วิธีนี้ได้เช่นกันครับ

ก่อนจะเริ่มสร้าง Eucalyptus Machine Image มาทำความเข้าใจเกี่ยวกับ EMI กันก่อน Euclyptus ใช้ EMI ในการ deploy virtual machine ซึ่ง image นั้นจะต้องประกอบด้วย

  1. Ram Disk Image
  2. Kernal Image เป็นไฟล์ kernel เพื่อใช้ในการ boot vm ทั้งนี้ขึ้นอยู่กับว่าจะใช้ hyperviser แบบใด KVM, Xen
  3. Disk Image เป็น file system ที่ถูกบีบอัดภายในคือโครงสร้างของ Linux Standard Base พร้อม Service ที่เราใส่ลงไป

วันนี้จะมาแนะนำวิธีการสร้าง Service Image ของ media wiki กัน เอ้ามาลงมือกันเลย!

สร้าง disk image แบบ qcow2 ชื่อ image.img เพื่อใช้เป็นที่เก็บ OS และ media wiki ของเรา ดังนี้

kvm-img create -f qcow2 image.img 5G

รอสักพักเราจะได้ไฟล์ disk image ชื่อ image.img มา จากนั้น ติดตั้ง OS ลงไป โดยใช้คำสั่ง

sudo kvm -m 256 -cdrom ubuntu-9.04-server-amd64.iso -drive
file=image.img,if=scsi,index=0 -boot d
-net nic -net user -nographic -vnc :0

จากนั้นใช้ vncviewer ติดตั้ง OS จนเสร็จ จากนั้นเรียกใช้งาน disk image เพื่อคอนฟิกต่อดังนี้

sudo kvm -m 256 -drive file=image.img,if=scsi,index=0,boot=on -boot c
-net nic -net user -nographic -vnc :0

ติดตั้ง media wiki ต่อดังนี้

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mediawiki

เท่านี้เราก็ได้ disk image ที่มี media wiki เป็น services แล้ว จากนั้นมาจัดการเรื่อง image อีก 2 ตัวคือ ram disk และ kernal image เราสามารถใช้ kernel และ initrd.img จาก disk image ที่เราติดตั้งได้เลย โดยการคัดลอกออกมาไปยังเครื่องอื่น โดยใช้คำสั่ง

scp /boot/initrd.img-2.6.28-11-server user@A.B.C.D:
scp /boot/vmlinuz-2.6.28-11-server user@A.B.C.D:

เปลี่ยน A.B.C.D เป็น ip address ของเครื่องปลายทางที่คุณต้องการคัดลอกไป จากนั้นแก้ไข rc.local เพื่อลงทะเบียน public key อัตโนมัติขณะ boot VM ติดตั้ง curl เพิ่มเติมลงใน VM images ของคุณ

sudo apt-get install curl

จากนั้น เพิ่ม config ดังนี้ ลงใน rc.local ก่อน exit 0

-----

depmod -a
modprobe acpiphp

# simple attempt to get the user ssh key using the meta-data service
# assuming “user” is the username of an account that has been created

mkdir -p /home/user/.ssh
echo >> /home/user/.ssh/authorized_keys
curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key | grep 'ssh-rsa' >> /home/user/.ssh/authorized_keys
echo "AUTHORIZED_KEYS:"
echo "************************"
cat /home/user/.ssh/authorized_keys
echo "************************"

-----

ลบ network persistent rule จาก /etc/udev/rules.d ซึ่ง VM เมื่อ boot ขึ้นมาจะสร้าง interface eth0 โดย Eucalyptus

sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules

เท่านี้เราก็ได้ EMI ที่เป็นบริการ Media Wiki กันแล้ว ง่ายมั๊ย เอาล่ะการลงทะเบียน Kernel Image กับ Eucalyptus ใช้คำสั่งดังนี้

euca-bundle-image -i vmlinuz-2.6.28-11-server --kernel true
euca-upload-bundle -b mybucket -m /tmp/vmlinuz-2.6.28-11-server.manifest.xml
euca-register mybucket/vmlinuz-2.6.28-11-server.manifest.xml

คุณจะได้ค่า eki-XXXXXXXX ออกมา ให้จดเอาไว้ จากนั้นลงทะเบียน Ram Disk Image ดังนี้

euca-bundle-image -i initrd.img-2.6.28-11-server
euca-upload-bundle -b mybucket -m /tmp/initrd.img-2.6.28-11-server.manifest.xml
euca-register mybucket/initrd.img-2.6.28-11-server.manifest.xml

คุณจะได้ค่า eri-XXXXXXXX ออกมา ให้จดเอาไว้ จากนั้นลงทะเบียน Disk image ต่อ โดยใช้ eki และ eri ที่ได้มาลงทะเบียน

euca-bundle-image -i image.img --kernel eki-XXXXXXXX --ramdisk eri-XXXXXXXX
euca-upload-bundle -b mybucket -m /tmp/image.img.manifest.xml
euca-register mybucket/image.img.manifest.xml

เท่านี้เราก็ได้ EMI เอาไว้สร้าง instance กันแล้ว คราวหน้าจะมาแนะนำการสร้าง EMI จาก image ที่มีอยู่แล้ว เช่น Centos, Ubuntu เป็นต้น