Table of Contents
- บทนำ (Introduction)
- จุดเริ่มต้นของปัญหา
- ต้นทุนที่แท้จริง
- การเปลี่ยนแปลงสู่ความเรียบง่าย
- ผลลัพธ์ที่ได้
- แนวทางการเลือกใช้ Kubernetes
- บทสรุป (Conclusion)
บทนำ (Introduction)
ผมเคยเป็นคนออกแบบ, ติดตั้ง และดูแล Docker host ใน on-premise มาก่อน จากนั้นขยับเป็น Kubernetes (ใช้ kubeadm) แล้วไปอยู่บน cloud กับ AWS ECS, AWS EKS ก่อนจะกลับมาวิ่งเล่นบน on-premise อีกครั้งด้วย OpenShift และ Kubernetes (ใช้ Rancher)
ต้องยอมรับเลยว่า Kubernetes เป็นหนึ่งในสิ่งที่ผม “ว้าวที่สุด” ในโลก IT infrastructure และโดยส่วนตัวผมลงทุนกับมันไปไม่น้อยครับ แต่ตลอดเวลาที่ผ่านมาผมก็ตั้งคำถามมาตลอดว่า “ทุกคนจำเป็นต้องใช้มันจริงๆ เหรอ?”
ในที่สุดก็มีคนเขียนเรื่องนี้เสียที “I Stopped Using Kubernetes. Our DevOps Team Is Happier Than Ever” มันช่างเหมือนกับสหายที่รู้ใจเสียจริงๆ (เห็นตั้งนานแล้วแหละแต่พึ่งว่างมาเขียน 😂)
แน่นอน ผมไม่ได้เห็นด้วยกับเค้าทั้งหมดหรอก เพราะผมมองว่าการใช้ Kubernetes อาจไม่ได้แย่เท่าประสบการณ์ในบทความนี้ ส่วนหนึ่งเป็นเพราะ bad design ของเค้าเองด้วย แต่ทั้งหมดทั้งมวลก็มีส่วนจริงอยู่มากกว่าไม่จริง
เค้าว่ายังไงหนะหรอ? มาลองดูกัน
จุดเริ่มต้นของปัญหา
เมื่อ 3 ปีก่อน ทีมนี้เริ่มใช้ Kubernetes โดยหวังว่าจะได้ความสามารถในการจัดการ container ระดับ enterprise, การทำงานแบบ cloud-native และการใช้ infrastructure as code (IaC) แต่สิ่งที่เค้าไม่ได้คิดถึงคือความซับซ้อนของมัน
การต้องดูแล Kubernetes ทั้ง 47 clusters บน 3 cloud providers กลายเป็นภาระที่หนักหน่วง(โดยเฉพาะเมื่อเทียบกับจำนวนคน) ทำให้ทีมต้องทำงานในวันหยุด และการเข้าเวร on-call กลายเป็นสิ่งที่หลอกหลอนทุกคน (ก็แล้วทำไมไม่ใช้ namespace แต่แรก!!!)
แม้จะมีทีม DevOps ถึง 8 คน, SRE อีก 3 ทีม และระบบ monitoring หลายตัวที่ค่อนข้างดี แต่เค้าก็ยังเจอกับปัญหาใหญ่ เช่น
- เกิด outage ใหญ่ 4 ครั้ง
- False positive alert 147 ครั้ง
- Emergency deploy ไป 23 ครั้ง
- นอกจากนี้ยังมีพนักงาน 2 คนลาออกเพราะ burnout
ต้นทุนที่แท้จริง
พอวิเคราะห์ต้นทุนที่แท้จริงก็พบว่า
- 40% ของ nodes ถูกใช้ไปกับการรัน Kubernetes components (ส่วนประกอบต่างๆ บน cluster ที่ไม่ใช่ app)
- ค่าใช้จ่ายสำหรับ control planes อยู่ที่ 875,000 บาทต่อเดือน
- ต้องมีระบบ 3 ชุดเพื่อรองรับ high availability
- ต้องใช้เวลา 3 เดือนในการเทรนพนักงานใหม่
- 60% ของเวลาทีม DevOps หมดไปกับการ maintenance ระบบ
การเปลี่ยนแปลงสู่ความเรียบง่าย
ทีมเลยลองย้าย service ที่มีความสำคัญน้อยไปยังระบบที่เรียบง่ายกว่า เค้าเลือกใช้
- AWS ECS (Fargate) สำหรับการจัดการ app ที่ไม่ซับซ้อน
- AWS Batch สำหรับงานประมวลผลแบบ batch ช่วยจัดการเรื่องการ scale ให้
- AWS Lambda สำหรับ event-driven tasks เป็น service ที่รันโค้ดได้โดยไม่ต้องจัดการ server
- CloudFormation เป็น IaC ในการจัดการ infrastructure
- Monitoring ที่มีหลายตัวก็ย้ายไปใช้ CloudWatch ทั้งหมดเพื่อลดความซับซ้อน
- ที่น่าแปลกใจคือการใช้ Docker บน EC2 สำหรับ stateful app เพราะเค้ามองว่าง่ายกว่าการจัดการ Kubernetes cluster (ที่ไม่ไป ECS ผมเดาว่าน่าจะเรื่องความยืดหยุ่นของ network และ storage เพราะเค้าเลือก Fargate ซึ่งเป็น serverless ที่ทำอะไรไม่ได้มาก)
ผลลัพธ์ที่ได้
สิ่งที่เกิดขึ้นทันทีคือ (อันนี้เฉพาะ service ที่ลองย้ายมา):
- เวลาในการ deploy ลดลงจาก 15 นาทีเหลือ 3 นาที
- จำนวน YAML ไฟล์สำหรับ infrastructure ลดลงจาก 200+ เหลือ 20 ไฟล์
- ค่าใช้จ่ายรายเดือนลดลงจาก 420,000 เหลือ 112,000 บาท
และหลังจากทดลองไป 6 เดือน ผลลัพธ์ออกมาดีมาก ดังนี้:
- ค่าใช้จ่ายด้าน infrastructure ลดลง 58%
- การ deploy เร็วขึ้น 89%
- ปัญหาในระบบลดลง 73%
- ไม่มีใครต้องทำงานในวันหยุดอีกต่อไป
- การหาและเทรนพนักงานใหม่ก็ง่ายขึ้น
แนวทางการเลือกใช้ Kubernetes
ประสบการณ์จากทีมนี้พอจะบอกเราได้ไม่มากก็น้อยว่า Kubernetes ไม่ใช่เทคโนโลยีที่ไม่ดี แต่เราอาจต้องตั้งคำถามก่อนว่ามันเกินความจำเป็นสำหรับบริษัทเราหรือไม่? ซึ่งเราควรพิจารณาให้เหมาะสมกับความต้องการมากกว่าการ hype ไปกับความสดใหม่, การที่มีคนใช้เยอะ หรือเพราะมันดูเจ๋งซะจริงๆ (แต่มันก็เจ๋งจริงแหละ)
ในบทความนี้เค้าแนะนำว่าควรพิจารณาใช้ Kubernetes เมื่อ:
- มีการรัน microservices จำนวนมาก
- ต้องการระบบ auto-scaling ที่ซับซ้อน
- มีความต้องการใช้งานบน multi-cloud
- ต้องการรูปแบบการ deploy app ที่ซับซ้อน
ในทางตรงกันข้าม เราอาจไม่จำเป็นต้องใช้ Kubernetes ถ้า:
- มี service จำนวนไม่มาก เช่น ไม่เกิน 20 ตัว
- สามารถคาดการณ์การเติบโตของระบบได้
- ใช้ cloud managed services เป็นหลัก
- มีทีม DevOps ขนาดเล็ก (ไม่เกิน 5 คน)
ที่ผมเคยเห็นนะครับ บางที่เป็น in-house app เล็กๆ ไม่กี่ตัวอยู่บน cloud เจ้าเดียวที่มี user นิ่งๆ หลักร้อยหรือพัน แถมไม่ต้อง scale ใดๆ แต่ก็ขึ้น Kubernetes cluster (HA) มารัน app ซึ่งผมก็สงสัยมาตลอดว่า benefits ของ app มัน cover ค่า control plane nodes แล้วหรือยังก็ไม่รู้ 😂
บทสรุป (Conclusion)
ใช่ครับ ต้นฉบับของบทความนี้รวมถึงผมที่เอามาขยายต่อไม่ได้บอกว่าอย่าใช้ Kubernetes เพราะความต้องการของแต่ละองค์กรไม่เหมือนกัน แต่ผมคาดหวังว่ามันจะไปสะกิดใจผู้อ่านให้ลองคิดพิจารณาและเปรียบเทียบดูก่อนจะเลือกให้ดีครับ ซึ่งถ้าดูแล้วและคำตอบมันต้องเป็น Kubernetes มันก็ควรเป็น Kubernetes ครับ
การกล้าที่จะเปลี่ยนแปลงและยอมรับว่าบางครั้ง “การถอยหลัง” ไปใช้วิธีที่เรียบง่ายกว่าอาจเป็น “ความก้าวหน้า” ที่แท้จริง เพราะเป้าหมายสุดท้ายไม่ใช่การมีระบบที่ซับซ้อนที่สุดเพื่อความหล่อ แต่เป็นการมีระบบ IT ที่ช่วยเสริม business outcome ให้ดีขึ้นอย่างยั่งยืนมากกว่า
และก่อนจาก ผมขอแปะบทความ “ทำไม “ความเจ๋ง” ของภาษาโปรแกรม ถึงไม่ใช่สาระ (อีกต่อไป)” ของ อ.ใหม่ ในฝั่ง software (ภาษา programming) ไว้ให้ด้วย เพราะมันสอดรับกับเรื่องที่ผมเขียนได้ดีเหลือเกิน
สุดท้ายแล้ว ฝากวลี “No One Size Fits All” ซึ่งเป็นวลีที่ผมพูดเสมอไม่ว่าแนะนำอะไรใครไป เจอกันในบทความหน้าครับ