คืนชีพ preemptible VM ใน GCP

Mai Parinthorn
Digithun
Published in
2 min readMar 26, 2019
Ref: https://cdn.pixabay.com/photo/2018/04/04/12/56/christian-cross-3289724_960_720.jpg

จุดเริ่มต้น ทำไมถึงอยากทำ

เมื่อประมาณปลายปี ที่แล้ว ขณะที่ผมทำงานอยู่กับบริษัทเก่า ผมได้รู้จักกับ K8s ครั้งแรก และได้ เล่นกับมัน เป็นเวลาประมาณสามเดือน อารมณ์เหมือนเด็กน้อย มาเล่นของเล่น ชิ้นใหม่ โดยก็สร้าง K8s cluster ใน GCP ให้มี node อยู่ประมาณ 3 nodes ซึ่งเป็น Compute engine แบบธรรมดา run พวก web service ต่างๆครับ แล้วทีนี้ ทำไปทำมา พอถึงเวลาสิ้นเดือน ดันไปเห็นค่าใช้จ่ายแต่ละเดือน ที่ว่า ทำไมมันดูสูงจัง มันพอจะมี ทางที่ทำให้มัน ต่ำลงกว่านี้ ได้มั้ย

ค้นพบทางสว่าง

หลังจากนั้น ก็เริ่มค้นหา แล้วก็ถามผู้คน ไปเรื่อยๆ จนมาเจอ คำตอบ จาก มิตรสหายท่านหนึ่งว่า เฮ้ย GCP อะ มันมี สิ่งที่เรียก Preemptible VM

อืม…. แม่งคือไรวะ

พอได้ยินแบบนั้นปุ๊บ ก็รีบไปหาทันทีครับ ว่ามันคืออะไร ก็ในบทความนี้ก็จะอธิบายแบบคร่าวๆ พอครับ

Preemptible VM

ผมจะไม่เล่าว่ามันคืออะไรนะครับ ถ้าอยากหาอ่าน ก็ตาม link นี้เลยครับ

แต่ว่าผมจะ สรุป คุณสมบัติ สั้นๆ ของเจ้าตัวนี้ไว้ดังนี้ครับ

  • เหมือนกับ VM instance ใน compute engine ทุกอย่างครับ
  • เพียงแต่ จะไม่ได้มีชีวิตยืนยาว ที่สามารถรันได้ตลอดเวลา แต่ทาง google ก็การันตีครับ ว่าเจ้า preempt เนี่ย จะมีชีวิตยืนยาวได้มาก สุด 24 ชั่วโมงครับ
  • เหมาะกับงานประเภท ที่ยังไม่ต้องทำทันที เป็น batch job หรือ พวกที่ทำเป็น schedule ครับ
  • และที่สำคัญ ราคาถูกกว่า VM instance ธรรมดา ถึง 80%

เหมาะกับ พวก Batch job หรือ Schedule แล้วจะเอามารัน web service?

ใช่ครับ ก็ตามที่บอกไปข้างบน อยากประหยัดงบครับ แต่ใน บทความนี้ POC ที่จะทำไม่ได้ run on K8s หรือเกี่ยวกับ K8s เลยครับ แค่ อยากให้ลองคิดว่า ถ้าเราจะเปิด Compute Service ไว้ run web service หรือ ทำอะไรซักอย่างแล้วอยากให้ run ตลอดไป โดยใช้ Preempt VM นั้นจะต้องทำยังไง ก็เลย ปิ๊ง ไอเดียแล้วก็ ออกมาเป็น POC ที่กำลังจะเล่าต่อไปนี้ครับ

[POC] หลักการทำงาน

  • เมื่อ Preempt VM instance ปิดตัวเองลง หรือ ที่เรียกว่า TERMINATE หรือ STOP โดยที่ Preempt VM instance ก่อนจะปิดตัวเองลง จะมี เวลา 30 วินาทีในการส่งสัญญาณ หรือ ทำอะไรก็ตามก่อนที่เครื่องจะดับ ไม่ว่าจะเป็น backup ข้อมูล หรือ ส่งข้อมูลบางอย่างไปที่อื่น หรือ log ครับ
  • โดยในเวลา 30 วินาทีก่อนที่จะดับ ตัว instance เองจะ ไป trigger ตัว shutdown-script อัตโนมัติ ครับ โดยใน POC ของเรา จะให้มันส่งข้อความ [publish message] ผ่าน topic ที่เราตั้งไว้ครับ
  • หลังจากนั้น ตัวที่รอรับฟัง ข้อมูล หรือ ที่เรียกว่า subscricber [ใน POC ของเราคือ firebase cloud function] พอได้ข้อมูล ก็จะทำการ restart instance ขึ้นมาใหม่ครับ

[POC] อยากลองต้องทำอะไรบ้าง

0. สร้าง Project ใน GCP ขึ้นมาก่อนครับ

  1. สร้าง Topic ขึ้นมา ใน GCP Pub/sub
  2. สร้าง Preemptible VM instance ขึ้นมาครับ โดยสร้างใน Compute engine dashboard หรือ จะผ่าน gcloud sdk ก็ได้ครับ โดยที่เราจะฝัง shutdown-script ไว้ครับ โดยจะฝัง script ที่อยู่ใน POC github ที่ผมสร้างขึ้นมาครับ

3. Clone POC github แล้วทำการ deploy firebase cloud function ครับ

4. ลอง stop VM แล้วดูผลลัพธ์ครับ

5. จะเห็นว่า PreemptVM ถูก run start ขึ้นมาใหม่ครับ จบ….

หมายเหตุ: หลังจาก สร้าง Topic แล้วให้ นำ topic name ไป replace topic name ใน ไฟล์ revive.sh และ ใน functions/index.js ด้วยครับ

ก็จบกับ POC ฟื้นคืนชีพ Preempt VM แล้วนะครับ ก็ถ้ามีรายละเอียดส่วนไหนผิดพลาด ก็ขอกราบอภัย ครับ ผมก็แค่มือใหม่ ที่อยากลองอะไรใหม่ๆครับ

Github link: https://github.com/ppanya/revive-preempt-vm

ปล. ถ้ามีอะไรอยากเสริม หรือ ผิดตรงไหนบอกได้เลยครับ

Reference เพื่ออ่านเพิ่มเติมครับ

--

--