Kubernetes Intro (LV.0)
Kubernetes คืออะไร
Kubernetes หรือที่เรียกย่อๆว่า k8s (เค-เอท-เอส) เป็น open source ซึ่งช่วย automate deploy, scale และจัดการ container application
Kubernetes มีรากศัพท์มาจากภาษากรีก คำว่า κυβερνήτης ซึ่งหมายถึงคนถือหางเสือเรือ (Helmsman) ซึ่งบอกเป็นนัยว่า Kubernetes เป็นผู้ควบคุมทิศทางของเรือซึ่งบรรทุก container
ที่มาของชื่อย่อ k8s คือ ลดรูป 8 ตัวอักษรระหว่าง k และ s
Kubernetes ได้รับการพัฒนาโดยได้รับแนวคิดมาจาก Borg ซึ่งเป็น software ของ Google ในการจัดการ container และ workload application ซึ่งให้บริการในระดับ global มาเป็นเวลาหลายสิบปี
Kubernetes เริ่มต้นมาโดย Google และถูกส่งมอบต่อให้องค์กร Cloud Native Computing Foundation (CNCF) ดูแล ในฐานะ version 1.0 ตั้งแต่ปี ค.ศ. 2015
Feature ของ Kubernetes
Automatic bin packing
Kubernetes มีการจัด schedule ในการ deploy container อย่างอัตโนมัติ ทั้งนี้ในการเลือกว่าจะ deploy ลงเครื่องใด จะพิจารณาจากทรัพยากรที่ container ต้องใช้ และเงื่อนไขข้อกำหนดต่างๆที่ระบุไว้กับตัว container อีกด้วย จึงใช้ทรัพยากรได้อย่างมีประสิทธิภาพโดยไม่สูญเสีย Availbility ของระบบ
Self-healing
Kubernetes จะแทนที่ container ซึ่งไม่สามารถใช้งานได้ และ reschedule เพื่อ deploy container ใหม่ โดยพิจารณาจากการตั้งค่า healthcheck ทั้งนี้ Kubernetes ยังช่วยป้องกันการไหล traffic ไปยัง container ซึ่งไม่ตอบสนองแล้ว อีกด้วย
Horizontal scaling
Kubernetes สามารถ scale container แบบ manual หรือโดยอัตโนมัติได้ ทั้งนี้การ scale แบบอัตโนมัติ จะพิจารณาจาก metrics ที่ตั้งค่าไว้
Service discovery and Load balancing
แต่ละ container ใน Kubernetes จะมี IP address เป็นของตนเอง และยังมี DNS name สำหรับแต่ละกลุ่ม container เพื่อช่วยในการกระจาย request traffic เข้าไปยังแต่ละ container ในกลุ่มนั้น
Automated rollouts and rollbacks
Kubernetes สามารถ update และถอยกลับการอัพเดต application หรือการเปลี่ยน configuration ได้อย่างราบรื่น เพราะมีการ monitor healthcheck อยู่ตลอดเวลา เพื่อป้องกัน downtime ของ application
Secret and configuration management
Kubernetes มีการแยกเก็บ sensitive data และ configuration ต่างๆจากตัว container ดังนั้นจึงไม่ต้อง build container image ซึ่งมี configuration และ/หรือ sensitive data ติดมาด้วย นอกจากนี้ตัว sensitive data และ configuration ก็ยังสามารถอ้างถึงได้โดยที่ไม่แสดง content ใน configuration ของ stack
Storage orchestration
Kubernetes รองรับการ mount software-defined storage (SDS) หลายๆชนิด เข้ากับ container
Batch execution
Kubernetes รองรับการทำงานแบบ batch และ job ที่ทำงานนานๆ และยังสามารถแทนที่ container ที่ทำงานไม่สำเร็จได้อีกด้วย
Kubectl
kubectl (อ่านว่า คูป-คอนโทรล) เป็นเครื่องมือ command line ของ Kubernetes เพื่อให้ผู้ใช้สามารถติดต่อกับ Kubernetes Cluster ได้
ผู้ใช้สามารถใช้ในการ deploy application ตรวจสอบและจัดการ cluster และดู log application ได้
kubectl get xxx - อ่าน information ของ resource นั้นๆ kubectl create xxx - สร้าง resource นั้นๆ kubectl delete xxx - ลบ resource นั้นๆ kubectl describe xxx - ดู detail ของ resource นั้นๆ kubectl edit xxx - แก้ไข configuration ของ resource นั้นๆ kubectl logs xxx - ดู log ของ container
Basic Kubernetes Resource
Kubernetes Pods
Pods เป็นหน่วยเล็กที่สุดของ Kubernetes มันแสดงถึงกรุ๊ปของ container application หนึ่งตัวหรือมากกว่านั้น ซึ่งมี resource network และ storage ใช้ร่วมกัน
แต่ละ Pod จะมี IP Address ของมันเอง ดังนั้นหากมีหลาย container ภายใน Pod ทุก container ก็จะมี IP ร่วมกัน Pod อาจจะมีการ mount volume ดังนั้นหากมีหลาย container ภายใน Pod ทุก container ก็จะเห็น volume นั้นร่วมกัน
Create a Pod
ในการสร้าง Pod หนึ่งๆ เราสามารถคำสั่งใช้ kubectl run และระบุ image ที่ต้องการนำมาสร้าง Pod ได้ เช่น
คำสั่งข้างต้นจะสร้าง Pod ชื่อ nginx ขึ้นมาด้วย image nginx:latest
ในการ list Pod ที่ถูกสร้าง ใช้คำสั่งดังนี้
Get Pod detail
ในการเรียกข้อมูลรายละเอียด Pod มาแสดง ใช้คำสั่งดังนี้
จะนำข้อมูลรายละเอียดของ Pod ซึ่งมีชื่อ nginx ขึ้นมาแสดง
Get container log
การดู log ของ container ใช้คำสั่งดังนี้
Remove Pod
ในการ terminate Pod ที่สร้างขึ้นมา ใช้คำสั่งดังนี้
Kubernetes Deployments
การใช้งาน Pod เดี่ยวๆ ไม่สามารถ scale application เพื่อรองรับ workload ได้ อีกทั้งหาก Pod ถูก terminate ไป ก็จะไม่มีการสร้างกลับมา หาก Pod อยู่บน server ที่ down ไป ก็จะไม่มีการถูกสร้างขึ้นมาใหม่บนเครื่อง server ที่เหลือ ดังนั้นจึงต้องใช้ deployment เข้ามาแก้ปัญหานี้
Create a Kubernetes Deployment
เราสามารถสร้าง Deployment ขึ้นมาได้ง่ายๆ ด้วยคำสั่งดังนี้
คำสั่งข้างต้นจะเป็นการสร้าง Deployment ชื่อ nginx โดยใช้ container image nginx:latest
เราสามารถ list Deployment ทั้งหมดในขณะนั้นได้จากคำสั่งดังนี้
หากลอง list Pod ดู ก็จะพบว่า Pod ถูกสร้าง โดยมีชื่อ Deployment เป็น prefix และตามด้วยอักขระ alphanumeric อื่นๆ
Test the Deployment's replica
เมื่อลองลบ Pod และ list ขึ้นมาใหม่ ด้วยคำสั่งดังนี้
จะพบว่า Pod ชื่อใหม่ถูกสร้างขึ้นมาแทนตัวที่ถูกลบทิ้งไป
Get the Deployment Details
เราสามารถดูรายละเอียดของ Deployment ได้ด้วยคำสั่งดังนี้
Update the Deployment
ลองทดสอบเปลี่ยน version ของ container image ดังนี้
แก้ไขท่อน image: nginx เป็น image: nginx:1.18 แล้วเซฟ เพื่อเปลี่ยนไปใช้ image version 1.18 แทน
หากลอง list Pod ดูอีกรอบ จะพบว่ามีการลบ container เก่าทิ้ง และสร้าง container ใหม่ขึ้นมาแทน
Delete Deployment
เราสามารถ terminate Deployment ทิ้งได้ด้วยคำสั่งดังนี้
การ terminate Deployment นั้น จะทำการลบ Pod ให้เราไปด้วย โดยอัตโนมัติ
Kubernetes Services
จากการใช้ Deployment จะพบว่า container application ถูก maintain จำนวน replica ไวแล้ว ดังนั้นเมื่อ Pod ตายไปหรือถูกลบทิ้ง ก็จะมีการสร้างขึ้นมาใหม่ ซึ่ง Pod แต่ละ Pod ก็จะมี IP Address เป็นของตัวเอง การสร้างใหม่ก็จะไม่ได้ IP Address เดิม หรือแม้แต่การที่มีการ scale จำนวน replica เพิ่มขึ้น แต่ละ Pod ก็จะมี IP Address ที่แตกต่างกันออกไป ดังนั้นจึงไม่ใช่ความคิดที่ดีเลย ที่เราจะอ้างอิง application นั้นๆ ด้วย IP Address ของ Pod ซึ่ง Kubernetes Service ก็จะเข้ามาตอบโจทย์ในส่วนนี้
Kubernetes Service จะทำหน้าที่เหมือนเป็น Load Balancer ในการแจก traffic ไปยังแต่ละ Pod ซึ่งเป็นกลุ่มเดียวกัน การแยกว่าจะส่ง traffic ไปยัง Pod ใด จะใช้ concept ที่เรียกว่า Label & Selector
Label & Selector
Label จะถูกแปะติดอยู่กับแต่ละ Pod
Selector ถูกกำหนดอยู่ภายใน Service เพื่อบอกว่า จะเลือกส่ง traffic ไปยัง Label ใด
ถ้า Service มีการกำหนด Selector เป็น app: foo
เอาไว้ ก็จะส่งต่อ traffic ที่เข้ามายัง service ไปยัง Pod ซึ่งมี Label app: foo
Kubernetes Service Type
Kubernetes Service มีหลายชนิด แต่เบื้องต้นที่ใช้หลักๆ ดังนี้
ClusterIP
เป็นค่า default ของ Service หากไม่มีการระบุชนิดเอาไว้เมื่อตอนสร้าง Service ชนิดนี้จะเรียกถึงได้จากภายใน Kubernetes Cluster เท่านั้น
NodePort
จะมีการ เปิด High Port บนแต่ละ Host โดยเป็น Port ระหว่าง 30000-32768 ใช้เพื่อให้ Service เข้าถึงได้จากภายนอก Kubernetes Cluster
LoadBalancer
เป็น Superset ของ NodePort กล่าวคือ มีการติดต่อไปยัง API ภายนอก เช่น API ของ Cloud Provider เพื่อให้สร้าง LoadBalancer ขึ้นมาคั่นหน้า NodePort เอาไว้ ทำให้ไม่ต้องสนใจว่า IP ของ Host เป็น IP อะไร อีกทั้งยังสามารถ Map LowPort เข้ากับหมายเลข HighPort ที่ NodePort เปิดมาอีกด้วย
Create a Service
เตรียม Deployment ด้วยคำสั่งดังนี้
คำสั่งข้างต้นจะสร้าง Deployment ชื่อ nginx ขึ้นมา โดยมี 3 replica (Pod)
หลังจากนั้นทำการสร้าง Service ชนิด ClusterIP ซึ่งรับ traffic เข้ามา Port 8080 และส่งต่อไปยัง container nginx ซึ่งรับ traffic port 80 ด้วยคำสั่งดังนี้
Test connection to the service
ทดสอบ connection ไปยัง Service โดยการสร้าง Pod โดยใช้ image Debian ขึ้นมา
เมื่อรันคำสั่งข้างต้น จะเข้ามาภายใน container image debian และได้ bash shell ทำการติดตั้ง curl และทดสอบ Service nginx ด้วยคำสั่งดังนี้
เราจะสามารถเรียกใช้งาน Service ที่ชื่อ nginx ได้
Remove a service
ใช้คำสั่งดังนี้ เพื่อลบ Service ทิ้ง
Other Tips
Scaling Application
ในการปรับจำนวน Replica ของ Deployment เราสามารถทำได้โดยใช้คำสั่งดังนี้
จะทำการปรับจำนวน Replica ของ Deployment ที่ชื่อ nginx ให้เหลือเพียง 2 Pod
Update Application Image
ในการเปลี่ยน version image ของ container ทำได้โดยใช้คำสั่งดังนี้
คำสั่งข้างต้นจะทำการเปลี่ยน container image ของ Deployment nginx จากเดิม nginx:latest ให้เป็น nginx:1.18 แทน
Rollback
หากต้องการยกเลิกการเปลี่ยนแปลง Deployment กลับไปให้เป็นดังเดิม ใช้คำสั่งดังนี้
Last updated
Was this helpful?