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

หลายท่านพยายามสร้าง 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 เป็นต้น