Kubernetes Zero-2-Hero EP.2 ทำความรู้จัก Resource Type และ การ Deploy Application บน Kubernetes

by. Settakit

settakit
Sirisoft
7 min readJul 9, 2021

--

สวัสดีครับ กลับมาเจอกันอีกครั้งกับ Series “Kubernetes Zero-2-Hero” ใน EP.2 นี้เราจะแนะนำวิธีการ Deploy Application ขึ้นไปบน Kubernetes Cluster ว่าสามารถทำได้อย่างไรบ้าง

ก่อนจะเริ่มขั้นตอนการ Deploy Application เราต้องมาทำความรู้จักกับ Resource Type ของ Kubernetes กันก่อน โดยใน EP นี้ เราจะขอพูดถึง 4 Type ก่อน ดังนี้

Pods

ReplicaSet

Deployments

Namespace

ส่วนใครที่พึ่งจะเข้ามาอ่านก็สามารถย้อนกลับไปอ่าน EP.1 ได้ที่ ลิงค์นี้ ได้เลย

ก่อนจะมาเริ่มกันใน EP นี้ และ EP ถัด ๆ ไป เราจะมีการใช้งานไฟล์เพื่อทดลองการ Deploy Application สามารถเข้าไป Download จากลิงค์ หรือใครใช้ GIT ก็สามารถ Clone เอาไปใช้งานได้เลย

Pods

มาเริ่มกันที่ Pod กันก่อนเลยนะครับ

source: https://kubernetes.io

Pod เป็นส่วนที่เล็กที่สุดของ Kubernetes ภายใน Pod จะประกอบไปด้วย Container, Volume, และ IP Address เป็นของตัวเอง ให้มองว่า Pod เป็นเหมือนกับคอมพิวเตอร์เครื่องเล็ก ๆ ที่มี Container Runtime อยู่ภายในสำหรับการรัน Container และ มี IP Address และ Volume สำหรับเก็บข้อมูลเป็นของตัวเอง

IP Address: ทุกๆ Pod จะมี IP Address เป็นของตัวเองซึ่งจะถูกแจกแบบ Dynamic โดยตัว kube-proxy

Volumes: เป็นส่วนที่เอาไว้เก็บข้อมูลสำหรับ Container แต่เมื่อ Pod หายไป Volume ภายใน Pod ก็จะหายไปด้วย นั้นหมายความว่าข้อมูลต่าง ๆ ที่ถูกเก็บไว้ภายใน Pod นั้นก็จะหายไปด้วย

Container: เป็นส่วนของ Application ที่รันอยู่ภายใน Pod ซึ่งสามารถมีได้มากกว่า 1 Container ใน 1 Pod ขึ้นอยู่กับการออกแบบว่าเราจะให้ Pod มีกี่ Container

ต่อไปเราจะมาลองสร้าง Pod กันดูนะครับ โดยวิธีการสร้าง Pod สามารถสร้างได้ 2 วิธีดังนี้

สร้าง Pod ผ่าน kubectl command

เราจะสร้าง Pod ชื่อ “first-pod” ด้วย Image “nginx”

เราสามารถตรวจสอบได้ว่าตอนนี้เรามี Pod อะไรรันอยู่บน Cluster บ้าง

สร้าง Pod ด้วยไฟล์

เราสามารถสร้าง Pod ได้ด้วยไฟล์ Config ที่เป็นไฟล์ YAML ภายในไฟล์จะกำหนดคุณสมบัติต่าง ๆ ของ Pod ไว้ภายในตามตัวอย่างดังนี้

เราสามารถสร้าง Pod จากไฟล์ด้วยคำสั่งดังต่อไปนี้

ตรวจสอบว่า Pod ของเราทำงานอยู่

จะเห็นได้ว่า Pod ของเรากำลังทำงานอยู่

ต่อไปเราจะมาดูกันว่า IP ของ Pod เป็นหมายเลขอะไรด้วย Command ดังนี้

จะเห็นว่า IP ของ Pod นั้นจะไม่เหมือนกันโดยแต่ละ Pod จะมี IP Address เป็นของตัวเอง แต่ IP Address นี้จะไม่สามารถเข้าใช้งานได้จากภายนอก Cluster จะสื่อสารกันแค่ภายใน Cluster เท่านั้น สามารถทดสอบได้ดังนี้

จะสังเกตุได้ว่าเราไม่สามารถเข้าใช้งาน Pod จากภายนอก Cluster ได้

โดยถ้าเราต้องการให้ภายนอกเข้ามาใช้งาน Pod ของเราได้เราต้องใช้งาน Resource Type ที่ชื่อว่า “Service” เข้ามาจัดการในเรื่องนี้ ด้านล่างนี้จะเป็นตัวอย่างการใช้งาน Service เท่านั้นส่วนรายละเอียดเราจะพูดถึงกันใน EP ถัดไป

จากตัวอย่างเราก็จะเห็นได้ว่าเราสามามารถเข้าใช้งาน Pod จากภายนอก Cluster ได้แล้ว

ReplicaSet

ต่อไปเราจะมาพูดถึงเรื่องของ ReplicaSet กันนะครับ

source: https://congdonglinux.com/how-to-create-a-replicaset-in-kubernetes/

เมื่อเราต้องการสร้าง Pod มากกว่าหนึ่ง Pod โดยที่ Pod นั้นเป็น Application เดียวกันเราต้องการ Deploy ขึ้นมาหลาย Pod เพื่อให้ Pod ช่วยกันรับ Request ที่เข้ามาจาก User แล้ว Response ผลลัพธ์ออกไปให้กับ User โดยที่เราไม่จำเป็นต้องสร้างเองทีละ Pod และ ReplicaSet จะคอยตรวจสอบอยู่เสมอว่า Pod ที่เรา Deploy นั้นมีจำนวนเท่ากับที่เรากำหนดไว้ตอนแรกด้วยหรือไม่ ถ้า Pod จำนวนไม่เท่ากับที่เรากำหนด ReplicaSet จะทำให้ Pod มีจำนวนเท่ากับที่กำหนดไว้ในตอนแรก

วิธีการสร้าง ReplicaSet นั้นก็สามารถสร้างได้จากไฟล์เท่านั้น ดังตัวอย่าง

ตรวจสอบว่า ReplicaSet ของเราทำงาน พร้อมกับดูว่า Pod ของเราถูกสร้างขึ้นมาตามจำนวนที่กำหนดไว้หรือไม่

จะเห็นได้ว่า Pod ของเราจะถูกสร้างขึ้นมาตามจำนวนที่เรากำหนดไว้ในตอนแรก ซึ่งเราก็สมารถเพิ่มลดจำนวนของ Pod ได้ด้วย command ดังนี้

เมื่อเราตรวจสอบ Pod ดูอีกครั้งจะพบว่าจำนวนของ Pod จะเพิ่มขึ้นหรือลดลงเท่ากับจำนวนตัวเลข replicas ที่เรากำหนดไว้

Deployments

ต่อไปเราจะมาพูดถึง Deployments กันนะครับ

source: https://www.katacoda.com/contino/courses/kubernetes/basic-deployments

Deployments เป็นเหมือนกับการรวมคุณสมบัติของ ReplicaSet และ Pods เข้ามาไว้ด้วยกัน แต่สิ่งนึงที่เพิ่มเข้ามาก็คือเรื่องของการจัดการเวอร์ชันของ Application เช่น เมื่อเรา Update Application ของเราไปเป็นเวอร์ชันใหม่แล้วเกิดปัญหาเราสามารถย้อนกลับไปใช้งาน Application เวอร์ชันเก่าที่ทำงานสมบูรณ์ได้

การทำงานของ Deployment เมื่อ Deployment ถูกสร้างขึ้น Deployment จะไปสร้าง ReplicaSet และเก็บเป็นหมายเลขเวอร์ชันไว้ จากนั้น ReplicaSet ก็จะไปสร้าง Pod ตามคุณสมบัติที่ถูกกำหนดไว้ โดยเมื่อเรา Update เวอร์ชัน image ที่ใช้ Deploy Application Deployment จะสร้าง ReplicaSet ขึ้นมาใหม่ จากนั้น ReplicaSet ก็จะไปสร้าง Pod ชุดใหม่ขึ้นมา และ Pod ชุดเดิมก็จะถูกลบออกไป ส่วน ReplicaSet ตัวเก่าก็ยังถูกเก็บไว้อยู่จะไม่ได้ลบออกไป เพื่อเอาไว้สำหรับการย้อนกลับไปใช้ Application เวอร์ชันเก่า ส่วนวิธีจัดการกับเวอร์ชันเราจะพูดถึงใน EP ถัด ๆ ไป

ต่อไปจะเป็นวิธีการสร้าง Deployment ซึ่งเราสามารถสร้างได้ด้วย command หรือ จากไฟล์ดังตัวอย่างต่อไปนี้

สร้าง Deployment ชื่อ first-deployment ด้วย image “nginx” รันที่ port 80 และมีจำนวน 2 Pods

ตรวจสอบว่า Deployment ของเราทำงาน พร้อมกับสร้าง ReplicaSet และ Pods ขึ้นมาแล้ว

จะเห็นว่า ReplicaSet จะถูกสร้างขึ้นมา และมี Pods ตามจำนวนที่เรากำหนดไว้

ต่อไปทดลองแก้ไขเวอร์ชันสำหรับ Application ที่ Deployment ด้วย Command ดังนี้

และเมื่อเราลองแก้ไขเวอร์ชันดูแล้วก็จะพบว่า ReplicaSet จะถูกขึ้นมาใหม่ และ Pod ใหม่ก็จะถูกสร้างขึ้น (สังเกตุได้จากชื่อของ Pods)

Namespace

Namespace เป็นตัวที่ใช้แบ่ง Environment สำหรับการ Deploy Application บน Cluster เพื่อแยกการทำงานของแต่ละ Environment อย่างชัดเจน และช่วยให่เราสามารถจัดการกับ Application ของเราได้ง่ายขึ้น โดย Namespace ยังสามารถกำหนดสิทธิ์การเข้าถึงในแต่ละ Namespace ของ Client ที่จะเข้ามาใช้งาน Kubernetes Cluster และยังสามารถกำหนดขอบเขตการใช้งานทรัพยากรของแต่ละ Namespace ได้อีกด้วย

คำสั่งในการสร้าง Namespace

สามารถดู Namespace ทั้งหมดภายใน Cluster ได้ดังนี้

เราสามารถ Deploy Application ของเราไปยัง Namespace ที่ต้องการได้ดังนี้

ถ้าหากเราไม่กำหนด Namespace ให้กับ Application ของเรา Application ของเราก็จะไป Deploy ที่ Default Namespace

เมื่อเราเรียกดู Pods โดยไม่ระบุ Namespace จะพบว่าไม่มี “third-pod” ที่เราสร้างไปก่อนหน้านี้ เนื่องจากถ้าเราไม่กำหนด Namespace มันก็จะไปเรียกในส่วนของ Default Namespace มาแสดงให้เราดู

แต่เมื่อเรากำหนด Namespace เข้าไปก็จะพบกับ “third-pod” ที่ถูกสร้างขึ้น

Conclusion

  1. Pods เป็นส่วนที่เล็กที่สุดของ Kubernetes Cluster เป็นที่อยู่ของ Application เรา โดยภายใน Pod จะประกอบไปด้วย Container อย่างน้อยหนึ่ง Container มี Volume และ IP Address เป็นของตัวเอง เปรียบได้กับคอมพิวเตอร์เครื่องเล็ก ๆ ที่มี Container Runtime อยู่ภายใน
  2. ReplicaSet ที่สามารถสร้าง Pods ขึ้นมาตามที่เราต้องการครั้งละหลาย ๆ Pods และยังคอยทำให้ Pods มีจำนวนตามที่กำหนดไว้อยู่ตลอดเวลา
  3. Deployment เป็นการรวมกันของการสร้าง ReplicaSet และ Pods โดยเพิ่มในส่วนของการจัดการเวอร์ชันเข้ามา
  4. Namespace เป็นตัวที่ช่วยแบ่ง Environment ให้กับ Application ภายใน Cluster สามารถแบ่งสิทธ์การเข้าถึงในแต่ละ Namespace และจำกัดการใช้งานทรัพยากรในแต่ละ Namespace ได้
  5. ทดลองการ Deploy Application ขึ้นไปยัง Cluster ด้วย Pod, ReplicaSet และ Deployment
  6. ความแตกต่างระหว่าง Pod, ReplicaSet และ Deployment

ใน EP นี้ใครอยากเรียนรู้ในเรื่องของ kubectl ให้มากขึ้นก็สามารถเข้าไปได้ตาม ลิงค์นี้ ได้เลยนครับ มันมีเยอะมาก ๆ ไว้มีโอกาสผมจะทำสรุปที่สำคัญ ๆ เอาไว้ให้นะครับ

สำหรับวันนี้ใน EP.2 ก็ขอจบไว้แต่เพียงเท่านี้ก่อนนะครับ สำหรับตอนถัดไปจะมาพูดถึงเรื่อง Service และ Ingress ที่จะทำให้ User สามารถเข้ามาใช้งาน Application ของเราได้ และแถมด้วย Feature ที่ทุกคนต้องว้าวว! นั้นก็คือการทำ Auto Scaling ให้กับ Application ตามความต้องการใช้งานของ User

เพื่อนๆสามารถติดตามกันได้ที่ https://www.facebook.com/sirisoft แล้วพบกันใหม่เร็วๆนี้ ขอบคุณครับ 👋🏻👋🏻👋🏻

--

--