Kubernetes Zero-2-Hero! EP.1 มารู้จักกับ Kubernetes พร้อมหลักการทำงาน ไปจนถึงวิธีการติดตั้งบนเครื่อง Local !!
สวัสดีครับ! วันนี้อยู่กับ Series “Kubernetes Zero-2-Hero” ใน EP แรกนี้ ผมจะมาแนะนำให้รู้จักกับเครื่องมือที่มีไว้จัดการ Cluster สำหรับ Containerization Technology ซึ่งมีนามว่า Kubernetes!!
หัวข้อในตอนนี้ที่เราจะมาพูดถึงเรื่องต่อไปนี้
1. What is Kubernetes?
2. Kubernetes Architecture.
3. Kubernetes Install for Local Cluster.
What is Kubernetes ?
มาเริ่มที่ Kubernetes คืออะไรกันก่อนเลยนะครับ แต่ก่อนหน้านั้นเพื่อให้เราเห็นภาพรวมของการเกิดขึ้นมาของ Kubernetes มันมาช่วยจัดการ Container ของเราได้ยังไงก็ต้องเริ่มเล่าจากการ Deploy Application ของเราตั้งแต่อดีตมาจนถึงปัจจุบันกันก่อน
Traditional Deployment
ในช่วงยุคเริ่มต้นเราจะ Deploy Application ของเราลงไปที่เครื่อง Server โดยตรง ซึ่งเราจะมีกี่ Application ก็จะถูกรวมกันไว้ในเครื่อง Server เครื่องเดียว จึงอาจเกิดปัญหาเรื่องของการแบ่งทรัพยากรภายในเครื่องให้แต่ละ Application หรือไม่ว่าจะเป็น ปัญหาเรื่องของการแบ่ง Environment ซึ่งต้องมีวิธีการเพิ่มเติม เช่น เรามี Applcation ที่เป็น NodeJs อยู่สองตัว โดยที่ทั้งสองนั้นใช้ Node ในการรันคนละเวอร์ชันกัน เราก็ต้องหาวิธีการที่จะทำให้เครื่อง Server ของเรารัน Node ได้สองเวอร์ชัน หรือเราอาจจะแยก Deploy ไปเลยคนละเครื่อง Server ก็ได้ แต่ทรัพยากรที่เหลือของ Server จะไม่ถูกใช้งานทำให้ทรัพยากรในเครื่องนั้นถูกใช้งานแบบไม่เต็มประสิทธิภาพ ถ้าเกิด Application ที่เรานำมา Deploy ไม่ได้ต้องการใช้ทรัพยากรมากไปกว่านี้แล้ว
Virtualized Deployment
ยุคต่อมาจะเป็นยุคของการใช้งาน Virtual Mechine หรือ VM ซึ่งตัว VM ก็จะถูกสร้างขึ้นมาอยู่ภายในเครื่อง Server เสมือนเครื่องคอมพิวเตอร์เครื่องนึง มี CPU, RAM, OS เป็นของตัวเอง VM ได้เข้ามาช่วยในเรื่องของการแบ่ง Evironmentโดยเราสามารถสร้าง VM ขึ้นมาเพื่อแบ่งการ Deploy Application ในแต่ละ Environment ได้ หรืออาจจะสร้าง VM เพื่อเป็นการกระจายทรัพยากรให้แต่ละ Application ตามความเหมาะสมโดยไม่จำเป็นต้องไปสร้างเครื่อง Server ใหม่ขึ้นมาจริงๆ
Container Deployment
Container นั้นจะคล้ายๆกับตัว VM แต่ Container จะใช้เพียงแค่ Kernel ของ OS ที่ Container ไปรันอยู่เท่านั้น ไม่ได้มี OS เป็นของตัวเอง ทำให้ประหยัดทรัพยากรของเครื่อง Server ได้ และเราสามารถสร้าง Image ซึ่งเป็นเหมือนกับการรวมสิ่งที่จำเป็นต้องใช้สำหรับ Application ไว้ภายใน Image ซึ่ง Image ก็มีขนาดไฟล์ที่เล็กมากเมื่อเทียบกับไฟล์ที่ได้จาก VM เราสามารถนำ Image ไป Deploy เป็น Container ที่เครื่อง Server ไหนก็ได้เพียงแค่ Server นั้นติดตั้ง Container Runtime เอาไว้ ทำให้ง่ายต่อการ Deploy และการ Test ระบบในแต่ละ Environment
Kubernetes Cluster
การ Deploy แบบ Container Deployment ในตอนแรกเรายัง Deploy ไว้ที่ Server เดียว จึงอาจเกิดปัญหาเรื่องของ Resource ของเครื่องเต็ม หรือว่าอยากจะทำในเรื่องของ High Availability จึงต้องขยาย Server ขึ้นมา และเมื่อขยาย Server ขึ้นมาแล้วเราก็ต้องมาจัดการในเรื่อง Network ของ Server ให้สามารถสื่อสารกันได้ หรือในเรื่องของการทำ LoadBalancer เพื่อให้กระจาย Traffic เข้าไปยัง Container ในแต่ละเครื่อง Server ก็ทำได้ยากมีวิธีการที่ซับซ้อน
Kubernetes จะเข้ามาช่วยให้จัดการในส่วนนี้ได้ง่ายมากขึ้น และ Kubernetes ก็ยังสามารถทำในเรื่องของการรวมศูนย์การทำงานของ Cluster ได้ เช่น เรามี Server A, B, C เราอยากจะ Deploy Application ไปที่ Server A เราก็ไม่จำเป็นต้อง Access เข้าไปยัง Server A เราสารมารถทำที่ Server กลางที่คอยรับคำสั่งแล้วนำ Application ไป Deploy ที่ Server A ยังไม่หมดเพียงเท่านี้ Kubernetes ยังช่วยในเรื่องของการ Update ตัว Application ที่ทำให้เกิด Down Time น้อยที่สุด และยังสามารถ Deploy Application เพิ่มขึ้นตามการใช้งานของ User ได้
Kubernetes Architecture.
Kubernetes Cluster จะประกอบไปด้วยเครื่องที่เป็น Control Plane(Master Node) และ เครื่อง Node(Worker Node) โดยถ้าทำการติดตั้ง Cluster ต้องมี Master Node อย่างน้อย 1 Node และ Worker 1 Node โดยเครื่องที่เป็น Master และ Worker ก็จะมี Components ภายในที่แตกต่างกันดังนี้
Control Plane (Master Node)
kube-apiserver เป็นตัวที่คอยรับคำสั่งจาก Client ที่จะเข้ามาจัดการกับ Cluster จัดการในเรื่องของการ Authentication, Authorization และ ตรวจสอบข้อผิดพลาดของคำสั่งที่ Client ส่งเข้า และยังทำหน้าที่เป็นตัวกลางในการสื่อสารของ Components ทั้งหมดภายใน Cluster
ETCD เป็น Database แบบ Key/Value สำหรับการทำ Cluster ตัวหนึ่งที่ Kubernetes นำมาใช้งานสำหรับการเก็บข้อมูลทุกอย่างของ Cluster เรียกง่ายๆก็คือ เป็นฐานข้อมูลของ Kubernetes
kube-controller-manager เป็นตัวควบคุมที่จะคอยทำให้ Resource ต่างๆ ภายใน Cluster เป็นไปตามคุณสมบัติที่ถูกกำหนดเอาไว้
kube-scheduler เป็นตัวที่คอยตัดสินใจว่า Application จะถูก Deploy ไปยัง Node ใด ภายใน Cluster
Node (Worker Node)
kubelet เป็นตัวที่คอยออกคำสั่งในการ Deploy Application
kube-proxy เป็นตัวที่คอยจัดการเรื่อง Network ให้กับ Application ใน Cluster
Container Runtime เป็นเครื่องมือสำหรับรัน Application ที่เป็น Container ตามคำสั่งของ kubelet
kubelet, kube-proxy, container-runtime จริง ๆ แล้ว ทั้งสาม Components นี้จะอยู่ในทุกๆ Node ภายใน Cluster ไม่ว่าจะเป็น Master หรือ Worker
การทำงานภายใน Cluster เมื่อเราสั่ง Deploy Application
- kube-apiserver รับคำสั่งจาก Client ตรวจสอบสิทธิ์ในการเข้าใช้งาน และความผิดพลาดของคำสั่งที่เข้ามา
- kube-apiserver บันทึกค่าของคำสั่งลงไปยัง ETCD
- kube-controller-manager เห็นการเปลี่ยนแปลงของข้อมูลที่ถูกเพิ่มเข้ามา เริ่มสั่งการให้ kube-scheduler หา Node ที่จะให้ Application ไป Deploy
- kube-scheduler หา Node สำหรับการ Deploy Application เมื่อได้ Node ที่ต้องการให้ Application ไป Deploy แล้ว จะสั่งการให้ kubelet ภายใน Node นั้น เริ่ม Deploy Application
- kubelet ที่ได้รับคำสั่งจาก kube-scheduler สั่งให้ Container Runtime รัน Container ขึ้นมา เมื่อ Container รันขึ้นมาแล้ว kube-proxy ก็จะทำการแจก IP Address ให้กับ Application นั้น
ทุกขั้นตอนการสื่อสารกันนั้นจะสื่อสารกันผ่าน kube-apiserver
Kubernetes Install for Local Cluster
สำหรับการติดตั้ง Kubernetes Cluster ในวันนี้เราจะติดตั้งผ่าน Docker Desktop ซึ่งเราไม่จำเป็นต้องมี Master Node หรือ Worker Node เราจะติดตั้งเพื่อทดลองใช้งาน Kubernetes ในเบื้องต้นเท่านั้น
ติดตั้ง Docker Desktop
เริ่มต้นด้วยการติดตั้ง Docker Desktop สามารถทำตามลิงค์ที่แนบไว้ได้เลยนะครับ Mac, Windows
เปิดการใช้งาน Kubernetes Cluster บน Docker Desktop
สามารถทำตามลิงค์ที่แนบไว้ได้เลยครับ
ติดตั้ง kubectl command
ตรวจสอบก่อนว่าในเครื่องคอมพิวเตอร์ของเรามี kubectl ถูกติดตั้งไว้อยู่แล้วหรือไม่ด้วยคำสั่ง
kubectl version --short# ถ้า kubectl ถูกติดตั้งแล้วจะได้ output แบบนี้
Client Version: v1.19.0
Server Version: v1.19.7
ถ้าไม่ได้ output ตามด้านบนให้ติดตั้ง kubectl command ก่อน สำหรับ windows ให้ทำตามลิงค์นี้ได้เลย ส่วน Mac ให้ทำตาม command ด้านล่าง
brew install kubectl
เมื่อทำการติดตั้งเสร็จแล้วให้ลองตรวจสอบดูอีกครั้งว่า Install สำเร็จหรือไม่
kubectl version --short# ถ้า kubectl ถูกติดตั้งแล้วจะได้ output แบบนี้
Client Version: v1.19.0
Server Version: v1.19.7
เท่านี้เราก็จะได้ Kubernetes Cluster บนเครื่อง Local ของเราแล้ว!
Version อาจจะไม่ตรงกับของผมนะครับ
kubectl เป็นเครื่องมือสำหรับการเรียกใช้งาน kubernetes cluster
Conclusion
- Kubernetes คือเครื่องมือที่เอาไว้จัดการกับ Container ในรูปแบบของ Cluster การรวมกันของ Contianer ในหลาย ๆ เครื่อง Server มีการจัดการเรื่อง Network ระหว่าง Node และ การรวมศูนย์การทำงานไว้ที่เครื่องเดียว
- kube-apiserver ที่เป็นตัวกลางการสื่อสารทั้งหมดภายใน Cluster
- ETCD เป็นฐานข้อมูลให้กับ Kubernetes Cluster
- controller-manager มีหน้าที่ตรวจสอบสถานะการเปลี่ยนแปลงของ Cluster
- kube-scheduler มีหน้าที่จัดหา Node ให้ เมื่อต้องการ Deploy Application
- kubelet ทำหน้าที่สั่งให้ Deploy Application
- kube-proxy ทำหน้าที่ในส่วนของจัดการเรื่อง Network และ IP Address
- Container Runtime มีหน้าที่สำหรับการรัน Container ขึ้นมาเมื่อ kubelet สั่งให้ Deploy Application
- ขั้นตอนภายใน Cluster เมื่อต้องการ Deploy Application ขึ้นไปยัง Cluster การทำงานจะเริ่มจาก kubectl ส่งคำสั่งไปยัง kube-apiserver จากนั้น kube-apiserver ตรวจสอบสิทธิ์ และความถูกต้องคำสั่งแล้วบันทึกลง ETCD ที่เป็น Database ของ Kubernetes Cluster จากนั้น controller-manager ก็จะคอยดูความเปลี่ยนแปลง แล้วสั่งให้ kube-scheduler จัดหา Node สำหรับการ Deploy Application ที่เข้ามาใหม่ จากนั้น kube-scheduler ก็จะสั่งให้ kubelet ภายใน Node ที่เลือก Deploy Application ขึ้นมา จากนั้น kube-proxy ก็จะมอบ IP Address ให้กับ Application นั้น
- เรียนรู้วิธีการติดตั้ง Kubernetes Cluster บน Local ด้วย Docker Desktop และทดลองใช้งาน Kubernetes Cluster บนเครื่อง Local ของตัวเอง
ก็จบกันไปแล้วนะครับสำหรับอีพีแรก และในอีพีถัดไปผมจะมาพูดถึงเรื่อง “การใช้งาน Kubernetes Cluster” และ เราจะ Deploy Application บน Kubernetes Cluster ได้ยังไง?
เพื่อนๆสามารถติดตามกันได้ที่ https://www.facebook.com/sirisoft แล้วพบกันใหม่เร็วๆนี้ ขอบคุณครับ 👋🏻👋🏻👋🏻
ALL EPISODE
EP.1 มารู้จักกับ Kubernetes พร้อมหลักการทำงาน ไปจนถึงวิธีการติดตั้งบนเครื่อง Local !!
EP.2 ทำความรู้จัก Resource Type และ การ Deploy Application บน Kubernetes
EP.3 สร้าง Service Ingress และการทำ Horizontal Pod Autoscaler
EP.4 สร้าง Secret ConfigMap และสำรองข้อมูลด้วย PersistentVolume
EP.5 สร้าง Health Check ด้วย Liveness Readiness และ การใช้งาน Rollout