in How-to

สร้าง Cloud Services Image สำหรับ Eucalyptus ภาค 1

ช่วงนี้กระแส 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 เป็นต้น