Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ซอฟต์แวร์ >> เครื่องเสมือน

OpenStack เหมาะกับคุณไหม? คู่มือปฏิบัติการสำหรับผู้เริ่มต้น

นี่คือคำถามที่ดีมาก โดยมีหลายเหตุผล หนึ่ง OpenStack เป็นคำศัพท์บัซซ์เวิร์ด (buzzword) ที่ใหญ่โตและดูประณีตในปัจจุบัน และทุกคนที่คิดว่าตนเองเป็น "ผู้รู้" จะบอกคุณว่าควรใช้เทคโนโลยีนี้ คล้ายกับคำว่า "คลาวด์" การต่อต้านก็ไร้ผล สอง มันเกี่ยวข้องกับเสมือนภาคี (virtualization) ดังนั้นคุณอาจควรเรียนรู้เพิ่มเติม

เหตุผลที่สาม สี่ และอื่นๆ จะชัดเจนขึ้นในบทความนี้ แต่ประเด็นหลักคือ: คุณ สามารถ และ ควร ลองเล่น OpenStack ได้หรือไม่? ผมถามคำถามนี้จากมุมมองของคนที่มี直覺ทางเทคนิค (technical intuition) และประสบการณ์มากในการลองผิดลองถูกกับ OpenStack บทความ/คู่มือวันนี้จะแสดงวิธีเริ่มต้นกับเทคโนโลยีนี้

ความคาดหวัง vs ความเป็นจริง

แล้ว OpenStack ล่ะ แต่คุณรู้จักใครบ้าง—นอกจากผู้ให้บริการโฮสติ้งระดับใหญ่ 3-4 แห่ง—ที่ใช้จริง? ทุกคนพูดถึงมัน แต่คุณจะหาตัวอย่างการใช้งานจริงไม่ได้มากนัก นี่ทำให้ผมสงสัยและคิดว่า ทำไมถึงเป็นเช่นนั้น?

ผมจึงตัดสินใจเดินทางสู่ OpenStack เพื่อดูว่าสามารถเชี่ยวชาญเทคโนโลยีนี้ได้เร็วและง่ายหรือไม่ จากนั้นเขียนบทช่วยสอน (tutorial) ให้คุณ แต่เร็วๆ นี้ก็พบว่าซอฟต์แวร์นี้ไม่ได้เป็นเรื่องเล็กๆน้อยๆ และมีอำนาจทำให้แม้แต่ "นर्ड" (geek) ที่มี直覺ดีที่สุดก็ต้องยอมรับความยากลำบาก ผมจึงเปลี่ยนแนวทาง จากการพยายามเขียนคู่มือขั้นตอน ไปสู่คำถามเชิงอิสติตวิทยาเกี่ยวกับความเกี่ยวข้องของ OpenStack รวมถึงการพยายามเติมช่องว่างระหว่างความคาดหวังของคุณ (และผม) กับความเป็นจริงที่หนักแน่น

OpenStack ยากมาก

หลายชั่วโมงที่ปวดหัวกับคำสั่งบรรทัดคำสั่ง (command line) ผมตระหนักว่า OpenStack ไม่สามารถ "ฝึกให้เชื่อฟัง" ได้แบบที่ผมทำกับ KVM หรือ Docker ไม่ได้ แค่ดูตัวอย่างเร็วๆ อ่าน man page และลองผิดลองถูกใน shell ไม่พอที่จะเริ่มใช้งานได้จริง OpenStack ดูเหมือนภูเขาที่มีหิมะปิดทับ และผมมีแค่ถุงเท้าสำหรับปีนเขา

ยิ่งเล่นยิ่งรู้ว่ามันเป็นโซลูชันที่ซับซ้อนมากและ "ออกแบบมากเกินไป" (over-architected) ยิ่งเล่นยิ่งหลบหนี ไม่น่าสนใจ และทำให้คำถามเชิงปรัชญานั้นดูอ่อนแอลงเรื่อยๆ

สิ่งที่ไม่ควรทำ

ก่อนที่จะแสดงวิธีเริ่มต้น มีจุดสำคัญหลายประการต้องชี้แจก ก่อนอื่น สถาปัตยกรรม: ซับซ้อนมาก โมดูลาร์มาก แต่ละคอมโพเนนต์ทำงานเป็นบริการแยกต่างหาก ทั้งชื่อและฟังก์ชัน การมีคอมโพเนนต์เยอะถูกถือว่าเป็นสิ่งดีในปัจจุบัน

ภาพจากเอกสารอย่างเป็นทางการของ openstack.org; คลิกเพื่อขยาย

ประการที่สอง ความเกี่ยวข้องทางธุรกิจ (business relevance) ทำไมคุณถึงอยากใช้ OpenStack? มันเป็นบริการโครงสร้างพื้นฐาน (infrastructure service) หากคุณต้องดำเนินธุรกิจ คุณไม่ต้องรู้ OpenStack แค่ใช้มันก็พอ แล้วคุณมีเวลา เงิน ทักษะ และแรงงานพอที่จะลงทุนเรียนรู้เทคโนโลยีนี้หรือไม่? ต้องการเร็วแค่ไหน? ต้องรู้ลึกแค่ไหน? เป้าหมายคืออะไร? คุณจะเป็นผู้ให้บริการ (provider) หรือผู้ใช้บริการ (consumer) ของ OpenStack? หากคิดจะใช้เพื่อธุรกิจ ธุรกิจมีขนาดใหญ่แค่ไหน? วirtual machines หลายสิบ ตัว? หลายร้อย? หลายพัน? หลายหมื่น?

จุดสำคัญนี้มักถูกมองข้ามโดยผู้จัดการที่ไม่รู้เรื่อง แต่อยากกระโดดขึ้นรถบัซซ์เวิร์ด พวกเขาสับสนระหว่างการจัดเตรียม (provisioning) และการใช้งานบริการ (utilization) ทำให้โครงสร้างพื้นฐานทำหน้าที่เหมือนธุรกิจ ซึ่งมันไม่ใช่ แล้ว OpenStack เริ่มไม่น่าทำความเข้าใจมากขึ้น เพราะทุกคนยุ่งกับการทำให้มันรัน ได้เพื่อรันอะไرواتบนมัน ใช้เวลาหลายเดือนไปกับความพยายามที่ไร้ผล และท้อแท้ นี่คือเหตุผลที่ OpenStack มีอยู่แค่ปลายปลีกของสเปกตรัมการใช้งาน— إما การปรับใช้ขนาดใหญ่ (massive deployments) หรือ ไม่มีเลย

สิ่งที่ควรทำ

ผมได้กล่าวถึงเหตุผลบางส่วนแล้ว นี่คือเหตุผลเพิ่มเติม OpenStack คุ้มค่าหากคุณอยากอยู่ในแนวหน้าของเทคโนโลยี คุ้มค่าหากพยายามสร้าง private หรือ public clouds หากตั้งใจเป็นผู้ให้บริการ และหากต้องการสร้างความเชี่ยวชาญและเป็นผู้นำในด้านคลาวด์ ซึ่งอาจเป็นเป้าหมายรองที่ถูกต้องของธุรกิจคุณ

OpenStack ยังมีประโยชน์หากแค่อยากทดสอบซอฟต์แวร์และรัน workloads บนมัน คุณสามารถจัดการมันเป็น "กล่องดำ" (blackbox) หรือพัฒนาความเข้าใจขั้นพื้นฐาน เพื่อให้สามารถแก้ไขปัญหา (troubleshoot) ได้เมื่อมีบางอย่างผิดพลาด

คำถามใหญ่คือ: จะทำอย่างไร? ตามที่กล่าวไว้ กระบวนการ manual ดูโหดร้าย ต้องการหนังสือหลายเล่ม หลายสัปดาห์ และการพิมพ์คำสั่ง command line เยอะมาก สร้าง users, groups, roles, databases, network bridges, containers และรายละเอียดเล็กๆน้อยๆที่โหดร้ายอื่นๆ

เราต้องการข้ามทั้งหมดนั้น ปกติผมจะแนะนำการเรียนรู้แบบ linear (ลำดับขั้น) แต่ OpenStack ซับซ้อนเกินไป เราจะเริ่มด้วยกลไกอัตโนมัติ (automated mechanism) ให้ทุกอย่างรัน เชื่อในการตั้งค่าอัตโนมัติอย่างโกล้าหลอก (blindly) เมื่อตั้งค่าสำเร็จสมบูรณ์ เราจะย้อนกลับมาศึกษาทีละขั้นตอน

OpenStack Ansible Deployment (OSAD)

ถ้าค้นหาบนเว็บ จะพบโซลูชันหลายสิบตัว ที่อ้างว่าเป็น "หoley grail" ของการจัดการและปรับใช้ OpenStack ใช่ มันมีอยู่เพราะ OpenStack ยากเกินไป ไม่ได้แก้ปัญหารากฐาน แต่เว็บเต็มไปด้วยโซลูชัน overlay แบบ ad-hoc ที่ออกแบบมาเพื่อให้ใช้งาน ฝังเฝ้าติดตาม (monitor) ง่ายขึ้น คล้ายกับ containers จริงๆ OSAD เป็นโครงการชุมชน (community project) หนึ่ง แม้จะมีอีกมากมาย เช่น Fuel, Inception, TripleO, Compass, PackStack และอื่นๆ ในบทช่วยสอนนี้ เราจะเน้น OSAD และติดตามเครื่องมืออื่นๆ ในอนาคต หมายเหตุ: ผมเกี่ยวข้องกับโครงการนี้ ดังนั้นหากคุณกลิ่นอágias (bias) โปรดเพิกเฉยต่อบทความนี้

การตั้งค่าพื้นฐาน

ทางเทคนิค คุณต้องรันแค่ 2 คำสั่ง หนึ่ง ดึง master script จาก GitHub repo สอง รัน Ansible setup สำหรับผู้ที่สงสัยว่า Ansible คืออะไร คือ configuration management tool คล้าย Puppet, Chef, CFEngine ออกแบบมาเพื่อทำให้การปรับใช้ (deploy) นโยบายและการตั้งค่าบนเครื่องเป้าหมายเป็นอัตโนมัติ ตรรกะการปรับใช้ถูกเข้ารหัสในไฟล์ที่เรียกว่า Playbooks โดยใช้ภาษา YAML ซอฟต์แวร์จะ parse Playbooks และส่งการตั้งค่าที่จำเป็นไปยังโฮสต์เป้าหมายผ่าน SSH นั่นคือเวทมนตร์พื้นฐานของ Ansible

คำเตือน!

ผมจะไม่ลงลึกรายละเอียดการทำงานของ Ansible แค่เน้นสรุปสั้นๆว่ามันทำอะไรและพฤติกรรมอย่างไร ไวยากรณ์ค่อนข้าง直覺 (intuitive) หากเข้าใจแล้ว คุณควรติดตามตรรกะของไฟล์ yml ของ OSAD ได้ มาดูตัวอย่าง Playbook จากเอกสารออนไลน์:

---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted

ที่นี่มีอะไรบ้าง? มาดูทีละขั้นตอน:

  • hosts: directive กำหนดว่า Playbook นี้ควรทำงานบนโฮสต์ไหน
  • vars: กำหนดตัวแปรสำหรับเว็บเซิร์ฟเวอร์ เช่น port และ max clients
  • remote_user: กำหนด user ที่ Playbook tasks ควรทำงานภายใต้ - คือ root
  • tasks: กำหนดว่าจะรันอะไรเมื่อ hosts criteria ตรงกัน
  • name (task 1): ชื่อ task คำอธิบายยาวๆ หรือสั้นก็ได้ แต่นามสกุลที่อธิบายเหมือน title จะเข้าใจง่ายกว่า
  • yum: ติดตั้ง package httpd เวอร์ชันล่าสุด
  • template: คัดลอก configuration template ไปยังเว็บเซิร์ฟเวอร์ ทุกตัวใช้ httpd.conf เดียวกัน
  • notify: ประกาศ trigger ชื่อ "restart apache" จะทำงานถ้าการกระทำข้างต้นสำเร็จ นั่นคือ post-action
  • name (task 2): ตั้งค่า apache ให้รันตอน boot และเริ่ม service หากยังไม่รัน
  • handlers: จัดการ service restart ซึ่งควรเป็น true ก็ต่อเมื่อการคัดลอก config file สำเร็จ ซึ่งสมเหตุสมผล จากนั้น apply action ไปยัง httpd service

นี่คือการอธิบายสั้นๆเกี่ยวกับ Ansible playbooks ตอนปรับใช้ OSAD เสร็จ คุณสามารถอ่านไฟล์ yaml ที่มีอยู่ และสำรวจการตั้งค่า จะเห็นสิ่งซับซ้อนมาก รวมถึง containers, bridges และอื่นๆ แต่ความคิดคือ: หลีกเลี่ยงความวุ่นวาย ให้คนอื่นจัดการให้ก่อน ตอนแรกอย่างน้อย

เริ่มต้นใช้งาน

สองคำสั่งที่ดีงามของเรา:

bash <(curl https://git.openstack.org/cgit/stackforge/os-ansible-deployment/
plain/scripts/run-aio-build.sh)

/opt/stackforge/os-ansible-deployment/openstack-ansible setup-everything.yml

นี่จะเริ่มการตั้งค่า และขึ้นอยู่กับฮาร์ดแวร์ อาจใช้เวลา 40-50 นาที คุณต้องการ CPU, memory และ disk space เพียงพอ แต่น้อยกว่าที่คาด 4 cores, 8 GB RAM และ 40 GB disk ควรพอ แม้ laptop ระดับดีก็ทำได้ อย่าคาดหวังประสิทธิภาพดาวดวง

...
+ unset -f deactivate
+ exit 0

/opt/stackforge/os-ansible-deployment
------------------------------------------------

- [ Run Time = 2422 seconds || 40 minutes ]
------------------------------------------------

- [ Status: Success ]
------------------------------------------------
+ cat
++ ip -o -4 addr show dev eth0
++ awk -F '[ /]+' '/global/ {print $4}'
+ chmod +x /etc/update-motd.d/20-openstack
+ cat
++ pwd
+ chmod +x /etc/update-motd.d/21-galera

หากเห็น output ข้างต้น แสดงว่าการตั้งค่าเริ่มต้นสำเร็จแล้ว

เล่นกับ Nova

ขั้นตอนต่อไปคือตรวจสอบว่ารันคำสั่งได้ 1-2 คำสั่ง การตรวจสอบ whole stack บนระบบอาจไม่เป็นไปได้ แต่ควรเห็น network interfaces จำนวนมาก รวมถึง bridges และ virtual devices ที่สร้างขึ้นเมื่อ spawn containers คล้ายกับที่เห็นกับ Docker

คำสั่ง Nova น่ารำคาญและยาว มากกว่าควรตั้งค่า environment variables แทนที่จะพิมพ์ทุกครั้ง:

nova --os-user-name admin --os-password secrete --os-tenant-name admin --os-auth-url https://172.29.236.100:5000/v2.0 image-list
+------------------------------------+--------+--------+--------+
| ID | Name | Status | Server |
+------------------------------------+--------+--------+--------+
| 896fa8ca-682b-4f4e-859e-9f08b... | cirros | ACTIVE | |
+------------------------------------+--------+--------+--------+

nova --os-user-name admin --os-password secrete --os-tenant-name admin --os-auth-url https://172.29.236.100:5000/v2.0 hypervisor-list
+----+---------------------+-------+---------+
| ID | Hypervisor hostname | State | Status |
+----+---------------------+-------+---------+
| 1 | server-001 | up | enabled |
+----+---------------------+-------+---------+

ตั้งค่า environment variables:

export OS_USERNAME=admin
export OS_PASSWORD=secrete
export OS_TENANT_NAME=admin
export OS_AUTH_URL=https://172.29.236.100:5000/v2.0

จากนั้นใช้คำสั่ง nova แบบสั้นๆ ในการ boot hosts ต้องระบุ image, flavor และ name บวกกับรายละเอียด identification ซึ่งเราทำไปแล้ว สำคัญไม่แพ้กัน ต้องมี SSH keys และ firewall rules เพื่อเชื่อมต่อ VMs ไม่งั้นจะไม่ทำงาน

nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0

nova keypair-add Dedoimedo > dedoimedo.pem
chmod 0600 dedoimedo.pem

nova boot First --image 896fa8ca-682b-4f4e-859e-9f08b82b47fb --flavor 3 --key-name Dedoimedo
+--------------------------------+------------------------------+
| Property | Value |
+--------------------------------+------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | nova |
| OS-EXT-SRV-ATTR:host | - |
| OS-EXT-SRV-ATTR:hypervisor | - |
| OS-EXT-SRV-ATTR:instance_name | instance-00000007 |
| OS-EXT-STS:power_state | 0 |
...
| created | 2015-06-04T09:48:59Z |
...
| flavor | m1.medium (3) |
...
+--------------------------------+------------------------------+

Output จะมี default auto-generated password สำหรับ host และคุณจะได้ IP address จากรายการ running hosts แล้วแค่ SSH เข้าไป หากสำเร็จ คุณก็ทำได้! อุปสรรคแรกถูกกำจัด

ping -c 1 172.29.248.13
PING 172.29.248.13 (172.29.248.13) 56(84) bytes of data.
64 bytes from 172.29.248.13: icmp_seq=1 ttl=64 time=0.634 ms

--- 172.29.248.13 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.634/0.634/0.634/0.000 ms

ssh -i dedoimedo.pem cirros@172.29.248.14
The authenticity of host '172.29.248.14 (172.29.248.14)'
can't be established. RSA key fingerprint is 5b:cf:ed:99:b8:a9:2a:2f:ce:58:f0:3c:eb:db:7c:c1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.29.248.14' (RSA) to the list of known hosts.

ปัญหาที่อาจพบ

ไม่ว่าจะเลือก manual path หรือ automated setup คุณอาจเจอปัญหาบ้าง ส่วนนี้รายละเอียดปัญหาทั่วไปเมื่อเล่นกับ OpenStack, Ansible หรือทั้งคู่

openstack-ansible setup-everything.yml
Variable files: "-e @/etc/openstack_deploy/user_secrets.yml -e @/etc/openstack_deploy/user_variables.yml "
ERROR: Inventory script (inventory/dynamic_inventory.py) had an execution error: Traceback (most recent call last):
File "/openstack/os-ansible-deployment/playbooks/inventory/
dynamic_inventory.py", line 21, in <module>
import netaddr
ImportError: No module named netaddr

ขาด Python modules สำคัญ ต้องติดตั้ง:

pip install netaddr
Collecting netaddr
/usr/local/lib/python2.7/dist-packages/pip/_vendor/requests/
packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/
security.html#insecureplatformwarning.
InsecurePlatformWarning
Downloading netaddr-0.7.14-py2.py3-none-any.whl (1.5MB)
100% | | 1.5MB 312kB/s
Installing collected packages: netaddr
Successfully installed netaddr-0.7.14

ขณะเล่นกับ OpenStack Ansible Deployment framework อาจเจอ errors เกี่ยวกับ All in One (AIO) build ซึ่งอาจบ่งชี้ปัญหา SSH แม้คุณจะคิดว่าทุกอย่างดีอยู่แล้ว:

GATHERING FACTS ***************************************************************
fatal: [aio1] => SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh

TASK: [apt_package_pinning | Add apt pin preferences] ***************************************************************
FATAL: no hosts matched or all hosts have already failed -- aborting

Errors นี้อาจมาจาก 2 bugs ดังกล่าว โปรดตรวจสอบ Error ที่สามที่พบบ่อยคือ พยายาม clone repo เข้า directory ที่ไม่ได้ว่าง:

+ git clone -b master https://github.com/stackforge/os-ansible-deployment.git /opt/stackforge/os-ansible-deployment
fatal: destination path '/opt/stackforge/os-ansible-deployment' already exists and is not an empty directory.

อ่านเพิ่มเติม

หากคุณรู้สึกว่าบทช่วยสอนนี้ง่ายเกินไปสำหรับความชอบที่ประณีตของคุณ:

สไลด์บางชุดที่น่าสนใจ

Red Hat Distribution of OpenStack (RDO)

Mirantis OpenStack Deployment and Management - Fuel

สรุป

เห็นได้ชัดว่ามี incarnation (รูปแบบการปรับใช้) ของ OpenStack มากเกินไป ในทางหนึ่ง มันจำลอง landscape ของ Linux ที่ซับซ้อน รุ่งเรือง และสับสน เข้าสู่ 4 มิติของตัวเอง และเราอาจต้องทนทุกข์กับทศวรรษของ buzzwords และ name dropping จนกว่ามาตรฐานจะถูกบรรลุ และสมดุลในชุมชนจะเกิดขึ้น OSAD ใช้ได้ แต่ based on Ubuntu 14.04 + LXC คุณอาจอยากได้ Red Hat หรือ CentOS สำหรับ production ทำได้ หมายความว่าควรทดสอบ setups และ tools อื่นๆ ด้วย แต่ทำได้หลังจากที่คุณผ่าน "บัพติซึมแห่งความสนุก" (baptism of fun) กับ OpenStack แล้ว

หลังจากพูดไปแล้ว หากคุณไม่อยากรออีกหลายปี ก่อนที่ techno-storm จะผ่านไป คุณสามารถเริ่มเล่นกับ OpenStack ได้ ไม่ว่าจะเป็นเพื่อธุรกิจหรือ backbone อะไรก็ตาม ขั้นตอนแรกจะ overwhelming มาก ดังนั้นคุณควรจับ helper framework แล้วค่อยย้อนกลับสู่ core technology

OSAD เป็นตัวอย่างที่พอใช้ แม้ไกลจากง่ายและสมบูรณ์ แต่มัน light years ห่างจากสิ่งที่ OpenStack ให้มาเพียงลำพัง และใช้งานได้จริง เพราะมันคืนความ直覺ทางเทคนิคบางส่วนกลับมา หวังว่าบทช่วยสอนนี้ช่วยให้คุณก้าวหน้าได้ ไม่ง่าย ไว้กาก และผมไม่ชอบมันมากนัก แต่ก็คงเป็นที่ดีที่สุดที่ทำได้กับเครื่องมือที่มีอยู่ สรุปคือ: อย่าคิดมากเกินไป หลีกเลี่ยง manual setups เลือก Ansible แก้ error ตอนใช้ครั้งแรก แล้วค่อยคุยกับ Nova และเพื่อนๆ หลังจากผ่านไปสักพัก ให้กลับมาทบทวน OpenStack และปรับแต่งช้าๆ จนกว่าจะ "ทำให้มอนสเตอร์นั้น馴服" (tamed) นั่นคือทั้งหมดสำหรับคู่มือนี้

P.S. ผมได้นำเสนอหัวข้อนี้ใน CloudOpen conference ในปีนี้ที่ Dublin, Ireland อย่างสนุกและบันเทิงกว่านี้ มากกว่านี้รายละเอียดที่การคลิกเมาส์ของคุณ ไปกันเถอะ

ขอแสดงความนับถือ