Kubernetes คือ อะไร ? หนทางสู่การทำระบบให้แกร่งกว่าที่เคย !

Patcharaporn Auerach/ June 20, 2018/ Application, Knowledge Base/ 0 comments

Kubernetes คือ อะไร ? หนทางสู่การทำระบบให้แกร่งกว่าที่เคย !

Kubernetes คือ อะไร ?

“Kubernetes” หรือ “K8s” คือ “Container Orchestration” เป็น OpenSource จาก Google ที่จะมาช่วยในการจัดการคอนเทนเนอร์ (เช่น Docker, LXC)  ซึ่ง K8s ไม่ได้เป็นเทคโนโลยีเดียวที่ใช้ในการจัดการคอนเทนเนอร์ เพราะยังมี Docker Swarm ที่ใช้จัดการคอนเทนเนอร์ได้เช่นกัน ซึ่งหน้าที่หลัก ๆ คือ ช่วยให้เราสามารถติดตั้ง (Deployment) จัดสรรทรัพยากร หรือเพิ่มลดทรัพยากรแบบอัตโนมัติได้ (Managing & Scaling) นอกจากนั้นยังช่วยให้ Application ที่ทำงานอยู่บนคอนเทนเนอร์สามารถทำงานได้อย่างต่อเนื่อง ด้วยระบบที่พร้อมใช้งานตลอดเวลา (Auto Self-Healing) พูดง่าย ๆ คือ สามารถทำระบบที่ฆ่ายังไงก็ไม่ตายนั่นเอง ! (โกงกว่านี้มีอีกมั้ย?)

ภาพประกอบ 1 Kubernetes คือ

จากภาพข้างต้นจะเห็นว่า Kubenetes เป็นการต่อยอดหลังจากที่เราสร้าง Container ให้กับ App แล้ว โดยสามารถอ่านเพิ่มเติมเกี่ยวกับ Docker ได้ที่บทความเปลืองเวลาเป็นวัน ๆ ไปทำไม ? ในเมื่อใช้ Docker ช่วยได้ ! ซึ่งเมื่อมี Container แล้วสามารถ Manage ยังไงให้ได้ประสิทธิภาพสูงสุด จึงเป็นที่มาของการนำ Kubernetes เข้ามาเพื่อควบคุม Container ทั้งหมดอีกที ด้วยวิธีการง่าย ๆ คือ สร้าง Config สั่งไว้แผ่นหนึ่ง (เป็นไฟล์ .yaml) เขียนคำสั่งให้ทำตามที่ต้องการ แล้วปล่อยให้ระบบควบคุมให้เราเองได้เลย ดังนั้นจึง Centralized มากขึ้น ลดการทำงานที่ซับซ้อนได้ แถมยังเป็นไปแบบ Automatic อีกด้วย ส่วนมันออโต้ได้ขนาดไหน ? เลื่อนลงไปอ่านกันต่อได้เลย

ภาพประกอบ 2 Kubernetes คือ ภาพรวมการทำงานของ Kubernetes

ยากไป ? งั้นมาดูเคสตัวอย่างกันเลยดีกว่า

เคสแรก หากต้องการเพิ่มเครื่อง ต่อให้เรามี Container แล้ว เรายังต้องเปิดทีละเครื่องใหม่ แล้วเอา Container ไปวางเพื่อ Run ใหม่อีกที หากมีสักสิบเครื่อง ร้อยเครื่องยังต้องทำวนไปทีละเครื่องจนครบจำนวน แต่ถ้าหากนำ Kubernetes มาใช้ จะสามารถกระจายงานให้เครื่องในระบบได้เองอัตโนมัติ เพียงแค่เราเขียนคำสั่งบอกให้ทำอะไรเพียงแค่นั้นเอง

อีกสักเคส… คือ เราสามารถสั่งให้ Auto Scaling ได้ด้วย เช่น กำหนดไว้ว่าหาก CPU Usage เกิน 80% ให้ Auto Scale Up ขยายทรัพยากรให้ได้ทันที ดังนั้น Kubernetes ช่วยให้การจัดการของเราเป็นไปอย่าง Automatic มากขึ้น ช่วยประหยัดเวลาให้มีอิสระไปทำอย่างอื่นได้เพิ่มมากขึ้น


 The History Of Kubernetes

ต้นกำเนิดของ K8s นั้นเกิดมาจาก Pain ที่บริษัท Google เจอมาตลอด ในการพยายามจะจัดการ Data Center ของตัวเองมานานกว่า 15 ปี (แต่ก็ยังไม่ยาวเท่าที่เรารอตอนจบโคนัน) เดิมเรียกระบบนี้ว่า “Borg” และจากความผิดพลาด ปัญหาต่าง ๆ ที่เคยเจอและแก้ไขมาตลอดระยะเวลายาวนาน ทุกอย่างกลายเป็น Lesson  Learned จนเกิดเป็น “Kubernetes” ขึ้นมา อีกทั้ง Google ไม่หยุดโชว์ความยิ่งใหญ่ด้วยการเปิดให้เป็น Opensource ที่ทุกคนสามารถนำไปใช้งานได้อีกด้วย


จุดเด่นของ Kubernetes

  1. Container Clustering :  สามารถทำ Configuration  เพื่อสั่งระบบให้ทำงานตามที่ต้องการโดยอัตโนมัติ (เรียกได้อีกแบบว่าเป็นการกำหนด Desired State)
  2. Auto Scaling : รองรับการเพิ่มหรือลดทรัพยากรได้โดยอัตโนมัติตามความต้องการ
  3. Auto Self-healing : รองรับการทำงานแบบ HA เพื่อช่วยให้ระบบสามารถทำงานได้อย่างปกติ
  4. Auto Binpacking : จัดสรรทรัพยากรสำหรับคอนเทนเนอร์โดยอัตโนมัติ  
  5. Load Balancing : แบ่งการทำงานระหว่างคอนเทนนอร์ได้อย่างเหมาะสมและมีประสิทธิภาพสูงสุด
  6. Zero Downtime : รองรับการอัปเดตระบบแบบไม่มี Downtime
  7. Dashboard : มีแดชบอร์ดสำหรับควบคุมและบริหารจัดการทรัพยากร
  8. Community :  มีผู้ใช้งานจากทั่วโลกช่วยพัฒนาและอัปเดตฟีเจอร์ใหม่ ๆ อยู่ตลอดเวลา

 องค์ประกอบของ Kubernetes

Cluster 

ให้นึกภาพตามว่า K8s จะเข้ามาครอบมวลมหาประชา Server เอาไว้ ให้เสมือนว่ามันมีแค่ Server ใหญ่ ๆ เพียงเครื่องเดียว หากใช้ Cloud ต้องดูด้วยว่า Platform ของ Cloud นั้นรองรับไหม โดยหลักการ Cluster ของ K8s คือ สามารถจัดการให้เองว่าอะไรควร Run ไว้ที่ไหน โดย Node มีอยู่ 2 ประเภท คือ Master Node และ Worker Node ส่วนวิธีการทำงานร่วมกันของแต่ละส่วนนั้น จะขอกล่าวถึงในหัวข้อลำดับต่อไป

ภากประกอบ 3 Kubernetes คือ
What is Kubernetes to Datacenter
(source : Mesosphere)
ภากประกอบ 4 Kubernetes คือK8s Cluster Diagram
(source : kubernetes.io)


Deployment 

k8s นั้นมีตัวละครหนึ่งที่เป็นพระเอกของเรื่องเลย คือ ตัว Kubernetes Deployment Controller ซึ่งคอยช่วยจัดการ Instance ต่าง ๆ ของแต่ละ Node ดังนั้นการนำ App ของเราไป Run ใน K8s จะต้องสร้างสิ่งที่เรียกว่า Deployment ก่อน เพื่อเป็นการกำหนด Configuration (การทำ Desired State เพื่อระบุว่าเวลาที่ทุกอย่างปกติดี ควรจะมีอะไร ทำงานยังไงบ้าง) โดยที่ K8s จะช่วยดูแลให้เป็นไปตาม Config ให้ตลอดเวลา หากเกิดความผิดพลาดสามารถ Auto Self-healing ตัวเองโดยอัตโนมัติ

โดยการ Config ทำในไฟล์  .yaml


Node and Pod

“Container -> Pod  -> Worker Node -> Master Node ”

Part l : Pod

Pod เป็นหน่วยที่เล็กที่สุดของ K8s ซึ่งภายในแต่ละ Pod จะประกอบไปด้วย

  • Container หรือ อาจเป็นกลุ่มของ Container ก็ได้ ในบางกรณีที่ต้องการทำ Load-Balance ของข้อมูล
  • Resource ของ Container นั้น ๆ ยกตัวอย่างก็เช่น Storage, Network และ IP
  • Config ต่าง ๆ ของ Container แต่ละอัน Run ยังไง ให้คุยผ่าน Pod ตัวไหน เป็นต้น
ภากประกอบ 5 Kubernetes คือ
What object can be included in pod
(source : kubernetes.io)

 Part ll : Worker Node or Minion

Worker Node or Minion เป็นเหมือนสำนักงานย่อย โดยแต่ละ Node มี Process ชื่อ Kubelet ไว้สื่อสารกับ Master Node และมี Docker ในตัว เพื่อ Run Container และเนื่องจาก Pod จะ  Run อยู่บน Node เสมอ นั่นหมายความว่า ในแต่ละ Worker Node นั้นสามารถประกอบไปด้วย Pod หลาย ๆ ตัวได้

ภากประกอบ 6 Kubernetes คือ
Many pods can be included in the same worker node
(source : kubernetes.io)

Part lll : Master Node

Master Node เป็นเหมือนศูนย์บัญชาการ คอยสั่งการ Node ลูกต่าง ๆ (Worker Node & Minion) ว่าต้องทำอะไรบ้าง ดังนั้นเวลาทำการแก้ไขหรือ Deploy ติดตั้งอะไร จะสั่งการผ่าน Node นี้เท่านั้น

ภากประกอบ 7 Kubernetes คือ

จากรูปด้านบนจะเห็นการทำงานของ Master Node ชัดเจนมาก ว่าทำหน้าที่อะไรบ้าง ทั้งในส่วนของการติดต่อกับ API, การ Controller Node ต่าง ๆ ให้ทำงานตาม Config (ที่เรากำหนด Desired State ตอนไป Deployment) ของเราโดยอัตโนมัติ, การทำ Scheduler เพื่อควบคุม Workload ของแต่ละ Node และเป็นตัวที่จะควบคุมการติดต่อสื่อสารของ Node ทั้งหมดด้วย

Anatomy of Kubernetes Node

ถ้าเปรียบเทียบองค์ประกอบของ K8s อยากให้จินตนาการง่าย ๆ ประมาณว่า
Pod = เซลล์, Worker Node = อวัยวะต่าง ๆ ในร่างกาย, Master Node = สมอง ประมาณว่าเซลล์หลาย ๆ เซลล์ (Pod) ประกอบขึ้นมาเป็นอวัยวะต่าง ๆ (Worker Node) โดยแต่ละอวัยวะทำหน้าที่ของตัวเองซึ่งแตกต่างกันไป และอวัยวะต่าง ๆ ในร่างกายนั้นสามารถที่จะทำงานร่วมกันได้ โดยมีสมอง (Master Node) เป็นตัวควบคุมสั่งการทุกอย่าง


ReplicaSet

มีหน้าที่หลักคือทำให้  Pod มีจำนวนเท่ากับตอนที่เราสั่ง สามารถควบคุมดูแลตาม Config ที่ทำ Deployment ให้เป็นไปอย่าง Automatic คือ หากมีจำนวนมากไปจากที่กำหนดให้ทำลายทิ้ง หรือหากน้อยไปให้สร้างเพิ่ม (Self- Healing) อีกทั้งยังสามารถใช้ในการทำ Auto-Scale เพื่อใช้ประโยชน์ได้ เช่น กำหนดลงไปใน Config ว่า หาก CPU Usage Over 80% ให้สร้าง Pod เพิ่มขึ้นมาอีก เป็นต้น  

ภากประกอบ 8 Kubernetes คือ

 Services

เนื่องจากการทำงานของ k8s นั้นต้องมีการ Self-Healing อยู่ตลอดเวลา ดังนั้น k8s จึงมี Service ที่ทำหน้าที่กระจาย Load Balance ไปยังแต่ละ Pod สามารถทำหน้าที่เป็น API Gateway ในตัว นั่นทำให้เวลาเกิดการ เพิ่ม/ลด ของ Pod ตัวที่ทำการเรียกมายัง Pod ดังกล่าว จะไม่รู้สึกเลยว่าหลังบ้านของ Pod มีการเปลี่ยนแปลง เพราะ มี Service เป็นกลไกการทำงานและเป็นตัวกลางสื่อสารให้เอง (ตัวกลางแบบ Client to Pod และ Pod to Pod )

Services มีส่วนสำคัญในการทำให้การอัปเดตระบบไม่มี  Down Time (Zero Down Time)


โดยใน Service มีการใช้ Labels
ซึ่งตั้งค่าเอาไว้ที่ Config File (.yaml)  โดย Set Label ไว้ที่แต่ละ Pod และไป Set ที่ Service อีกทีว่าถ้าเรียก Service นี้ จะให้เชื่อมต่อไปยัง Pod ที่มี Label อะไรบ้าง ดังตัวอย่างในภาพด้านล่าง

ภากประกอบ 9 Kubernetes คือ

โดยจากภาพตัวอย่าง คือ ผู้ใช้สามารถที่จะใส่ Label ไว้ที่แต่ละ Pod ได้ หลังจากนั้นนำไปบอก Service ว่าใน Service นี้จะให้กระจายโหลดไปยัง Pod อะไรก็ตามที่มี Label = Prod และ Label = Be หลังจากนั้นจะกระจายโหลดไปตาม Pod ที่ Label เป็น Prod และ Be ให้เองได้เลย ถึงแม้ Pod นั้นมี Label ของเวอร์ชันอยู่ด้วยก็ตาม ทำให้เหมาะในเรื่องของการอัปเดตเวอร์ชันแอปพลิเคชัน

แต่ถ้าต้องการใช้ Service เรียกแบบระบุเวอร์ชันจริง ๆ ให้ Set Label และระบุ Version ที่ตัว Pod ที่ตัวการ แล้วบอก Service ให้กระจายโหลดไปเฉพาะ Pod ที่มี Label เป็นเวอร์ชันที่กำหนดไว้เท่านั้น

 พร้อมลุยหรือยัง!

หากศึกษาและพร้อมที่จะลุยกันแล้ว สามารถเลือกศึกษาข้อมูลเพิ่มเติมได้ตามลิงก์ด้านล่างนี้ได้เลย

source [1] [2] [3]

ติดตามข่าวสารใหม่ๆ หรือข้อมูลน่ารู้อีกมากมายได้ที่

  OpenLandscape Fanpage | https://www.facebook.com/openlandscapecloud/
  OpenLandscape Twitter | https://www.twitter.com/olscloud/
  OpenLandscape Cloud | https://openlandscape.cloud/

จบการศึกษาจากคณะเทคโนโลยีสารสนเทศ พระจอมเกล้าลาดกระบัง
มีความสนใจด้านเทคโนโลยี และมีความเชื่อว่า หากเราสามารถวางตัวเอง
ให้ก้าวทันเทคโนโลยีอยู่เสมอจะช่วยให้เราได้พัฒนาทั้งชีวิตของตนเอง
ครอบครัว และยังเป็นประโยชน์ต่อสังคมได้

Leave a Comment

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*