สิ่งที่การสัมภาษณ์งานสอนผมเกี่ยวกับ Kubernetes
(notnotp.com)- Kubernetes กำลังถูกนำมาใช้แม้ในบริษัทขนาดเล็ก ไม่ใช่เพราะความสามารถในการขยายระบบทางเทคนิค แต่เป็นมาตรฐานสำหรับแก้ปัญหาเรื่อง การทำให้รูปแบบการ deploy เป็นแบบเดียวกัน และการดำเนินงานขององค์กร
- จากการหางานล่าสุด บริษัทที่ได้พูดคุยด้วยต่างก็ใช้ Kubernetes ทั้งหมด ซึ่งต่างจากเมื่อ 5 ปีก่อนที่ยังมีทั้ง VM·serverless·K8s อยู่ร่วมกัน
- เหตุผลหลักที่ CTO ยกขึ้นมาคือ สามารถ deploy ทุก service ด้วยวิธีเดียวกัน เก็บความรู้ด้านปฏิบัติการไว้ใน YAML และ Helm chart และติดตามประวัติการเปลี่ยนแปลงได้ด้วย GitOps
- บริษัทขนาดเล็กกำลังยอมรับความซับซ้อนของ Kubernetes ไม่ใช่เพราะฟีเจอร์ขั้นสูงอย่าง HPA, Pod Disruption Budget หรือ node affinity แต่เพราะ ข้อได้เปรียบเชิงองค์กร
- บริษัทระยะเริ่มต้นควรเริ่มโดยไม่มี Kubernetes เพื่อจะได้โฟกัสกับผลิตภัณฑ์ และความจำเป็นในการนำมาใช้จะเพิ่มขึ้นเมื่อ CTO ไม่ได้เป็นคนทำวิศวกรรมเพียงคนเดียวอีกต่อไป
การเปลี่ยนแปลงที่เห็นจากการหางานล่าสุด
- ระหว่างการหางานล่าสุด หลังจากอ่านประกาศรับสมัคร สัมภาษณ์ และพูดคุยกับทีมวิศวกรรมราวสิบสองแห่ง ผลคือทุกบริษัทที่ได้คุยต่างก็ใช้ Kubernetes
- ตอนหางานเมื่อ 5 ปีก่อน ยังมีทั้งกลุ่มที่ใช้ Kubernetes แบบพบไม่บ่อย กลุ่มที่ใช้
systemdบน VM/VPS/EC2 และกลุ่ม serverless อย่าง Lambda กับ Cloud Run อยู่พร้อมกัน - ที่ทำงานปัจจุบันมีปัญหาระดับ Big Tech จึงชัดเจนว่า Kubernetes เหมาะสม แต่ก็น่าแปลกใจที่แม้แต่สตาร์ตอัป 10 คนที่มีแค่สอง service ก็ยังใช้ Kubernetes
- บริษัทที่ได้คุยด้วยไม่ได้รัน microservices หรืออยู่ในสภาพแวดล้อมที่ใกล้เคียงกับสเกลสูง และก็ไม่ได้สนใจด้านเทคนิคของ Kubernetes มากนัก
เหตุผลในการเลือกใช้ Kubernetes และเกณฑ์การตัดสินใจ
-
ทำไมถึงใช้ Kubernetes
- เหตุผลแรกคือ uniformity และเมื่อทุก service ถูก deploy ด้วยวิธีเดียวกัน ก็จะไม่เกิดสถานการณ์ที่มีเฉพาะบาง service เท่านั้นที่ยังผูกติดอยู่กับ bash script บน bare VM รุ่นเก่าหรือ Docker Compose
- เหตุผลที่สองคือ ความรู้ที่แชร์ต่อได้และใช้ในการจ้างงานได้ และเมื่อ Kubernetes ถูกใช้เสมือนเป็นภาษากลาง แค่ดู Helm chart และการตั้งค่า Kube ก็สามารถเข้าใจสถาปัตยกรรมได้อย่างรวดเร็ว
- หากความรู้ไม่ได้อยู่ในหัวของคน แต่อยู่ใน YAML ก็จะลดกรณีที่คนมารับช่วงต่อหลังมีคนลาออกต้องใช้เวลาหลายสัปดาห์เพื่อทำความเข้าใจวิธีรันระบบ
- SRE ที่เข้าเวร on-call ในบริษัทปัจจุบันสามารถดูแล service ที่ไม่เคยเห็นมาก่อนได้ เพราะรูปแบบ Kubernetes ของแต่ละทีมคล้ายกัน
- ข้อดีนี้จะเกิดขึ้นได้ก็ต่อเมื่อการตั้งค่าไม่ได้พิเศษหรือแหวกแนวเกินไป
- เหตุผลที่สามคือ ความสามารถในการติดตามย้อนหลัง โดยแทนที่จะรัน
kubectl apply -fใส่ cluster โดยตรง ก็อัปโหลด Helm chart ขึ้น git จากนั้นผ่านการอนุมัติ MR และ deploy ด้วย FluxCD หรือ ArgoCD ทำให้มีประวัติการเปลี่ยนแปลงเหลืออยู่ - กระบวนการแบบนี้ช่วยเรื่อง compliance แทบไม่มีต้นทุนเพิ่ม เพราะ GitOps กับ Kubernetes เข้ากันได้อย่างเป็นธรรมชาติ
- บริษัทปัจจุบันก็กำลังผ่านการรับรอง ISO ได้ดีด้วยวิธีนี้
-
ข้อสรุปที่ได้
- การตัดสินใจของ CTO ไม่ใช่การเลือกที่โง่เขลา แต่เป็นวิธีแก้ปัญหาจริง
- Kubernetes ดูเหมือนเป็นคำตอบทางเทคนิคสำหรับปัญหาทางเทคนิค แต่ CTO จำนวนมากสนใจ ข้อดีที่ไม่ใช่เชิงเทคนิค มากกว่าที่คาดไว้
- ปัญหาทางเทคนิคของบริษัทขนาดเล็กไม่ได้ถึงขั้นต้องมี Kubernetes เสมอไป และมีความเป็นไปได้สูงว่าใน manifest ของพวกเขาจะไม่มี topologySpreadConstraints, HPA, Pod Disruption Budget หรือกฎ node affinity
- พวกเขายังคงรักษาจำนวน node ไว้ใกล้เคียงกับตอนใช้ VM แต่ยอมรับต้นทุนในการดูแลซอฟต์แวร์ที่ซับซ้อนกว่าเพื่อแลกกับข้อดีเชิงองค์กร
-
ทำไมการเปลี่ยนผ่านถึงเกิดขึ้นในช่วงนี้
- เมื่อ 5 ปีก่อน VM กับ
systemd, serverless และ Kubernetes ยังเป็นตัวเลือกทั้งหมด แต่ตอนนี้ในประกาศรับสมัครงาน แทบไม่เห็นคู่ VM กับsystemdแล้ว ส่วน serverless ก็ยังอยู่ในตลาดเฉพาะทาง และ Kubernetes เป็นฝ่ายชนะ - เหตุผลของจังหวะการเปลี่ยนผ่านนี้ยังไม่แน่ชัดทั้งหมด
- เหตุผลที่เป็นไปได้คือ managed Kubernetes อย่าง EKS, GKE และ AKS โตเต็มที่แล้ว และจำนวนคนที่เรียนรู้ Kubernetes ก็เพิ่มขึ้นมากจนการจ้างคนไปใช้แนวทางอื่นกลับยากกว่า
- Helm ทำให้การใช้ chart ที่คนอื่นสร้างไว้ตรง ๆ กลายเป็นตัวเลือกที่ใช้งานได้จริง
- เมื่อ 5 ปีก่อน VM กับ
-
เมื่อไรควรใช้ Kubernetes
- เกณฑ์ส่วนตัวคือช่วงที่ CTO ไม่ได้เป็นวิศวกรเพียงคนเดียวอีกต่อไป
- เมื่อวิศวกรคนที่สองเข้าร่วม จะมีคนที่ต้อง deploy โดยไม่ได้เป็นผู้ตั้งค่าเซิร์ฟเวอร์เอง และจำเป็นต้องมีการควบคุมสิทธิ์เข้าถึงที่เหมาะสม แทนการแจก SSH key ให้ทุกอย่าง
- สุดท้ายแล้วใครบางคนก็ต้องออกจากบริษัท และความรู้ด้านปฏิบัติการที่อยู่กับคนนั้นก็อาจหายไปด้วย
- ตั้งแต่จุดนี้เป็นต้นไป ความรู้ควรอยู่ใน ระบบ มากกว่าอยู่ในตัวบุคคล
- แต่ก่อนจะถึงขั้นนั้น การ debug cluster นั้นยากจริง และอาจทำให้เอาพลังงานที่ควรใช้กับผลิตภัณฑ์ไปลงกับโครงสร้างพื้นฐานแทน
- เมื่อเทียบกับการต้องใช้เวลาสองชั่วโมงหาสาเหตุของ pod ที่ติด
CrashLoopBackOffก่อนคุยกับลูกค้ารายใหญ่ การแก้ฉุกเฉินด้วยgit pullบน VPS อาจเร็วกว่าและเข้าใจง่ายกว่า
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
ฝั่งยุโรปมีเหตุผลที่ชัดเจนอยู่ CTO เชื่อว่า ถ้ารันบน K8s ก็สามารถเปลี่ยนผู้ให้บริการ Managed K8s ได้ภายในไม่กี่สัปดาห์
ไม่ได้แปลว่านั่นถูกต้อง แต่พวกเขาเชื่อกันแบบนั้นจริง ๆ และยังคิดว่าสภาพแวดล้อม PR จะง่ายขึ้นด้วย
แต่ประเด็นหลักคือการย้ายผู้ให้บริการ ในอีกไม่กี่ปีข้างหน้าคาดว่าจะมีการ ห้ามใช้ผู้ให้บริการที่เชื่อมโยงกับสหรัฐฯ โดยเฉพาะในเรื่อง GDPR, ระบบการเงิน ฯลฯ เลยเตรียมรับความเสี่ยงนั้นไว้
มันดูเหมือนเป็นหลักฐานว่าทั้งอุตสาหกรรมเทคโนโลยีกำลังหลงทิศทางโดยสิ้นเชิง ไม่ว่าบริษัทจะขนาดไหนก็ตาม สแตกยิ่ง เป็นแบบเดียวกันมากขึ้นและซับซ้อนขึ้น แต่สุดท้ายกลับหาผลิตภัณฑ์และบริการที่ใช้ได้โดยไม่ต้องกัดฟันทนได้ยากขึ้น
ถ้าไม่อยากให้สแตกสูงขึ้นเรื่อย ๆ ก็ต้องทำให้เลเยอร์ล่างดีขึ้น
เราต้องการ องค์ประกอบพื้นฐานของระบบปฏิบัติการ ที่ดีกว่านี้มาก ตัวอย่างเช่น คอนเทนเนอร์คือการเอาฟีเจอร์ด้านการแยกส่วนของเคอร์เนลหลายอย่างมายำรวมกันโดยไม่มีการออกแบบที่สอดคล้องกันตั้งแต่แรก เลยมีช่องโหว่มาก
ตอนนี้การแยกคอนเทนเนอร์ดีขึ้นมากแล้ว แต่ก็เป็นผลจากการไล่อุดปัญหาเป็นจุด ๆ ไม่ใช่การออกแบบเรื่องความปลอดภัยและความถูกต้องมาตั้งแต่ต้น จนกว่าเคอร์เนลจะจัดการหนี้ทางเทคนิคก้อนมหึมานี้ได้ หรือมีใครสร้างเคอร์เนลที่คนย้ายไปใช้จริงได้ เราก็คงจะยังต้องสร้างอะไรซ้อนอยู่ข้างบนต่อไป
เครื่องมือ deploy ที่ซับซ้อนมากพอ สุดท้ายก็มักจะมี Kubernetes เวอร์ชันครึ่ง ๆ กลาง ๆ ที่ทำขึ้นแบบชั่วคราว นิยามกันแบบไม่เป็นทางการ มีบั๊กเยอะ และช้า รวมอยู่ด้วย
ผมเล่าได้ยาวเลยว่าในปี 2009 เขาจัดระบบบริษัท SaaS อีคอมเมิร์ซมูลค่าพันล้านดอลลาร์กันอย่างไร หรือแบ็กเอนด์ออนไลน์ของเกม AAA แบบมัลติเพลเยอร์ขนาดมหึมาทำงานกันอย่างไร ซึ่งสิ่งเหล่านั้นใกล้เคียงกับ Kubernetes มากกว่าการ deploy ลงเครื่องเดียวแน่นอน
แต่มันเร็วกว่า และมีจุดยืนที่ชัดเจนในแบบที่องค์กรต้องการจริง ๆ ไม่ใช่ในแบบที่ไปขัดกับข้อกำหนดของผลิตภัณฑ์
ความ “บั๊กเยอะ” ของ Kubernetes มักไม่ได้มาจากตัวระบบหลักเองเท่าไร แต่มาจาก ชั้นอินเทอร์เฟซ จำนวนมากที่เราวางทับลงไปเพื่อบังคับให้มันทำงานแบบที่เราต้องการ
ปัญหาคือองค์กรส่วนใหญ่เอา K8s มาใช้แบบครึ่ง ๆ กลาง ๆ มีทีม DevOps มาดูแล แต่สุดท้ายก็ยังโยนงานเขียนที่เกี่ยวกับ K8s, การ deploy, การ debug และการปฏิบัติการทั้งหมดให้วิศวกรซอฟต์แวร์อยู่ดี
ถ้าเป็นทีม DevOps ที่ดี ก็ควรให้ประสบการณ์แบบ Heroku ภายในองค์กรได้ กำหนด resource ที่ต้องใช้แล้ว merge เข้า main จากนั้นก็ควร deploy ได้เลย ไม่ใช่ต้องไปงมหาว่าอะไรพังในแดชบอร์ด GitOps/DevOps ห่วย ๆ
Heroku เคยเป็นจุดสูงสุดของประสบการณ์นักพัฒนา และหลังจากยุค K8s เราก็สูญเสียสิ่งนั้นไป
แน่นอนว่า Heroku ให้ประสบการณ์ที่บูรณาการกว่าทั้งการเชื่อมฐานข้อมูลหรือการ deploy ด้วย git push แต่การทำเปลือกครอบแบบคัสตอมบน Kubernetes ก็ไม่ค่อยเวิร์ก สุดท้ายมันก็มักต้องปล่อยพารามิเตอร์ทั้งหมดทะลุผ่านอยู่ดี
ในวงการนี้ การรับเทคโนโลยีมาใช้เดินตามหลัก “หยิบมาใช้แบบเสื้อผ้าสำเร็จรูป แล้วถ้าไม่ต้องการก็ปลดทิ้ง” มาโดยตลอด และนี่ก็เป็นตัวอย่างล่าสุดของเรื่องนั้น
ประโยคที่ว่า “ความรู้ควรอยู่ในระบบ ไม่ใช่อยู่ในตัวคน” ถ่ายทอดสิ่งที่ผมคิดลอย ๆ มานานได้ดีมาก
การทำให้เป็นแบบแผน แบบนี้จะเป็นไปได้ก็ต่อเมื่อความผันผวนของกระบวนการลดลงเท่านั้น ทำด้วยคนก่อน จากนั้นค่อยเขียนเอกสารของกระบวนการ ทำเป็นสคริปต์ แล้วค่อยทำอัตโนมัติ
ถ้าใช้เวิร์กโฟลว์ทั่วไปของเครื่องมือหรือ ecosystem ที่นิยม ขั้นตอนส่วนใหญ่พวกนี้แทบจะได้มาฟรี
ผมไม่ได้ทำ DevOps มากนัก ตอนนี้ระบบก็ทำงานได้ดีด้วยแค่ systemd กับคอนเทนเนอร์ podman ที่ใช้เป็นครั้งคราว ทำงานอยู่สาย IoT/AgTech
บทความนี้มี “คำกล่าวอ้าง” แบบที่ได้ยินจากผู้บริหารที่ไม่ใช่สายเทคนิคบ่อย ๆ ประมาณว่า “ฝั่งนั้นก็ใช้ LoRa ใช่ไหม? งั้นก็โอเคสิ? พรุ่งนี้ออกได้เลยใช่ไหม?”
มีความเชื่อว่า ความไม่เป็นเนื้อเดียวกันคืออุปสรรคเดียวของความสำเร็จ ถ้าสองระบบใช้ Fiber, Modbus หรือมี “API” ก็จะเอามาต่อกันได้ทันทีและสร้างประสบการณ์เจ๋ง ๆ แบบ “1 + 1 มากกว่าผลรวม” ได้
แต่การที่ซอฟต์แวร์สองตัวตกลงใช้มาตรฐานการทำงานร่วมกันระดับต่ำเหมือนกัน ไม่ได้แปลว่างานจริงในการตัดสินใจว่าจะตีความข้อมูลที่ parse ได้ง่ายนั้นอย่างไรและจะใช้มันให้เกิดประโยชน์อย่างไรจะหายไป
แค่คนสองคนพูดภาษาเดียวกันได้ ไม่ได้แปลว่าไม่มีอะไรต้องทำต่อ และการใช้ภาษาร่วมกันก็ไม่ได้ทำให้การตัดสินใจที่ทีมบางส่วนเคยทำไว้ภายใต้เงื่อนไขและเครื่องมือในตอนนั้นหายไปด้วย
ในยุคแรก ๆ Fortran เคยเป็นภาษากลางในวงการวิทยาศาสตร์/วิศวกรรม แต่ก็ไม่ได้ทำให้คนไม่งงกับงานที่เพื่อนร่วมงานทำไว้หรือไม่ต้องเขียนใหม่
ผมไม่ได้มีปัญหากับคุณค่าของ K8s หรือการที่มันกลายเป็น “มาตรฐาน” ในปัจจุบัน แค่ยากจะเห็นด้วยกับคำกล่าวอ้างว่ามันทำให้ปัญหาการเขียนโปรแกรมบางประเภทหายไป กฎการอนุรักษ์ความอัปลักษณ์ ยังอยู่เหมือนเดิม
Kubernetes เป็น แพลตฟอร์มสำหรับ deploy ที่ใช้ได้ทีเดียว
รูปแบบการ deploy ก็เป็นอีกเหตุผลหนึ่ง ผมทำงานกับ Canton node โดยซอฟต์แวร์ Canton ต้นน้ำและแอปที่เกี่ยวข้องถูกแจกมาเป็น Helm chart
ไม่ว่าจริง ๆ แล้ว Kubernetes จะเหมาะกับงานของเราหรือไม่ ซึ่งผมมองว่าไม่ มันก็คือวิธีที่ซอฟต์แวร์นี้ถูก deploy และมีการซัพพอร์ต ถ้าออกนอกเส้นทางนั้น งานจะยิ่งมากกว่าการต้องรับมือกับ Kubernetes เอง
มีผมคนเดียวหรือเปล่าที่รู้สึกว่าบทความนี้เหมือน AI เขียนมากเกินไป
ถึงอย่างนั้นผมก็เห็นด้วยกับเจตนาหลัก ตอนนี้กำลังย้ายชุดโฮมแล็บ/เซลฟ์โฮสต์ของตัวเองออกจากสภาพที่เป็น systemd config แบบคัสตอม คำสั่งเชลล์ที่จำไม่ได้ และ “ให้ตายสิ ผมเขียนขั้นตอนตั้งค่านั่นไว้ในไฟล์ Markdown ไหนนะ?” ซึ่งรู้สึกสดชื่นมาก
ยังไม่ได้ใช้ระบบ continuous deployment จริงจังหรอก แต่แค่มีเชลล์สคริปต์
applyเล็ก ๆ กับชุดไฟล์ YAML ก็ให้ความรู้สึกดีว่าต่อให้เกิดภัยพิบัติก็น่าจะกู้กลับมาได้ 90%systemd นั้นเรียบง่ายในเชิงแนวคิด แต่ ความสามารถในการทำซ้ำได้ ซับซ้อน ส่วน Kubernetes กลับกัน คุณจ่ายต้นทุนเชิงแนวคิดมากกว่า แต่ได้ความสามารถในการทำซ้ำและความเข้าใจที่ตามมาซึ่งแข็งแรงกว่ามาก อย่างน้อยตอนนี้ผมมองแบบนั้น
ผมยังอยู่ในช่วงกลาง ๆ ของการเรียนรู้ Kubernetes แต่ช่วงนี้ก็สนุกกับมันพอสมควร
การบูรณาการแนวดิ่งที่มีนิยามแบบ first-class ลักษณะนี้ดูเหมือนจะเป็นทิศทางที่ผิด