Kubernetes คืออะไร? ลองรันแอป เพิ่มตู้ และซ่อมตัวเองบน minikube

เข้าใจ Kubernetes ผ่านภาพท่าเรือกับตู้คอนเทนเนอร์ แล้วลงมือเปิดคลัสเตอร์บนเครื่องตัวเองด้วย minikube รันแอป เปิดให้เข้าจากเบราว์เซอร์ เพิ่มเป็น 3 ตัว และดู Pod ที่ถูกลบกลับมาเอง

ถ้าเคยใช้ Docker มาบ้าง คงรู้แล้วว่ามันแพ็กแอปใส่ "ตู้" ที่ยกไปรันบนเครื่องไหนก็ได้ ปัญหาเริ่มตอนที่ตู้มีเยอะขึ้น ใครจะคอยดูว่าตู้ไหนดับ ใครจะเปิดตู้เพิ่มตอนคนเข้าเว็บเยอะ งานแบบนี้แหละที่ Kubernetes เข้ามารับช่วงต่อ

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

จบบทความนี้คุณจะ:

  • อธิบายได้ว่า Cluster, Node, Pod, Deployment และ Service ทำงานร่วมกันยังไง
  • เปิดคลัสเตอร์บนเครื่องตัวเองด้วย minikube
  • ใช้ kubectl สร้างแอป เปิดให้เข้าจากเบราว์เซอร์ และเพิ่มจำนวน Pod
  • เข้าใจว่าทำไม Pod ที่ถูกลบถึงกลับมาเองได้
  • อ่านไฟล์ YAML ของ Deployment ออก

ดูภาพรวมแบบเร็วๆ จากคลิปนี้ก่อนได้เลยครับ

ดูคลิปนี้บน YouTube

Docker คือตู้ Kubernetes คือนายท่า

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

แต่ท่าเรือใหญ่มีตู้เป็นพันใบ ต้องมีคนคุมว่าตู้ไหนขึ้นเรือลำไหน ตู้ไหนเสียต้องเปลี่ยน Kubernetes คือ "นายท่า" คนนั้น เราไม่ต้องสั่งทีละตู้ แค่บอกว่าอยากให้ผลออกมาเป็นแบบไหน แล้วมันจะคอยจัดการให้เป็นแบบนั้นตลอดเวลา

เรื่องDockerKubernetes
ทำอะไรแพ็กแอปลงตู้ แล้วรันตู้คุมตู้จำนวนมากให้เป็นไปตามที่สั่ง
เทียบกับตู้คอนเทนเนอร์นายท่าที่คุมทั้งท่าเรือ
ตู้ดับต้องไปเปิดใหม่เองสร้างตู้ใหม่แทนให้

ชื่อ Kubernetes มาจากภาษากรีก แปลว่า คนถือหางเสือเรือ โลโก้จึงเป็นพวงมาลัยเรือ ส่วนชื่อย่อ K8s มาจากตัว K ตามด้วยตัวอักษรอีก 8 ตัว แล้วปิดด้วย s

ยังไม่คุ้นกับ Docker ดูคลิปนี้ปูพื้นก่อนได้ บทความนี้ไม่ต้องสร้างตู้เอง เพราะจะใช้ image (ต้นแบบของตู้ที่มีคนทำไว้แล้ว)

ดูคลิปนี้บน YouTube

ศัพท์ 5 คำที่ต้องรู้

คำเทียบกับหน้าที่
Cluster / Nodeท่าเรือ / เรือแต่ละลำCluster คือทั้งระบบ Node คือเครื่องที่รันงานจริง
Podตู้คอนเทนเนอร์หน่วยเล็กสุดที่ K8s ดูแล มี container 1 ตัวขึ้นไป
Deploymentใบสั่งงานบอกว่าอยากได้ Pod แบบไหน กี่ตัว
Serviceประตูทางเข้าทางเข้าคงที่จากข้างนอก ส่งต่อไปหา Pod
kubectlวิทยุสื่อสารใช้ส่งคำสั่งให้คลัสเตอร์

งานจริงคลัสเตอร์มีหลาย Node เหมือนท่าเรือที่มีเรือหลายลำ ส่วน minikube ย่อให้เหลือ Node เดียวในเครื่องเรา พอสำหรับฝึก

แผนผังคลัสเตอร์ minikube: kubectl ส่งใบสั่งงาน Deployment ให้สร้าง Pod 3 ตัวบน Node ส่วนเบราว์เซอร์เข้ามาทาง Service
เราคุยกับคลัสเตอร์ผ่าน kubectl ส่วนคนข้างนอกเข้ามาทาง Service

อ่านภาพจากบนลงล่าง เราใช้ kubectl ยื่นใบสั่งงานให้คลัสเตอร์ คลัสเตอร์วาง Pod ลงบน Node ให้ครบตามจำนวน แล้วเมื่อมีคนเปิดเว็บ คำขอจะเข้าทาง Service ซึ่งส่งต่อให้ Pod ตัวใดตัวหนึ่ง

ทำไมไม่ต่อตรงไปที่ Pod เลย Pod เกิดและตายได้ตลอด และทุกครั้งที่เกิดใหม่จะได้ที่อยู่ (IP) ใหม่ Service จึงเป็นประตูที่ที่อยู่ไม่เปลี่ยน และคอยดูเองว่าตอนนี้มี Pod ตัวไหนพร้อมรับงาน

เตรียมเครื่อง

minikube จะสร้าง Node เป็นตู้ Docker หนึ่งตู้ในเครื่องเรา (เหมือนเอาเรือจำลองไปลอยในอ่าง) แล้วติดตั้ง Kubernetes ไว้ข้างใน ตามเอกสารของ minikube เครื่องต้องมีอย่างน้อย

  • CPU 2 คอร์ขึ้นไป, RAM ว่าง 2 GB, ดิสก์ว่าง 20 GB และอินเทอร์เน็ต
  • Docker Desktop ที่ติดตั้งแล้ว และ เปิดค้างไว้ตลอด ระหว่างทำ
Terminal
docker --version
ผลลัพธ์ที่ควรเห็น (ประมาณนี้)
Docker version 2x.x.x, build xxxxxxx

เช็กว่าได้แล้ว: ขึ้นเลขเวอร์ชัน แต่คำสั่งนี้บอกแค่ว่าติดตั้งแล้ว ให้ดูด้วยว่าโปรแกรม Docker Desktop เปิดอยู่และขึ้นว่ากำลังทำงาน

ติดตั้ง minikube

PowerShell (Windows)
winget install Kubernetes.minikube
Terminal (Mac)
brew install minikube

Linux ให้ดูคำสั่งตามรุ่นที่หน้า minikube start ติดตั้งเสร็จแล้ว ปิด Terminal แล้วเปิดใหม่ เพราะตัวติดตั้งเพิ่ม minikube ลงใน PATH (รายชื่อโฟลเดอร์ที่ Terminal ใช้หาคำสั่ง) แต่หน้าต่างเดิมอ่าน PATH แค่ตอนเปิด

Terminal
minikube version
ผลลัพธ์ที่ควรเห็น (บรรทัดแรก)
minikube version: v1.xx.x

เช็กว่าได้แล้ว: ขึ้นเลขที่ขึ้นต้นด้วย v1. ตัวเลขหลังจุดต่างกันไปตามวันที่ติดตั้ง

เปิดคลัสเตอร์แรก

Terminal
minikube start

คำสั่งเดียวนี้ทำหลายอย่าง คือสร้างตู้ Docker ชื่อ minikube ขึ้นมาเป็น Node, ติดตั้ง Kubernetes ข้างใน แล้วตั้งค่าให้ kubectl คุยกับคลัสเตอร์นี้ ครั้งแรกต้องโหลดของเยอะ จึงอาจใช้เวลาหลายนาที

ผลลัพธ์ที่ควรเห็น (ตัดมาบางส่วน)
Automatically selected the docker driver
Creating docker container (CPUs=2, Memory=xxxxMB) ...
Preparing Kubernetes v1.xx.x on Docker ...
Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

ของจริงมีไอคอนเล็กๆ นำหน้าแต่ละบรรทัด ที่สำคัญคือ Done! บรรทัดสุดท้าย ต่อไปเช็กสุขภาพคลัสเตอร์

Terminal
minikube status
ผลลัพธ์ที่ควรเห็น
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
  • type: Control Plane Node นี้เป็น "หอบังคับการ" ด้วย ในคลัสเตอร์จริงมักแยกเครื่องกัน แต่ minikube รวมไว้ที่เดียว
  • host ตู้ Docker ที่เป็น Node เปิดอยู่
  • kubelet ผู้ช่วยประจำ Node ที่คอยเปิดปิด Pod ตามคำสั่ง
  • apiserver ช่องรับคำสั่ง ทุกคำสั่งจาก kubectl วิ่งมาที่นี่
  • kubeconfig ไฟล์ตั้งค่าของ kubectl ชี้มาที่คลัสเตอร์นี้แล้ว

เช็กว่าได้แล้ว: ทุกบรรทัดเป็น Running และบรรทัดสุดท้ายเป็น Configured

คุยกับคลัสเตอร์ผ่าน kubectl

ลองใช้วิทยุครั้งแรก ถามว่าท่าเรือมีเรือกี่ลำ

Terminal
minikube kubectl -- get nodes
ผลลัพธ์ที่ควรเห็น (ประมาณนี้)
NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   2m    v1.xx.x

ครั้งแรก minikube จะโหลด kubectl รุ่นที่เข้ากับคลัสเตอร์มาให้ก่อน ผลบอกว่ามี Node เดียวชื่อ minikube สถานะ Ready คือพร้อมรับงาน

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

minikube ยังมีหน้าเว็บให้ดูภาพรวมด้วย

Terminal
minikube dashboard

เบราว์เซอร์จะเปิดหน้า Kubernetes Dashboard ขึ้นมาเอง ทริกคือเปิดค้างไว้ แล้วพิมพ์คำสั่งต่อใน Terminal หน้าต่างใหม่ จะเห็นของโผล่บนหน้าเว็บทุกครั้งที่สั่ง (อยากปิด dashboard ก็กด Ctrl+C)

สร้างแอปแรกด้วย Deployment

แอปที่ใช้คือ kicbase/echo-server:1.0 เว็บเซิร์ฟเวอร์ตัวจิ๋วที่ทีม minikube ทำไว้สาธิต มันแค่ "สะท้อน" คำขอที่ได้รับกลับมาให้ดู ชื่ออ่านว่า เจ้าของ kicbase / image echo-server / เวอร์ชัน 1.0

Terminal
kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0
ผลลัพธ์ที่ควรเห็น
deployment.apps/hello-minikube created

เท่ากับยื่นใบสั่งงานชื่อ hello-minikube ว่า "ช่วยรัน Pod จาก image นี้" เราไม่ได้บอกจำนวน K8s จึงใช้ค่าเริ่มต้นคือ 1 ตัว มาดูกัน

Terminal
kubectl get pods
ผลลัพธ์ที่ควรเห็น (ประมาณนี้)
NAME                              READY   STATUS    RESTARTS   AGE
hello-minikube-6c5d4b8f7d-x2k8p   1/1     Running   0          40s
  • NAME ชื่อ Deployment ต่อด้วยรหัสสุ่ม 2 ท่อน เพราะ Deployment เดียวอาจมีหลาย Pod ชื่อจึงต้องไม่ซ้ำ (ของคุณจะต่างจากในบทความ)
  • READY container พร้อมกี่ตัวจากทั้งหมด 1/1 คือครบ
  • STATUS ช่วงแรกจะเป็น ContainerCreating (กำลังโหลด image) แล้วเปลี่ยนเป็น Running
  • RESTARTS จำนวนครั้งที่ถูกเริ่มใหม่ ถ้าขึ้นเรื่อยๆ แปลว่าแอปพังซ้ำ
  • AGE อายุของ Pod เดี๋ยวคอลัมน์นี้จะเป็นตัวจับผิดตอนเราลบ Pod

เช็กว่าได้แล้ว: READY เป็น 1/1 และ STATUS เป็น Running ถ้ายังไม่ใช่ รอแล้วสั่งซ้ำ หรือใช้ kubectl get pods -w ให้ตารางอัปเดตเอง (กด Ctrl+C เพื่อออก)

เปิดประตูด้วย Service

Pod ทำงานแล้ว แต่ยังอยู่ข้างในท่าเรือ คนข้างนอกเข้าไม่ได้ ต้องสร้างประตูให้มัน

Terminal
kubectl expose deployment hello-minikube --type=NodePort --port=8080
kubectl get services hello-minikube
ผลลัพธ์ที่ควรเห็น (ประมาณนี้)
service/hello-minikube exposed
NAME             TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort   10.96.52.110   <none>        8080:31234/TCP   1s

--port=8080 คือพอร์ตของประตู ตั้งให้ตรงกับพอร์ตที่แอปข้างในรอรับอยู่ ส่วน --type=NodePort คือให้เปิดช่องบนตัว Node ด้วย ช่อง PORT(S) จึงอ่านว่า พอร์ต 8080 ถูกเปิดออกมาเป็นช่อง 31234 บน Node (เลขอยู่ในช่วง 30000 ถึง 32767 และของคุณจะต่างไป) แทนที่จะประกอบที่อยู่เอง ให้ minikube เปิดให้เลย

Terminal
minikube service hello-minikube

minikube จะขึ้นตาราง URL แล้วเปิดเบราว์เซอร์ให้ หน้าเว็บเป็นข้อความธรรมดาแบบนี้

หน้าเว็บที่ควรเห็น (ตัดมาบางส่วน)
Request served by hello-minikube-6c5d4b8f7d-x2k8p
 
HTTP/1.1 GET /
 
Host: 127.0.0.1:52817

บรรทัดแรกบอกว่า Pod ตัวไหนเป็นคนตอบ ที่เหลือคือคำขอของเบราว์เซอร์ที่แอปสะท้อนกลับมา

ระวัง อย่าเพิ่งปิด Terminal นี้ บน Windows และ Mac คำสั่งนี้ต้องเปิด "อุโมงค์" จากเครื่องเราเข้าไปหา Node และจะบอกให้เปิด Terminal ค้างไว้ ถ้าปิด หน้าเว็บจะเข้าไม่ได้ทันที ใช้เสร็จค่อยกด Ctrl+C ส่วนคำสั่งต่อไปให้พิมพ์ในอีกหน้าต่าง

เช็กว่าได้แล้ว: เบราว์เซอร์ขึ้น Request served by ตามด้วยชื่อ Pod

เพิ่มเป็น 3 ตัวด้วย scale

สมมติคนเข้าเว็บเยอะขึ้น เราแค่แก้ใบสั่งงานจาก 1 เป็น 3 (replicas แปลว่าจำนวนสำเนา)

Terminal
kubectl scale deployment/hello-minikube --replicas=3

รอไม่กี่วินาที แล้วสั่ง kubectl get pods อีกครั้ง

ผลลัพธ์ที่ควรเห็น (ประมาณนี้)
NAME                              READY   STATUS    RESTARTS   AGE
hello-minikube-6c5d4b8f7d-9vqtz   1/1     Running   0          12s
hello-minikube-6c5d4b8f7d-m4wlr   1/1     Running   0          12s
hello-minikube-6c5d4b8f7d-x2k8p   1/1     Running   0          6m

ตัวเดิม (x2k8p อายุ 6 นาที) ยังอยู่ และมีตัวใหม่เพิ่ม 2 ตัว Service จะกระจายคำขอให้ทั้ง 3 ตัวเอง ลองรีเฟรชหน้าเว็บ ชื่อ Pod อาจเปลี่ยน (ถ้าเห็นชื่อเดิมตลอดก็ไม่ได้พัง เบราว์เซอร์แค่ใช้การเชื่อมต่อเดิมซ้ำ)

เช็กว่าได้แล้ว: มี Pod 3 แถว และทุกแถวเป็น Running

ลบ Pod ทิ้ง แล้วดูมันกลับมา

ส่วนที่สนุกที่สุดครับ ก๊อปชื่อ Pod ตัวไหนก็ได้ (ใช้ชื่อในเครื่องคุณ) แล้วลบทิ้ง

Terminal
kubectl delete pod hello-minikube-6c5d4b8f7d-x2k8p
kubectl get pods
ผลลัพธ์ที่ควรเห็น (ประมาณนี้)
pod "hello-minikube-6c5d4b8f7d-x2k8p" deleted
NAME                              READY   STATUS    RESTARTS   AGE
hello-minikube-6c5d4b8f7d-9vqtz   1/1     Running   0          3m
hello-minikube-6c5d4b8f7d-hb7sn   1/1     Running   0          4s
hello-minikube-6c5d4b8f7d-m4wlr   1/1     Running   0          3m

ยังมี 3 ตัวเหมือนเดิม ตัวที่ลบหายไปจริง แต่มี hb7sn โผล่มาแทน ดู AGE แค่ไม่กี่วินาทีก็รู้ว่าเพิ่งเกิด

สามขั้นของการซ่อมตัวเอง: ใบสั่งงานบอกว่าต้องมี 3, Pod หายไปหนึ่งตัว, Kubernetes สร้างตัวใหม่ให้ครบ
ใบสั่งงานบอกว่า 3 ของจริงก็ต้องเป็น 3

นี่คือแนวคิดหัวใจของ Kubernetes คือ desired state (สภาพที่เราต้องการ) กับ actual state (สภาพที่เป็นอยู่จริง) ใบสั่งงานเขียนว่าต้องการ 3 ตัว แล้ว K8s มีตัวคุมที่เทียบสองอย่างนี้วนไปไม่หยุด ของจริงน้อยกว่าก็สร้างเพิ่ม มากกว่าก็ลบออก

เหมือนแอร์ที่ตั้งไว้ 25 องศา เราไม่ได้สั่งให้เป่าแรงหรือเบา แค่บอกอุณหภูมิที่อยากได้ ถ้ามีคนเปิดประตูจนห้องร้อน แอร์ก็เร่งทำงานเองจนกลับมาที่ 25

ตัวที่คอยนับ Pod ให้ Deployment ชื่อ ReplicaSet ชื่อของมันคือท่อนกลางในชื่อ Pod และเราเห็นตัวเลขทั้งสองฝั่งได้ตรงๆ

Terminal
kubectl get replicasets
ผลลัพธ์ที่ควรเห็น (ประมาณนี้)
NAME                        DESIRED   CURRENT   READY   AGE
hello-minikube-6c5d4b8f7d   3         3         3       10m

DESIRED คือจำนวนที่ใบสั่งงานต้องการ CURRENT คือที่มีอยู่จริง และ READY คือที่พร้อมรับงานแล้ว

ลบ Pod ไม่ได้แปลว่าลบแอป ถ้าอยากให้แอปหายจริง ต้องลบที่ใบสั่งงาน คือลบ Deployment ไม่อย่างนั้นลบ Pod กี่ครั้งก็ถูกสร้างใหม่ทุกครั้ง ข้อนี้คนเพิ่งเริ่มใช้ K8s งงกันบ่อยมาก

แถม ดู Deployment ในรูป YAML

ใบสั่งงานที่เราสร้างด้วย kubectl create ถูกเก็บเป็นเอกสารชิ้นหนึ่ง เราสั่งให้พิมพ์ออกมาดูได้โดยไม่สร้างจริง

Terminal
kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0 --dry-run=client -o yaml

--dry-run=client คือลองทำแค่ในเครื่องเรา ไม่ส่งไปที่คลัสเตอร์ ส่วน -o yaml คือขอผลเป็น YAML รูปแบบข้อมูลที่ใช้การย่อหน้าบอกว่าอะไรอยู่ใต้อะไร

ผลลัพธ์ (ตัดบรรทัดที่ว่างเปล่าออก)
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hello-minikube
  name: hello-minikube
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-minikube
  template:
    metadata:
      labels:
        app: hello-minikube
    spec:
      containers:
      - image: kicbase/echo-server:1.0
        name: echo-server

ผลจริงมีบรรทัดที่ไม่มีค่าแทรกอยู่ เช่น creationTimestamp: null หรือ status: {} ตัดออกได้ มาดู 3 ส่วนที่ไฮไลต์ไว้

  • replicas อยากได้ Pod กี่ตัว เป็น 1 เพราะตอน create เราไม่ได้ระบุ คำสั่ง kubectl scale เมื่อกี้ก็คือการแก้เลขนี้
  • selector บอกว่า Pod แบบไหนนับเป็นของใบสั่งงานนี้ คือ Pod ที่ติดป้าย (label) app: hello-minikube เหมือนนายท่านับตู้จากสติกเกอร์
  • template แม่แบบของ Pod ที่จะสร้าง ติดป้ายอะไร ใช้ image ไหน ป้ายตรงนี้ต้องตรงกับ selector ไม่อย่างนั้น K8s จะไม่รับใบสั่งงาน เพราะนับตู้ของตัวเองไม่ได้

ในงานจริง ทีมจะเก็บไฟล์ YAML ไว้ใน Git แล้วสั่ง kubectl apply -f ชื่อไฟล์.yaml ให้คลัสเตอร์ปรับตัวให้ตรงกับไฟล์ เรียกว่าแบบ declarative คือเขียนผลที่อยากได้ แทนการสั่งทีละขั้น

เจอปัญหา ลองเช็กตามนี้

อาการสาเหตุวิธีแก้
minikube start error เรื่อง DockerDocker Desktop ไม่ได้เปิดเปิด Docker Desktop แล้วสั่งใหม่
minikube start พังซ้ำๆคลัสเตอร์เก่าเสียค้างminikube delete แล้ว start ใหม่
ไม่รู้จักคำสั่ง minikubeTerminal ยังไม่เห็น PATH ใหม่ปิดแล้วเปิด Terminal ใหม่
ไม่รู้จักคำสั่ง kubectlเครื่องไม่มี kubectlเติม minikube kubectl -- นำหน้า
Pod ค้าง ContainerCreatingยังโหลด image ไม่เสร็จรอ 1–2 นาที แล้วดู events
Pod ขึ้น ErrImagePullชื่อ image ผิด หรือเน็ตหลุดเช็กชื่อ image ทุกตัวอักษร

ไม่แน่ใจว่าเกิดอะไรขึ้น ให้ดูบันทึกเหตุการณ์

Terminal
kubectl get events
ผลลัพธ์ที่ควรเห็น (ตัดมาบางส่วน)
LAST SEEN   TYPE     REASON    OBJECT                                MESSAGE
44s         Normal   Pulling   pod/hello-minikube-6c5d4b8f7d-x2k8p   Pulling image "kicbase/echo-server:1.0"

เห็น Pulling แต่ยังไม่มี Pulled แปลว่ายังโหลดอยู่ ถ้า TYPE เป็น Warning ให้อ่าน MESSAGE ซึ่งมักบอกสาเหตุตรงๆ ส่วน minikube delete คือไม้ตาย ลบทั้งคลัสเตอร์แล้วเริ่มใหม่

เก็บกวาดเมื่อเลิกใช้

คลัสเตอร์ที่เปิดทิ้งไว้กิน RAM และ CPU ตลอด ใช้เสร็จให้รื้อประตู ยกเลิกใบสั่งงาน (Pod ทั้ง 3 ตัวถูกลบตามไปเอง) แล้วพักท่าเรือ

Terminal
kubectl delete service hello-minikube
kubectl delete deployment hello-minikube
minikube stop

minikube stop คือพักไว้ ของยังอยู่ครบ วันหลังสั่ง minikube start ก็ทำต่อได้ ถ้าเลิกใช้จริงและอยากคืนพื้นที่ดิสก์ ให้ลบทุกคลัสเตอร์ทิ้ง

Terminal
minikube delete --all

เช็กว่าได้แล้ว: minikube status บอกว่าไม่พบคลัสเตอร์ หรือทุกบรรทัดเป็น Stopped

ไปต่อ

สรุป

  • Docker แพ็กแอปลงตู้ ส่วน Kubernetes เป็นนายท่าที่คุมตู้จำนวนมากให้เป็นไปตามที่สั่ง
  • Cluster คือท่าเรือ Node คือเรือ Pod คือตู้ Deployment คือใบสั่งงาน Service คือประตู kubectl คือวิทยุ
  • minikube start เปิดคลัสเตอร์ create deployment สร้างแอป expose สร้างประตู และ minikube service เปิดในเบราว์เซอร์
  • kubectl scale --replicas=3 เพิ่ม Pod และ Pod ที่ถูกลบกลับมาเอง เพราะ K8s รักษา desired state ไว้ตลอด
  • เลิกใช้แล้วลบ Service กับ Deployment แล้ว minikube stop หรือ minikube delete --all

พร้อมแล้วก็ไปทำ Quiz ท้ายบทด้านล่างเพื่อรับ XP ได้เลยครับ

Quiz ท้ายบท

5 ข้อ · ข้อละ 10 XP

ทดสอบความเข้าใจเรื่อง Kubernetes ตอบถูกข้อละ 10 XP

  • 5 ข้อ
  • ไม่จับเวลา
  • เฉลยทันทีทุกข้อ