Kubenetes คืออะไร

ทำไมช่วงนี้เราถึงเห็นทุกคนพูดถึงแต่ kube

Nat U.
ConvoLab
4 min readSep 1, 2019

--

สำหรับคนที่ยังไม่เคยได้ลองเจ้าตัว kubenetes หรือหลายคนที่ยังสงสัยว่าจริงๆมันอ่านว่าอะไรกันแน่ เดี๋ยวผมจะเล่าให้ฟังครับ

Kubenetes อ่านว่า คูเบอเนทีส มาจากภาษากรีกที่แปลว่า “กัปตันเรือ” เป็น Cluster management system ซึ่งหน้าที่ของมันที่คอยควบคุมการทำงานของ applications บน servers ของเรานั้นเอง

แต่การควบคุมที่ว่านั้นเป็นอย่างไงเรามาดูกัน

ก่อนที่เราจะพูดถึงเจ้า Kube ผมขอเริ่มด้วย basic concepts คร่าวๆ ก่อนนะครับ

Containerization

Concept แรกที่เราจะพูดถึงกันก่อนคือการทำ containers

credit: https://kubernetes.io/

ปัจจุบันมี tools มากมายที่คอยช่วยให้เราพัฒนา software ได้ง่ายขึ้น ส่งมอบงานได้เร็วขึ้น แต่หลังจากเราทำเจ้า app ของเราเสร็จแล้ว เราก็ต้อง deploy เจ้าแอพนี้ที่ไหนสักที่นึง ถ้าเป็นแอพมือถือ เราก็ลง app store แต่ถ้าแอพสำหรับ server เราก็ต้องนำเจ้าแอพไปวางไว้บน server ของเรา ซึ่ง server applications นี่ละจะเป็นโฟกัสของเราวันนี้ โดยปกติเราก็ต้องมีแก้ไข เพิ่ม features ใหม่ๆ ให้กับแอพเรา ซึ่งทุกๆครั้งเราก็ต้องไปอัพเดทแอพเราบน servers ทุกครั้งไป tool ที่จะช่วยให้เราทำงานนี้ได้ง่ายขึ้นก็คือ Docker นั้นเอง ด้วยเจ้า Docker จะมี function ที่ pack code ของเราทั้งหมดให้เป็นก้อนเรียกว่า image ทุกๆครั้งที่เราจะ deploy เจ้า image นี้ docker จะเป็นคนรัน image นี้ให้เรา image ที่รันอยู่เราเรียก container ใน container นี้จะมีทั้ง code ของเรา settings ต่างๆ รวมทั้ง environment variables ทุกๆครั้งที่เรารัน containers แอพบของเราจะทำงานเหมือนเดิมทุกครั้ง ทำให้เราสะดวกให้การ deploy แอพของเราทุกครั้งที่เราแก้ code ทุกครั้งที่เราเพิ่ม features ใหม่ๆ

Microservices

เมื่อเราทำ container ได้ ทำให้เราสามารถ deploy แอพของเราได้ตลอดเวลาแบบง่ายมาก เหมือนกระดิกนิ้ว ต่อมาก็จะเป็นอีกคอนเซ็ปต์นึงที่เกี่ยวเนื่องกันคือ Microservices

credit: https://microservices.io

การพัฒนา applications เหมือนการสร้างสิ่งอื่นๆ ยิ่งเล็ก ยิ่งเคลื่อนที่ง่าย เรายิ่งใช้ประโยชน์จากมันได้

เราคงเคยเห็นบ้านที่เป็น modules หลายๆอันมาประกอบกัน หนึ่ง module หนึ่งห้อง ทำให้บ้านสามารถเคลื่อนที่ได้ง่าย เราสามารถค่อยๆ ย้ายทีละ module แล้วไปประกอบอีกที่นึง หรือถ้าเราอยากได้ห้องเพิ่มหรือเปลี่ยนบางห้อง เราก็แค่เอา module นึงออก แล้วแทนที่ด้วย module อีกอัน

Applications ก็เหมือนกัน เราแบ่งพัฒนา applications เล็กๆ แล้วนำแอพเล็กๆ เหช่านั้นมาประกอบกัน เพื่อให้ service บางอย่างกับลูกค้าของเรา application เล็กๆ เราเรียกว่า “microservices” แต่ละ microservice สื่อสารกันภายใน แลกเปลี่ยนข้อมูลกัน ทำ functions ให้กัน ในมุมมองของลูกค้า microservices เหล่านี้เป็นหนึ่งเดียวกัน แค่สำหรับ developers แต่ละ microservice ทำหน้าที่อย่างใดอย่างนึง เป็นเหมือนห้องห้องนึง หากมี microservice อันไหนมี bugs หรือ ต้องการเพิ่ม features ใหม่ๆ เราก็แก้ไขเฉพาะ microservice นั้น เมื่อใช้งานร่วมกับระบบทำ containers อย่าง Docker หนึ่งแอพของเราจะมีหลาย containers ทำงานรวมกัน เมื่อเราแก้ไข microservice หนึ่งอัน เราแค่อัพเดท 1 container โดยที่ containers อื่นยังทำงานปกติ

Orchestration

Orchestration คือ การ automate system management หรือการจัดการระบบทั้งหมดของเราแบบอัตโนมัติ ให้ applications ของเราทำงานอย่างเป็นระบบ เหมือนเป็นหนึ่งเดียวกัน

จะเห็นว่าทุกครั้งที่ผมพูดถึง servers กับ applications ในบทความนี้ ผมเติม “s” ทุกครั้ง

สาเหตุที่ผมต้องเติม “s” ทุกครั้ง เพราะในความเป็นจริงเราต้องจัดการ applications หลายตัวในหลาย servers ทำให้การจัดการยุ่งยากมาก หากเกิดปัญหาขึ้น ต้องมีการเข้าถึง servers เพื่อแก้ไข หากมี loads หนักเพราะมี events มีคนเข้ามาใช้ applications ของเรามาก เราต้องมีการ scale เครื่องของเราให้รองรับ workloads ที่เข้ามา หากเรามีหลาย applications ที่เกี่ยวข้องกัน งานก็ยิ่งยากขึ้น ยิ่งงานยากยิ่งซับซ้อน ก็ยิ่งมีโอกาสเกิด human errors มากขึ้น แนวทางที่ดีที่สุดให้การจัดการปัญหานี้คือเรา automate ทุกอย่าง เช่นถ้ามี load เพิ่ม เราก็ให้ระบบ scales เครื่องให้เรา เพิ่ม containers ให้เรา สิ่งที่เราต้องทำก็คือตั้ง threshold ตั้งกติกา ไว้ว่าเมื่อไรควร scale up เพื่อรอบรับ loads เมื่อไรควร scale down เมื่อ loads น้อยลง เป็นต้น

Kubenetes

แล้วเราก็มาถึงหัวข้อของเรา เจ้า Kubenetes นั้นเอง

credit: https://kubernetes.io/

Kubenetes เป็น tool ที่จะ orchestrate ระบบให้เรา กล่าวคือ kube จะคอย monitor loads ของระบบให้เรา ถ้ามี loads เข้ามามาก kube จะ scale containers ให้เรา มันสามารถ scale เฉพาะบาง microservices ด้วย หรือแม้แต่ limit resources กับ containers ได้ เช่น บาง microservices ไม่สำคัญ ไม่จำเป็นต้องทำงานแบบ realtime เราอาจเลือกที่จะจำกัดการใช้ memory ของมัน พอมันทำ serve ลูกค้าชุดนึงเสร็จแล้ว มี memory คืนมา ค่อย serve ลูกค้าชุดถัดไป การจำกัด resources นี้สามารถทำให้เราประหยัดค่าใช้จ่าย สามารถ utilize resources ไปที่ microservices ที่สำคัญกว่าได้

นอกจากนี้ kube ช่วยเพิ่มเสถียรภาพให้กับ applications ของเราด้วย ตัว kube manage 2 อย่างหลักๆ ให้เรา นึงคือ servers อีกอันนึงคือ containers ยกตัวอย่างเช่นเรามี servers 3 เครื่อง มี 5 microservices เราแยกให้ 1 container รัน 1 microservice เราต้องมีอย่างน้อย 5 containers เพื่อรัน application ของเรา ทั้ง 5 containers กระจายกันรันบน servers ของเรา ทำ servers บางตัวของเรามีมากกว่า 1 containers ถ้ามี loads มากขึ้น ระบบก็จะ scale containers เพิ่มขึ้นเพื่อรองรับ แต่บาง microservices อาจมี loads มากกว่า services (ผมขอเรียก microservice แบบย่อว่า service) อื่น อาจเพราะทุก services ต้องมาเรียก service นี้ตลอดเวลา ทำให้บางครั้งเราอาจต้องการกำหนดให้บาง services รันมากกว่า 1 containers ก็ได้ด้วย Kubenetes เช่นเราอาจกำหนดว่า service A ต้องรันอย่างน้อย 3 pods (pod จะคล้ายๆ กับ container เป็นศัพท์ที่ใช้ใน kube เดี๋ยวผมจะอธิบายต่อด้านล่าง) เป็นต้น ถ้ามี servers เครื่องนึงล่ม kube จะพยายามสร้าง pods ทั้งหมดที่เคยรันอยู่ที่เครื่องที่ล่ม บนเครื่องอีก 2 เครื่องที่ยังรันอยู่ ซึ่งเราสามารถกำหนดได้อีกว่า service A ที่มี 3 pods นี้เนี้ย ต้องรันอยู่ทุกเครื่อง เครื่องละ pod เพื่อป้องกัน service unavailable เพราะทุก services ต้องพึ่งพา service A เป็นต้น

ต่อมาเราจะลงหลายละเอียดการทำงานของ Kubenetes กัน

credit: https://blog.newrelic.com/

ระบบ kube ประกอบด้วยสองส่วนหลักๆ คือ ส่วนควบคุม กับ workers ที่รัน workloads

ในการจัดการ servers หลายตัว (clusters) ตัว kube แยก servers เป็น 2 ประเภท master node กับ worker node

Master node เป็นเครื่องที่มี services เกี่ยวกับการจัดการของ kube รันอยู่ services เหล่านี้จะคอย monitor worker nodes ให้ทำตามสิ่งที่เรากำหนด หากมี node ไหนล่ม master node ก็จะจัดการสร้าง pods ที่เคยอยู่ที่ node นั้นที่ worker nodes อื่นๆ

Worker nodes คือ node ที่เป็นคนรัน applications ของเราจริงๆ pods ทั้งหลายจะรันอยู่ที่นี้

ส่วนต่อมาจะเป็นหน่วยย่อยๆ บน kube เรียกว่า objects ผมจะยกตัวอย่าง basic objects ที่สำคัญ 3 ตัวในที่นี้:

  • Pod
  • Service
  • Deployment

Pod คือ หน่วยย่อยที่สุดของ Kubenetes เป็น layer บางๆ ที่หุ้ม container ไว้เพื่อให้ kube สามารถจัดการกับ container ได้ โดยปกติเรามักมี 1 container ใน 1 pod แต่ kube อนุญาตในเรารันหลาย containers ใน 1 pod ได้ แต่เพื่อการจัดการที่ง่าย เราจึงรัน 1 container 1 pod

Service คือ network layer สำหรับ pods ที่คอย route requests ต่างๆ จากภายนอก(ลูกค้า) และภายใน(microservices อื่นๆ) ให้ pods ในกรณีที่ 1 service มีหลาย pods service จะเป็น endpoint ให้ services อื่นๆ มาเรียก service นี้ แล้ว service จะเป็นตัวกระจาย workloads ให้ pods เอง

Deployment จะเป็นตัว controls ให้ pods ทำงานเหมือนกับที่เรากำหนดไว้ เช่นเราต้องการ service A อย่างน้อย 3 pods เราก็กำหนดที่ deployment ว่าให้มี 3 pods อย่างน้อยเป็นต้น deployment มักแทน 1 service ถ้า service นั้นเป็นที่ต้องการมากเราเซ็ตให้ deployment scale pods มากตามขึ้นไป

--

--