บันทึกการร่วมทดสอบ ​Docker Swarm ในโครงการ Swarm3K

ถ้าพูดถึงเทคโนโลยี Container นาทีนี้ ก็คงหนีไม่พ้น Docker ที่มีสโลแกน 3 คำง่าย ๆ ก็คือ Build, Ship และ Run

cover-swarm3k

จุดเด่นแรก ๆ เลยของ Docker คือการทำให้นักพัฒนาซอฟแวร์มั่นใจได้ว่า ซอฟแวร์สามารถรันบน Production ได้เหมือนกับตอน Develop ทุกประการ ซึ่งเป็นจุดเริ่มต้นที่ทำให้ผมสนใจ Docker จนตอนนี้มีงานที่รับผิดชอบอยู่ ไป Deploy บน Production บ้างแล้ว

และยังมีอีกหนึ่งในฟีเจอร์เด่น ๆ ที่ชื่อว่า Docker Swarm ที่ทำให้การทำ Clustering และการ Scale out นั้น ง่ายมาก ด้วยการพิมพ์คำสั่งสั้น ๆ บรรทัดเดียว…

ก่อนที่บทความนี้จะกลายเป็นบทความแนะนำ Docker ไปซะก่อน ขอข้ามไปส่วนของโครงการ Swarm3K เลย ส่วนใครที่ยังไม่รู้จัก Docker ยังไม่รู้จัก Swarm แนะนำให้หาบทความอ่านกันก่อนนะครับ

 

Swarm2K

กาลครั้งหนึ่ง เมื่อ 22 ก.ค. ที่ผ่านมา ดร.ชาญวิทย์ แก้วกสิ คนไทยของเรานี้เอง (ขอเรียกว่าอาจารย์นะครับ) ได้ทำการทดสอบ Swarm mode ในชื่อโครงการ Swarm2K และได้มีผู้บริจาคเครื่อง Server เข้าร่วมโครงการกว่า 2,300 nodes (เครื่อง) และสามารถรัน Container ไปได้กว่า 96,000 containers และอาจารย์ก็ได้เขียน blog Docker คลัสเตอร์ขนาด 2,000 โหนด ไว้ให้อ่านด้วย จิ้ม link ซิ รออะไร…

 

Swarm3K

สำหรับครั้งนี้ อาจารย์ได้ทำโครงการ Swarm3K เพื่อทดสอบอีกครั้ง เมื่อวันที่ 28 ต.ค. (หรือเมื่อวันศุกร์ที่ผ่านมานี้เอง) ซึ่งผมก็ไม่ลังเลที่จะเข้าร่วมโครงการ โดยในครั้งนี้ เป้าหมายอยู่ที่ 3,000 nodes กับ 150,000 containers!!!

การเข้าร่วมก็ไม่ได้อยากอะไร แค่ไปแจ้งไว้ที่ GitHub Repository ของโครงการ โดยการ Fork project แล้วแก้ไขไฟล์ README.md โดยเขียนแจ้งเพิ่มเข้าไป แล้วทำการ Pull request กลับไป ให้อาจารย์ทำการ Merge (ใครใช้ git เป็นอยู่แล้วก็ไม่น่าจะติดอะไร)

Join project
Join project

แต่เอาเข้าจริง ในวันที่ทดสอบ ก็มีผู้ที่ไม่ได้แจ้งไว้ เข้าร่วมโครงการมาใหม่อีกราว 1,000 nodes (เด๋วขอเอาไว้เล่าทีหลัง)

 

1 สัปดาห์ก่อนเริ่มโครงการ

อาจารย์ได้เริ่มทดสอบก่อนเริ่มโครงการ 1 สัปดาห์ ซึ่งผมไม่ได้เข้าร่วมทดสอบ แต่ก็แอบส่องห้อง Gitter ที่อาจารย์ได้ใช้สำหรับคุยกันในตอนที่ทำการทดสอบ ก็เริ่มเห็นผู้เข้าร่วมบางท่าน นำ Script ที่ตัวเองเขียนขึ้นมา เพื่อสร้าง node จำนวนมาก ๆ มาปล่อยไว้บ้าง

 

1 วันก่อนเริ่มโครงการ

ในคืนก่อนเริ่มโครงการ ผมได้เช็คกับ GitHub Repository ของโครงการ ก็เห็นว่า อาจารย์ได้เขียนเอกสาร Node Preparation ไว้เพิ่มเติม ทำให้รู้ว่าต้องทำอะไรเพิ่มเติมจากการ Join Swarm ที่เคยเล่นมา ก็คือ จำเป็นต้องใส่ IP Address ของ node ของเราไปด้วย และต้องมีการแก้ไข Config ใน node เราด้วย

เนื่องจากไม่ว่างศึกษาการเขียน Script เพื่อให้ตอบโจทย์ข้างต้น (เกือบจะได้เล่น Code define infrastructure อยู่แล้วเชียว) ก็เลยเลือกที่จะ Manual ละกัน 25 เครื่อง ไหว ๆ เลยเริ่มจาก สร้าง node ขึ้นมา 1 ตัว ซึ่งผมใช้บริการของ Digital Ocean อยู่แล้ว ก็เข้าไปเลือก Image มาลองเล่น เพื่อเตรียมความพร้อมก่อน

Choose image
Choose image

จากรูปจะเห็นว่า Digital Ocean เตรียม Image ที่ลง Docker 1.12.1 ไว้บน Ubuntu 16.04 อยู่แล้ว เกือบจะตรงกับข้อกำหนดตามโครงการ Swarm3K ขาดแต่ Docker version 1.12.2

พอสร้าง Droplet (node) เสร็จ ลอง ssh เข้าไปดู พบว่า Docker ที่ลงไว้ให้ เป็น version 1.12.2 อยู่แล้ว พร้อมใช้งาน ก็เหลือแต่ Config ก็เข้าไปลองแก้ดู ไม่ยากอะไร เย่ ๆ ก็จัดการทำลาย Droplet ปิดเครื่อง นอน…

ก่อนปิดเครื่อง แอบไปเห็น Docker ออก version 1.12.3 …

 

1 ชั่วโมงก่อนเริ่มโครงการ

ตามกำหนดการคือ 4 ทุ่ม ผมเปิดคอมพ์มาตอน 3 ทุ่ม ในห้อง Gitter ของโครงการ อาจารย์ได้แจ้ง Token สำหรับ Join เป็น Worker แล้ว ลองเช็ค Dashboard ดู ก็เห็นมี node ที่ join เข้าไปเยอะแล้ว แถมในห้องยังคุยกันที่ Docker version 1.12.3 ผมจึงรีบเข้าไปสร้าง Droplet และตรวจสอบดู พบว่า Digital Ocean ยังไม่ได้เตรียม version 1.12.3 ไว้ให้!!!

ด้วยความอยากใช้ version ล่าสุด ก็เลยทำการอัพเดตซะ ก็ apt-get update && apt-get upgrade ไม่น่ายากอะไร

แต่ ๆๆๆ … ยังเป็น version 1.12.2!! นั่นไง งานแรกงอก ได้กาง Document ทำการ Setup Docker ใหม่ ไม่เป็นไร ทำมาหลายครั้งแล้ว ไม่กี่นาทีก็เสร็จ ได้ version 1.12.3 สมใจอยาก

แล้วก็เข้าไป Config ตามเอกสาร Node Preparation เพิ่มเติม เรียบร้อยแล้ว ทำการ Shutdown server ปิดเครื่อง นอน !?! #เด๋วๆ #ผิด

Shutdown น่ะทำจริง แต่ Shutdown เพื่อทำ Snapshot ไว้สำหรับสร้างเครื่องใหม่ 25 เครื่อง ตามที่ได้แจ้งร่วมโครงการไว้

พอสร้าง Snapshot เสร็จ ใช้เวลาประมาณ 1-2 นาที ก็พร้อมแล้วสำหรับ 25 node กดสร้างเลยยยยยยย

Create node 1-10
Create node 1-10

สำหรับการสร้าง node นั้น ผมเลือกใช้ SSH Keys เพื่อความสะดวกรวดเร็ว ไม่ต้องมาเปิด E-mail เพื่อเอา Password ไปกรอก (Digital Ocean จะส่ง Password ของ Droplet ใหม่ให้เราทาง E-mail)

ไม่ถึง 1 นาทีต่อจากนั้น Droplet ทั้ง 10 (Digital Ocean ให้สร้างได้ครั้งละไม่เกิน 10 Droplets) ก็ Live แล้ว ตอน 21:21 น.

Node 1-10 live
Node 1-10 live

ก็ SSH เข้าไปยังเครื่องแรก แล้วก็ป้อนคำสั่งเพื่อ Join เข้าไปยัง Swarm ตามโครงการ Swarm3K ได้ตั้งแต่ประมาณ 21:25 น.

First node joined
First node joined

ด้วยการที่ต้องป้อน IP Address ของเครื่องตัวเองเข้าไปเพิ่มเติมในคำสั่งด้วย จึงจำเป็นต้องหา IP Address ก่อน ซึ่ง Digital Ocean ก็แจ้ง IP Address ให้เห็นตั้งแต่สร้าง Droplet เสร็จแล้ว และแค่คลิกที่ IP Address ก็ Copy ใส่ Clipboard ให้เลย อันนี้ขอชม UX ของ Digital Ocean ทำเรื่องเล็ก ๆ น้อย ๆ ให้ แต่ได้ใช้จริง สะดวกดี

เมื่อ node แรก เข้าฝูง Swarm เรียบร้อย ใช้เวลาเพียง 1-2 นาที สำหรับเตรียมการ หลังจากนั้นก็ SSH เข้าไปเครื่องที่เหลือทีละเครื่อง ๆ (อย่างที่แจ้งไว้ตอนแรกว่า ไม่ว่างเตรียมตัวก่อน เลย Manual เอา) และก็ไปสร้าง Droplet เพิ่ม จนครบ 25 เครื่อง

Node 11-20 live
Node 11-20 live
Node 21-25 live
Node 21-25 live

เนื่องจาก Command เปลี่ยนไป (เพราะ IP Address) ทุกเครื่อง ก็เลยเขียน Text file แล้ว Copy คำสั่งแปะ

Join script
Join script

ทำให้การ Join ในแต่ละเครื่อง กินเวลาเพียงไม่กี่วินาที แต่เจออุปสรรค์นิดหน่อย กว่าจะ Join ครบ 25 nodes ก็ราว 4 ทุ่มนิด ๆ

25 nodes joined
25 nodes joined

 

อุปสรรค์

ที่ Droplet ที่ 17 เกิดอาการ SSH เข้าไปไม่ได้!!! เสียเวลากับมันอยู่พักนึง สุดท้ายเลือกที่จะทำลายทิ้ง แล้วสร้างใหม่

Node 17 can't login
Node 17 can’t login

 

Monitoring

หลังจาก Join ครบ 25 เครื่อง ผมก็นั่งส่องข้อมูลไปเรื่อย ในห้อง Gitter ของโครงการ เวลาเกือบ 4 ทุ่มครึ่ง อาจารย์ได้ประกาศว่า โครงการ Swarm3K ก็มี node เข้าร่วมถึง 3,000 nodes เรียบร้อย เย่ ๆ (ตื่นเต้นแทนอาจารย์)

3,000 nodes joined
3,000 nodes joined

แอบ Capture ติดเซเล็ปมาด้วย ^q^

อาจารย์ก็ได้ทดสอบ Deploy container ไปเรื่อย ตรงนี้รออาจารย์แกเขียน blog เล่าเองดีกว่า…

ผมก็ส่องข้อมูลไปเรื่อย จนราว 5 ทุ่มครึ่ง Dashboard ที่ Sematext ก็แสดงให้เห็นว่า มี node join เข้ามาแล้ว 4,500 nodes  เกินกว่าที่แจ้งไว้ใน GitHub โครงการ และชื่อโครงการ ไป +50% เลยทีเดียว และมากกว่าโครงการ Swarm2K เกือบเท่าตัว!!

Sematext Dashboard
Sematext Dashboard

ที่ Gitter อาจารย์ได้ประกาศ จะเริ่มทดสอบ c1m ใช่แล้วครับ 1 ล้าน Containers!!! (ผมนี่ ร้องเฮ้ย! ออกมาในใจดัง ๆ เลย)

c1m
c1m

เกือบลืมเล่า อาจารย์ได้ Broadcast หน้า Terminal ของอาจารย์ (ทำให้ผมได้รู้จัก tmux) ไว้ให้ดูผ่านหน้าเว็บเลย ผมก็เลยนั่งส่องคำสั่งที่อาจารย์ป้อนเข้าไปอยู่เรื่อย ๆ มีทั้งที่รู้แล้วบ้าง ยังไม่รู้บ้าง ก็ได้ความรู้เพิ่มเติมไปตามระเบียบ

Broadcast terminal and my terminal
Broadcast terminal and my terminal

 

จากรูปด้านบน ครึ่งบนจะเป็นหน้าเว็บ ที่อาจารย์ได้เปิดให้เราส่องดูกันได้ อาจารย์ได้สั่ง Scale จาก 10,000 ไปเป็น 50,000 containers

ส่วนครึ่งล่าง ผม SSH เข้าไปยัง node ของผมเอง จะเห็น Containers ที่อาจารย์ได้ Deploy ไว้ และกำลังเพิ่มขึ้นเรื่อย ๆ

 

หลังเที่ยงคืน

ผมกำลังจะลุกไปอาบน้ำ หลังจากอาจารย์ได้สั่ง Scale ขึ้นไปที่ 60,000 containers ก่อนที่ผมจะละสายตาไปจากหน้า Terminal ของอาจารย์ ก็ได้เห็นอาจารย์ป้อนคำสั่งอะไรแปลก ๆ กับที่เครื่อง Manager ทั้ง 3 ที่อาจารย์ใช้ Control ระบบอยู่ ซึ่งส่วนใหญ่ผมไม่เข้าใจ 555 แต่ก็เริ่มเห็นว่า มีการสั่งหยุดการทำงานของ mg0 (Manager เครื่องที่ 1) ซึ่งทำหน้าที่เป็น Leader อยู่ ณ ตอนนั้น เห็นอาจารย์แจ้งประมาณว่า จะไปปิด Debug mode ที่เปิดไว้เพราะจะเก็บ Log ส่งคืนทีมงาน Docker นี่ล่ะ

หลังจากนั้นมา ปัญหาเริ่มเกิด เครื่อง Manager ทั้ง 3 ไม่สามารถ Control ระบบต่อได้ ก็เห็นอาจารย์พยายามแก้ไข แต่จนแล้วจนรอด mg1 และ mg2 ก็ยังไม่สามารถขึ้นเป็น Leader ได้ อาจารย์เกือบที่จะถอดใจแล้ว แต่ผมเห็นอาจารย์ ตัดสินใจป้อนคำสั่ง stop docker service แล้ว mg1 ก็ขึ้นเป็น Leader ได้ และอาจารย์ก็ได้ประกาศใน Gitter ว่า Come back! เย่~!! (ดีใจไปกับเค้าด้วย)

แต่แล้ว mg1 และ mg2 ก็ยังไม่สามารถทำงานได้ จนในที่สุด อาจารย์ก็ได้ประกาศยุติโครงการ เวลาประมาณตี 1 ครึ่ง

Not continue
Not continue

 

What we learnt

หลังจากยุติโครงการ อาจารย์ได้สรุปสิ่งที่ได้เรียนรู้ในครั้งนี้ไว้ใน Gitter ดังนี้ครับ

What we learnt
What we learnt

รายละเอียด ไว้รอ blog ของอาจารย์อธิบายละกันนะครับ…

และคืนนั้น ผมได้ tweet คุยกับอาจารย์ อาจารย์ให้ความเห็นไว้แบบนี้ครับ

ซึ่งลองมาคิดย้อนกลับดู การที่อาจารย์ได้ทำโครงการ Swarm3K อาจารย์คงได้คำนวณทุกอย่างไว้แล้ว และมีประสบการณ์จากตอนโครงการ Swarm2K แต่เอาเข้าจริง มีเครื่อง Join เข้ามาถึง 4,701 เครื่อง เกินกว่า 3,000 ไป 50+% เลยทีเดียว

และนี่คือ Dashboard สุดท้าย หรือจะเข้าไปดูสด ๆ ได้ที่ Link นี้เลยครับ

Sematext Dashboard
Sematext Dashboard

 

สรุปค่าใช้จ่าย

ค่าใช้จ่ายทั้งหมดที่เกิดขึ้น ประมาณ 4-5 ชั่วโมง ที่ผมจ่ายให้กับ Digital Ocean คือ

Join cost
Join cost

แค่เกือบ 50 บาท เองครับ กับความรู้และประสบการณ์ที่ได้มา เรียกได้ว่า เกินคุ้มเอามาก ๆ

และนี่คือ Terminal ทั้งหมด ที่ผมนั่งส่องในคืนนั้นครับ

swarm3k-my-desktop

Leave a Reply

Your email address will not be published. Required fields are marked *