คู่มือเชิงวิพากษ์เกี่ยวกับ Kubernetes
- Kubernetes ได้ชื่อเสียงในหมู่คนสายเทคนิคบางส่วนว่า ซับซ้อนเกินความจำเป็นและเปลืองเวลา และการใช้งานในทีมเล็ก ๆ มักถูกมองว่าเป็นการออกแบบเกินความจำเป็น
- ที่ Jamsocket ได้ใช้งาน Kubernetes ในสภาพแวดล้อม production มาหลายปี และพบวิธีใช้อย่างมีประสิทธิภาพโดยใช้เฉพาะความสามารถที่จำเป็นและมองข้ามที่เหลือ
เหตุผลที่ใช้ Kubernetes
- Kubernetes เป็นทางเลือกที่ผ่านการใช้งานมาดีที่สุดเมื่อคุณต้องการทั้งสามอย่างต่อไปนี้พร้อมกัน:
- ต้องการรันหลายโปรเซส/หลายเซิร์ฟเวอร์/งานตามเวลาที่กำหนด
- ต้องการให้สิ่งเหล่านี้ทำงานแบบซ้ำซ้อนและกระจายโหลด
- ต้องการกำหนดค่าของสิ่งเหล่านี้และความสัมพันธ์ระหว่างกันด้วยโค้ด
- Kubernetes คือชั้น abstraction ที่ทำให้สามารถมองพูลของคอมพิวเตอร์เป็นเหมือนคอมพิวเตอร์ไร้หัวเครื่องเดียวได้
- Jamsocket deploy วันละหลายครั้ง และหากมีปัญหาในผลิตภัณฑ์ก็จะกระทบต่อผลิตภัณฑ์ของลูกค้าด้วย จึงได้ความมั่นใจในการ deploy บ่อย ๆ ผ่าน rolling deployment
วิธีที่ใช้ Kubernetes
- Jamsocket เป็นบริการที่สร้างโปรเซสแบบไดนามิกที่สื่อสารกับเว็บแอปได้ คล้ายกับ AWS Lambda แต่ช่วงอายุของโปรเซสไม่ได้ผูกกับคำขอ/คำตอบเพียงครั้งเดียว แต่ผูกกับการเชื่อมต่อ WebSocket
- Kubernetes ถูกใช้เพื่อรันโปรเซสระยะยาว เช่น API server, container registry, controller, log collector, บริการ DNS บางส่วน และการเก็บ metrics
- สิ่งที่ไม่ใช้ Kubernetes: โปรเซสชั่วคราว, เว็บไซต์แบบ static/marketing, สิ่งที่เก็บข้อมูลโดยตรง
- ใช้ Google Kubernetes Engine เพื่อมอบหมายการดูแล Kubernetes ออกไปภายนอก และหากจำเป็นก็ย้ายไป Amazon EKS ได้ค่อนข้างง่าย
ทรัพยากร Kubernetes ที่ใช้งานอย่างจริงจัง
- Deployments: Pod ส่วนใหญ่ถูกสร้างผ่าน deployment
- Services: ใช้ ClusterIP สำหรับบริการภายใน และ LoadBalancer สำหรับบริการภายนอก
- CronJobs: ใช้สำหรับสคริปต์ทำความสะอาด เป็นต้น
- ConfigMaps และ Secrets: ใช้เพื่อส่งข้อมูลให้กับทรัพยากรด้านบน
สิ่งที่ใช้อย่างระมัดระวัง
- ใช้ StatefulSet และ PersistentVolumeClaim อยู่ แต่ต้องการเก็บข้อมูลสำคัญไว้ในบริการแบบ managed ที่อยู่นอก Kubernetes มากกว่า
- พยายามหลีกเลี่ยง RBAC ให้มากที่สุด เพราะมันเพิ่มความซับซ้อน
สิ่งที่หลีกเลี่ยงอย่างจริงจัง
- การเขียน YAML ด้วยมือ: ใช้ TypeScript และ Pulumi ในการสร้าง definition ของทรัพยากร Kubernetes
- ทรัพยากรที่ไม่เป็นมาตรฐานและ operator: แม้จะทำให้ซอฟต์แวร์จาก third-party ใช้โครงสร้างพื้นฐานของ Kubernetes ได้ แต่ในทางปฏิบัติใช้งานยาก
- Helm: ไม่ใช้เพราะมี operator และกฎของ YAML
- ทุกสิ่งที่มีคำว่า "mesh" อยู่ในชื่อ: มองว่าไม่จำเป็น
- ทรัพยากร Ingress: หลีกเลี่ยงการเพิ่มชั้นอ้อมที่ไม่จำเป็น
- การจำลองทั้งสแตกของ k8s ไว้บนเครื่อง local: ใช้ Docker Compose หรือสคริปต์ของตัวเองเพื่อสตาร์ตเฉพาะบางส่วนของระบบที่จำเป็น
มนุษย์ไม่ควรต้องรอ Pod
- Kubernetes ถูกออกแบบมาโดยเน้นความทนทานและความเป็นโมดูลาร์มากกว่าเวลาเริ่มต้นของ container จึงไม่เหมาะกับกรณีที่มนุษย์ต้องรอให้ Pod เริ่มทำงาน
- Jamsocket ใช้ Plane ซึ่งเป็น Rust orchestrator ภายใต้สัญญาอนุญาต MIT เพื่อจัดตารางและรันโปรเซสอย่างรวดเร็วสำหรับ interactive workload
abstraction ระดับสูงกว่า
- ทางเลือกอื่นของ Kubernetes บางตัวก็ดีมาก โดยเฉพาะเมื่อไม่จำเป็นต้องกำหนดโครงสร้างพื้นฐานด้วยโค้ด
- สามารถเลือกบริการอย่าง Railway, Render และ Flight Control แทน Kubernetes หรือเลือกโซลูชันอื่นได้
- หากบริหารแนวทางการใช้งาน Kubernetes อย่างเป็นระบบ ก็ไม่มีใครบอกได้ว่าเร็วเกินไป
ความเห็นของ GN⁺
- แม้ Kubernetes จะเป็นเครื่องมือทรงพลังด้านการจัดการความซับซ้อนและระบบอัตโนมัติ โดยเฉพาะในระบบขนาดใหญ่ แต่ความซับซ้อนของมันก็อาจเป็นภาระสำหรับโปรเจกต์ขนาดเล็กหรือสตาร์ทอัป
- บทความนี้เสนอวิธีหลีกเลี่ยงความซับซ้อนเกินจำเป็นที่อาจเกิดขึ้นเมื่อใช้ Kubernetes ช่วยให้ผู้เริ่มต้นหรือทีมเล็ก ๆ ใช้ประโยชน์จาก Kubernetes ได้
- ก่อนใช้ Kubernetes ควรพิจารณาความสามารถที่จำเป็นจริง ๆ และศักยภาพทางเทคนิคของทีม เพื่อประเมินอย่างรอบคอบถึงความซับซ้อนในการดูแล ต้นทุน และประโยชน์ที่ได้รับ
- บางครั้งการใช้บริการที่ง่ายกว่าและดูแลง่ายกว่าก็อาจดีกว่า Kubernetes เช่น Docker Swarm, Apache Mesos, Nomad เป็นต้น ซึ่งแต่ละตัวมีข้อดีข้อเสียต่างกัน
- เมื่อนำ Kubernetes มาใช้ ควรคำนึงถึงการผสานรวมกับโครงสร้างพื้นฐานเดิม ความปลอดภัย ต้นทุนการดูแล และเส้นโค้งการเรียนรู้
- ประโยชน์ที่ได้จากการเลือก Kubernetes คือความสามารถในการขยายระบบ ความพร้อมใช้งานสูง และประสบการณ์การ deploy ที่สม่ำเสมอในสภาพแวดล้อมคลาวด์ที่หลากหลาย อย่างไรก็ตาม ก็จำเป็นต้องมีความเข้าใจเรื่องการจัดการทรัพยากรและ orchestration ที่เกี่ยวข้องด้วย
1 ความคิดเห็น
ความเห็นจาก Hacker News
สรุปความเห็นแรก:
สรุปความเห็นที่สอง:
สรุปความเห็นที่สาม:
สรุปความเห็นที่สี่:
สรุปความเห็นที่ห้า:
สรุปความเห็นที่หก:
สรุปความเห็นที่เจ็ด:
สรุปความเห็นที่แปด:
สรุปความเห็นที่เก้า:
สรุปความเห็นที่สิบ: