คอนเซปในการทำงานของ Kubernetes

โลโก้ของ Kubernetes

Kubernetes (อ่านว่า คูเบอเนสเตส) เรียกย่อๆว่า K8s (เกิดจากการนับตัวอักษรจำนวน 8 ตัวจากตัว k ถึง s) เป็นระบบการบริหารจัดการคอนเทรนเนอร์ (Container Orchestration) ที่ถูกพัฒนาต่อยอดมาจากโปรเจคภายในกูเกิ้ลที่ภายหลังถูกนำออกมาเปิดเป็น open source ในวันที่ 7 กรกฎาคม ปี ค.ศ.2014 นับจากวันนั้นถึงวันที่เขียนบทความ Kubernetes มีอายุได้เพียง 8 ปีเท่านั้นซึ่งเมื่อเทียบกับความนิยมถือว่าเป็นการเติบโตที่รวดเร็วมาก

ในปัจจุบัน Kubernetes นับว่าเป็น Container Orchestration ที่ได้รับความนิยมอันดับต้นๆ ผู้ให้บริการระบบคราวน์ชั้นนำของโลกอย่างเช่น AWS, GCP, Azure หรือ Digital Ocean ต่างก็มี service ที่รองรับการใช้งาน Kubernetes ด้วยกันทั้งสิ้น

แล้ว Container Orchestration คืออะไร

ถ้าลองถอดรากศัพท์ดู Orchestration มาจาก Orchestra+tion... ใช่ครับ มันมาจากคำๆเดียวกันที่เราคุ้นเคยก็คือ วงออเซสตร้านั่นเอง ความหมายของ container orchestration คือการบริหารวง container (แต่ละคอนเทรนเนอร์เปรียบเสมือนเครื่องดนตรีหนึ่งชิ้น)

ในที่นี้ถ้าจะเปรียบ Kubernetes ก็จะเหมือนห้องโถงในการแสดงวงดนตรี มีระบบจัดการแสงสีเสียง มีคอนดัคเตอร์ที่คอยสั่งการให้เครื่องดนตรีแต่ละชิ้นบรรเลงในเวลาและโทนที่แตกต่างกัน มีซาวน์เอนจิเนียร์ที่คอยควบคุมและซ่อมระบบเสียงหากมีปัญหาขัดข้อง

ลองสมมุติว่าเราพัฒนาระบบขึ้นมาสักระบบหนึ่งที่มีผู้ใช้เป็นแสนๆคนต่อวัน ในระบบนี้เรามี Docker image ที่จะต้องใช้ 50 อิมเมจที่เราจะต้องเอาไปรันเป็น container เพื่อทำงานในส่วนที่แตกต่างกัน เราหลีกเลี่ยงไม่ได้ที่จะต้องทำการออกแบบสถาปัตยกรรมแบบ microservices เนื่องจากระบบมีความซับซ้อนและต้องแบ่งออกเป็นหลายๆส่วนที่มีความเป็นเอกเทศต่อกัน ทุกครั้งที่แล้วมีการเพิ่มเติม feature เข้าไปที่ส่วนใดส่วนนึงเราต้องแน่ใจว่าระบบและ services ที่เหลือได้รับการ update และรองรับการเปลี่ยนแปลงนี้ (ตัวอย่างเช่นส่ง traffic ไปยัง address ของ container ใหม่)

ตัวอย่างของโครงสร้างที่เราต้องมีคือ

  • Cluster เครื่องคอมพิวเตอร์เครื่องเดียวไม่พอแน่นอน เราต้องจัดทำระบบ cluster เพื่อเชื่อมโยงคอมพิวเตอร์หลายๆเครื่องเพื่อรวบรวม resources เข้าด้วยกัน
  • Load Balancer เพื่อกระจายภาระไปยังกลุ่มของ server ไม่ให้เครื่องใดเครื่องนึงทำงานหนักจนเกินไป
  • Gateway เพื่อควบคุม request/response จากภายในและภายนอก
  • Self-healing เพื่อทำการตรวจ server ที่ไม่ทำงาน ทำการลบทิ้งและสร้าง instance ใหม่เข้ามาทดแทน
  • Network management เนื่องจากมีหลาย services ที่จะต้องติดกันทั้งภายในและภายนอก การจัดการ traffic จึงเป็นส่วนสำคัญมากๆส่วนหนึ่ง
  • Deployment เพื่อทำการ roll-out เวอร์ชั่นใหม่หรือ roll-back กลับเวอร์ชั่นเก่า

เอาแค่นี้ก่อนจริงๆแล้วการจะ setup ระบบ microservices ขึ้นมาสักระบบยังมีรายละเอียดของสถาปัตยกรรมที่มากมายกว่านี้อีกเยอะ แต่เพียงแค่ที่กล่าวมาข้างบนถ้าหากเราไม่ใช้เครื่องมือทีเกี่ยวข้องโดยตรงเข้ามาช่วยเราก็ต้องสร้างขึ้นมาเอง จะทำให้เสียเวลามากมาย ดังนั้นการนำเครื่องมือมาช่วยบริหารจัดการคอนเทรนเนอร์จึงเป็นทางออกที่เราควรจะทำ จะได้นำเวลาไปลงทุนพัฒนาส่วนอื่นๆ และ Kubernetes ซึ่งเป็น container orchestration จะช่วยเราตอบโจทย์อันนี้ครับ

ส่วนประกอบพื้นฐานของ Kubernetes

ส่วนประกอบพื้นฐานของ Kubernetes

การที่จะปรับแต่งและติดตั้ง Kubernetes ได้อย่างมีประสิทธิภาพนั้น เรามีความจำเป็นที่จะต้องเข้าใจองค์ประกอบพื้นฐานที่อยู่ในระบบอย่างละเอียด ซึ่งองค์ประกอบพื้นฐานของ Kubernetes จะแบ่งออกเป็นส่วนหลักๆดังนี้ครับ

  1. Pod ส่วนประกอบย่อยที่เล็กที่สุดใน Kubernestes ที่ไว้รันคอนเทรนเนอร์หนึ่งลูก เราจะเหมารวมไปว่า pod คือชื่อที่เอาไว้เรียก container ใน kubernetes ก็ได้ครับ
  2. Node จะประกอบไปด้วย pod อย่างน้อยหนึ่งลูกซึ่งใน node นี้จะมี container runtime ฝังอยู่ จำนวนสูงสุดของ pod ใน node จะถูกกำหนดโดยผู้ให้บริการ Kubernestes แต่ละเจ้า
  3. Cluster จะประกอบไปด้วย pod อย่างน้อยหนึ่งลูกซึ่งใน node นี้จะมี container runtime ฝังอยู่ จำนวนสูงสุดของ pod ใน node จะถูกกำหนดโดยผู้ให้บริการ Kubernestes แต่ละเจ้า

สถาปัตยกรรมของ Cluster ใน Kubernetes

ใน Kubernetes - node จะแบ่งออกเป็น 2 ชนิดใหญ่ๆด้วยกัน คือ master node และ worker node

master node จะเป็นส่วนควบคุมระบบทั้งหมดที่อยู่ใน cluster ซึ่ง node นี้จะต้องมีความเสถียรมากๆเนื่องจากหากมีปัญหาจะทำให้ระบบทั้งหมดของ kubernetes หยุดชะงัก
ใน cloud provider ต่างๆที่ให้บริการ Kubernetes เช่น AWS EKS, Azure AKS หรือ GCP GKE ส่วนใหญ่แล้วจะทำการ config master node ให้เราโดยอัตโนมัติซึ่งเราไม่ต้องกังวลถึงการติดตั้งส่วนนี้เลย

worker node จะเป็นชนิดของ node ที่เรา deploy application หรือ service ต่างๆที่เราต้องการลงไป

Master node, Control plane

ส่วนประกอบของ kubernetes control plane

Kubernetes มีส่วนของ components หลักที่ชื่อว่า Control plane ที่จะอยู่ใน node ที่ชื่อว่า master node หากเราเปรียบ Kubernetes เหมือนวงออเคสร้า master node นี้ก็จะเปรียบเสมือน conductor ที่คอยควบคุมให้เครื่องดนตรีและระบบแสงสีต่างๆ (Node อื่นๆ) ทำงานได้ปกติตามที่วางแผนไว้ ซึ่งใน Control plane ก็จะประกอบด้วย components หรือ services ย่อยๆดังนี้

Kube-API-server

API server นี้เปรียบเสมือน interface หรือ frontend ที่ทำหน้าที่เป็นตัวกลางในการสื่อสารระหว่าง components ใน kubernetes หรือเพื่อรับคำสั่งข้อมูลจากภายนอกมายัง kubernetes

ยกตัวอย่างเช่นถ้าเราอยากจะส่งข้อมูลให้ kubernetes สร้าง pod ใหม่ด้วย image ของ database จาก dockerhub การสื่อสารนั้นจะถูกส่งมายัง API server นี้เพื่อให้ components อื่นๆภายในทำงานตามที่เราสั่ง

API server นี้จะสื่อสารด้วย RESTFul โปรโตคอล อย่างไรก็ตามโดยปกติแล้ว เราจะส่งคำสั่งไปยัง Kubernetes ผ่าน api client เช่น kubectl โดยตัว kubectl นี้จะทำการแปลงคำสั่งเราเป็น REST แล้วส่งไปที่ api server นี้อีกที

etcd - Backing store

การเก็บข้อมูลสำหรับ configuration ต่างๆใน kubernetes ถือได้ว่าเป็นส่วนที่สำคัญส่วนหนึ่ง โดยเฉพาะเมื่อระบบต้องทำงานกับเสกลใหญ่ๆอย่างเช่นการบริหาร cluster ที่มีจำนวนมาก ค่า config ที่เก็บไว้จะต้องมีความเสถียรและเสียหายไม่ได้เลย (เช่น มีโหนดไหน run อะไรและติดต่อกันอย่างไง) Kubernetes จึงได้นำเอา service ที่ชื่อว่า etcd มาใช้เป็น backing store ซึ่ง etcd นี้จะเป็น storage แบบ key-value based

ใน production environment เราควรจะมี replica ของ etcd ประมาณ 3-5 instances เพื่อให้แน่ใจว่าข้อมูลสามารถถูกเรียกใช้ได้อย่างมีประสิทธิภาพ

Controller Manager

Controler Manager หรือตัวจัดการควบคุม controller มีหน้าที่จัดการส่วนควบคุมระบบต่างๆใน cluster โดยจะตอบสนองต่อคำสั่งที่ถูกส่งเข้ามาและให้แน่ใจว่าสถานะหรือ state ต่างๆเป็นไปดังที่ถูกตั้งค่าไว้

ตัวอย่างเช่นถ้ามีคำสั่งผ่านทาง api server มาให้เพิ่มจำนวน container ที่อยู่ใน cluster, controller จะทำการเปลี่ยนแปลงการตั้งค่าหลัก และ controler อื่นๆจะทำการตรวจสอบซ้ำๆให้แน่ใจว่า state ของ container เป็นไปตามที่ได้ตั้งค่าไว้ ถ้าหากมี container ตัวใดตัวหนึงพังลง controller ก็จะลบ container นั้นทิ้งและทำการสร้าง container ใหม่ขึ้นมาทดแทน

Scheduler

Scheduler เป็นคอมโพเนนที่มีหน้าที่ monitor continer ใหม่ที่ถูกสร้างขึ้นมาบน cluster และทำการมอบหมายไปยัง node เพื่อให้ผูกกับ container นั้นๆ

Worker node

สถาปัตยกรรมของ worker node ใน kubernetes

Worker node เป็นโหนดที่เราใช้รัน service ที่เป็น containerlize application ต่างๆตามที่เราต้องการ ประกอบด้วยส่วนหลักๆดังนี้

  • Kublet
  • Kube-proxy
  • Container runtime

Kublet

Kublet เป็นโปรแกรมเล็กที่ทำตัวเป็น agent มีหน้าที่เป็นตัวกลางในการสื่อสารระหว่าง workder node และ control plane, kublet จะคอยทำหน้าที่คอยตรวจสอบเพื่อให้แน่ใจว่าสิ่งที่ได้รับมอบหมายมาจากโหนดหลักทำงานได้อย่างถูกต้อง (เช่น สั่งให้มี container จำนวน xxx รันอยู่ใน workder node)

หน้าที่ความรับผิดชอบของ Kublet จะจำกัดอยู่ภายใน workder node ที่ตัวมันเองติดตั้งอยู่เท่านั้น Kublet ไม่มีหน้าที่จัดการกับโหนดอื่นๆ

Kube-proxy

Kube-proxy มีหน้าที่จัดการระบบ Network ภายในตัว Cluster เอง โดยจะทำการมอบหมาย uqniue IP address ให้แต่ละโหลด ซึ่งใน Kube-proxy นี้จะมี load balancing เล็กๆและ มี routing rule เพื่อจัดการกับ network ภายใน

ยกตัวอย่างเช่นถ้าเรา deploy application ด้วย replica set - Kube-proxy จะมี load balancer เพื่อให้แน่ใจว่า traffic จะถูกส่งไปได้ทั่วถึงใน replicas นั้นๆ

Container runtime

Container runtime ก็เหมือน Docker daemon ที่เราคุ้นเคย มีหน้าที่ดาวโหลด image, start, stop, terminate container. Kubernetes รองรับการใช้งานของ container runtime หลาย provider ซึ่งในที่นี้รวมไปถึง Docker, rtk, containerd

Kubernetes รองรับการทำงานของ Container runtime ผ่าน Container Runtime Interface (CRI).

สรุป

ในบทความนี้เราได้เรียนรู้ว่า Kubernetes คืออะไร และได้เรียนรู้ส่วนประกอบว่า Kubernester มีส่วนประกอบใหญ่คือ Cluster ซึ่งประกอบด้วยหน่วยย่อยๆ คือ Node ซึ่งในโหนดนี้ จะมี container ที่รันอยู่ Pod

โดยเราจะแบ่ง Node ออกได้เป็น Master และ Worker ตัว master จะมี services ของ Kubernetes เองเพื่อทำหน้าที่บริหารจัดการ workder ืnode ภายใน ส่วน worker node จะเป็นโหนดที่เราใช้ run container ด้วย application image ที่เราต้องการด้วยวิธีส่งคำสั่งผ่านไปทาง master node

หวังว่าผู้อ่านจะได้ความรู้ไปจากบทความนี้บ้าง ไม่มากก็น้อยนะครับ
หากใครสนใจศึกษาแบบลงมือทำแนะนำให้อ่านบทความถัดไป ลองใช้ kubernetes บนเครื่อง localhost ด้วย Minikube

สอบถาม ติชม เสนอแนะ ได้ที่ช่อง comment ด้านล่างเลยครับ

Copyright © 2024. All rights reserved - Ninenote.net