คอนเซปในการทำงานของ 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 จะแบ่งออกเป็นส่วนหลักๆดังนี้ครับ
Pod
ส่วนประกอบย่อยที่เล็กที่สุดใน Kubernestes ที่ไว้รันคอนเทรนเนอร์หนึ่งลูก เราจะเหมารวมไปว่า pod คือชื่อที่เอาไว้เรียก container ใน kubernetes ก็ได้ครับNode
จะประกอบไปด้วย pod อย่างน้อยหนึ่งลูกซึ่งใน node นี้จะมี container runtime ฝังอยู่ จำนวนสูงสุดของ pod ใน node จะถูกกำหนดโดยผู้ให้บริการ Kubernestes แต่ละเจ้า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 มีส่วนของ 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 เป็นโหนดที่เราใช้รัน 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 ด้านล่างเลยครับ