- Kubernetes กับ Docker Desktop ทำงานร่วมกันอย่างไร
- สิ่งที่ต้องเตรียม
- 1. เปิด Kubernetes cluster
- 2. ตรวจสอบ cluster และ context
- 3. สร้างไฟล์ Deployment และ Service
- 4. Deploy และตรวจสอบ
- 5. เปิดเว็บบนเครื่อง
- 6. ทดลอง scale และดูผล
- 7. ดู log และตรวจปัญหา
- 8. เก็บกวาดหลังทดลอง
- เมื่อจะใช้ image ที่ build เอง
- สรุปคำสั่งที่ใช้บ่อย
- แหล่งอ้างอิง
Docker Desktop มี Kubernetes cluster ในตัว จึงเหมาะสำหรับฝึกใช้ kubectl, ทดลอง Deployment และ Service ตลอดจนทดสอบไฟล์ manifest ก่อนนำไปใช้ในสภาพแวดล้อมอื่น บทความนี้พาเปิด cluster, deploy เว็บ NGINX, เปิดดูผ่านเบราว์เซอร์, เพิ่มจำนวน Pod และแก้ปัญหาที่พบได้บ่อย
#Kubernetes กับ Docker Desktop ทำงานร่วมกันอย่างไร
- Docker image คือแพ็กเกจของแอปและสิ่งที่จำเป็นต่อการทำงาน
- Pod คือหน่วยที่ Kubernetes ใช้รัน container หนึ่งตัวหรือหลายตัวร่วมกัน
- Deployment กำหนด image จำนวน Pod และวิธีรักษาสถานะที่ต้องการ
- Service ให้จุดเชื่อมต่อที่คงที่สำหรับ Pod ซึ่งอาจถูกสร้างใหม่
kubectlคือเครื่องมือสั่งการ Kubernetes cluster ผ่าน context ที่กำลังเลือก
Docker Desktop สามารถสร้าง cluster ด้วย kind (รองรับหลาย node และเลือกเวอร์ชัน Kubernetes ได้) หรือ kubeadm (node เดียวและเวอร์ชันถูกกำหนดโดย Docker Desktop) สำหรับเวิร์กช็อปนี้เลือก kind แล้วตั้งหนึ่ง node เพื่อประหยัดทรัพยากร หาก UI หรือรุ่นที่ติดตั้งแสดงตัวเลือกต่างออกไป ให้ใช้ cluster ที่ Docker Desktop สร้างสำเร็จและตรวจสอบ context ก่อนเริ่ม
#สิ่งที่ต้องเตรียม
- ติดตั้งและเปิด Docker Desktop บน Windows, macOS หรือ Linux
- ให้ Docker Desktop ทำงานในโหมด Linux containers; บน Windows โหมด Windows containers จะไม่แสดงแท็บ Kubernetes
- เตรียมพื้นที่และหน่วยความจำให้เพียงพอ และต่ออินเทอร์เน็ตสำหรับดาวน์โหลด image ครั้งแรก
- เปิด Terminal, PowerShell หรือ Command Prompt เพื่อใช้
kubectl
Docker Desktop บน Linux ไม่ติดตั้ง
kubectlให้โดยอัตโนมัติ ต้องติดตั้งแยกตามคู่มือ Kubernetes ส่วน macOS และ Windows มีkubectlมาพร้อม Docker Desktop ตามตำแหน่งติดตั้งที่เอกสาร Docker ระบุไว้
#1. เปิด Kubernetes cluster
- เปิด Docker Desktop Dashboard แล้วเข้าเมนู Kubernetes
- กด Create cluster
- เลือก kind และตั้งจำนวน node เป็น 1 หากมีตัวเลือกนี้
- กด Create แล้วรอจนแสดงสถานะ cluster พร้อมใช้งาน
ใน Docker Desktop บางหน้าจออาจมีทางเข้า Settings → Kubernetes สำหรับการตั้งค่าเพิ่มเติม การเปลี่ยนวิธี provision หรือ reset cluster อาจลบทรัพยากรที่เคยสร้าง จึงควรบันทึก manifest ไว้ก่อน
#2. ตรวจสอบ cluster และ context
kubectl version --client
kubectl config get-contexts
kubectl config current-context
kubectl get nodes
ผลลัพธ์ของ kubectl get nodes ควรมีอย่างน้อยหนึ่ง node ที่มีสถานะ Ready หาก context ไม่ใช่ docker-desktop ให้สลับก่อน deploy:
kubectl config use-context docker-desktop
kubectl get nodes
docker contextใช้เลือก Docker Engine ส่วนkubectl config use-contextใช้เลือก Kubernetes cluster เป็นคนละ context กัน ตรวจชื่อ cluster ก่อนใช้คำสั่งที่สร้างหรือลบทรัพยากร
#3. สร้างไฟล์ Deployment และ Service
สร้างไฟล์ชื่อ nginx-demo.yaml แล้ววางเนื้อหาต่อไปนี้:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
labels:
app: nginx-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- name: nginx
image: nginx:stable-alpine
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 2
periodSeconds: 5
resources:
requests:
cpu: 25m
memory: 32Mi
limits:
cpu: 250m
memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
name: nginx-demo
labels:
app: nginx-demo
spec:
type: ClusterIP
selector:
app: nginx-demo
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
selector ของ Service ต้องตรงกับ label ของ Pod (app: nginx-demo) ส่วน ClusterIP ให้เข้าถึงภายใน cluster ก่อน แล้วใช้ port forwarding เพื่อเปิดเว็บบนเครื่องของเรา nginx:stable-alpine เป็น tag ที่เปลี่ยนเนื้อหาได้ตามเวลา; งานที่ต้องทำซ้ำอย่างแม่นยำควรตรึงเวอร์ชันหรือ image digest
#4. Deploy และตรวจสอบ
รันคำสั่งในโฟลเดอร์ที่มี nginx-demo.yaml:
kubectl apply -f nginx-demo.yaml
kubectl rollout status deployment/nginx-demo --timeout=120s
kubectl get deployments,pods,services -l app=nginx-demo
ตรวจ Service และรายละเอียด Deployment เพิ่มเติมได้ด้วย:
kubectl get service nginx-demo
kubectl describe deployment nginx-demo
เมื่อ Deployment พร้อม ควรเห็น 2/2 Pod พร้อมใช้งาน ทั้งนี้จำนวน node อาจเป็นหนึ่งหรือหลาย node ตามค่าที่เลือกตอนสร้าง cluster
#5. เปิดเว็บบนเครื่อง
kubectl port-forward service/nginx-demo 8080:80
เปิด http://localhost:8080 ในเบราว์เซอร์ จะพบหน้าเริ่มต้นของ NGINX คำสั่ง port-forward ต้องเปิดค้างไว้ใน Terminal นั้น กด Ctrl+C เพื่อหยุดการส่งต่อพอร์ต หาก 8080 ถูกใช้งานแล้ว ให้เปลี่ยนเป็น 8081:80 และเปิด http://localhost:8081
#6. ทดลอง scale และดูผล
เปิดอีก Terminal แล้วรัน:
kubectl scale deployment/nginx-demo --replicas=3
kubectl rollout status deployment/nginx-demo --timeout=120s
kubectl get pods -l app=nginx-demo -o wide
kubectl get endpointslice -l kubernetes.io/service-name=nginx-demo
จะเห็น Pod 3 ตัวเมื่อทุกตัวพร้อมใช้งาน การ scale ด้วยคำสั่งเปลี่ยนสถานะจริงใน cluster แต่ไฟล์ nginx-demo.yaml ยังคงระบุ replicas: 2 หากมีการปรับไฟล์หรือใช้เครื่องมือ reconcile ตามค่าในไฟล์ จำนวน Pod อาจถูกตั้งกลับเป็น 2 ให้แก้ค่าในไฟล์เป็น 3 ด้วยเมื่อต้องการเก็บการเปลี่ยนแปลง
ทดลองกลับเป็นสองตัว:
kubectl scale deployment/nginx-demo --replicas=2
kubectl rollout status deployment/nginx-demo --timeout=120s
#7. ดู log และตรวจปัญหา
kubectl get pods -l app=nginx-demo
kubectl logs deployment/nginx-demo --tail=50
kubectl describe deployment nginx-demo
kubectl get events --sort-by=.lastTimestamp
หากหลาย Pod มี log ต่างกัน ให้ระบุชื่อ Pod ที่ได้จาก kubectl get pods แล้วใช้ kubectl logs <ชื่อ-pod> สำหรับการตรวจ image pull หรือ scheduling ให้ดู kubectl describe pod <ชื่อ-pod> และส่วน Events
| อาการ | ตรวจสอบและแก้ไข |
|---|---|
kubectl: command not found |
ติดตั้ง kubectl (จำเป็นบน Docker Desktop for Linux) หรือเช็ก PATH ของเครื่อง |
connection refused / ติดต่อ API server ไม่ได้ |
ตรวจว่า Docker Desktop และ cluster ทำงาน; เช็ก kubectl config current-context และสลับเป็น docker-desktop |
Pod ค้าง Pending |
ดู kubectl describe pod และทรัพยากร CPU/RAM ของ Docker Desktop |
ImagePullBackOff |
ตรวจชื่อ image, การเชื่อมต่อ registry และรายละเอียดใน Events |
| เบราว์เซอร์เข้าไม่ได้ | ตรวจว่า Pod Ready, Service มี selector ตรง Pod, คำสั่ง port-forward ยังเปิดอยู่ และพอร์ต 8080 ไม่ถูกใช้ |
#8. เก็บกวาดหลังทดลอง
kubectl delete -f nginx-demo.yaml
kubectl get deployments,pods,services -l app=nginx-demo
หากต้องการหยุด cluster ให้กด Stop ในหน้า Kubernetes ของ Docker Desktop ระวังคำสั่ง Reset cluster เพราะจะลบทรัพยากร Kubernetes ภายใน cluster นั้น
#เมื่อจะใช้ image ที่ build เอง
docker build แล้ว kubectl apply ทันทีอาจใช้ไม่ได้เสมอไป: Docker Desktop แบบ kind ใช้ containerd image store ส่วน kubeadm ใช้ Docker image store ได้ด้วย จึงควรตรวจวิธี provision และ image store ก่อน สำหรับเวิร์กช็อปที่ต้องการผลแน่นอน ให้ tag และ push image ไปยัง registry ที่ cluster เข้าถึงได้ แล้วระบุชื่อ registry และ tag ใน manifest; ถ้า registry เป็น private ต้องเตรียมการยืนยันตัวตน เช่น imagePullSecrets อย่าใส่รหัสผ่านใน YAML ตรง ๆ
#สรุปคำสั่งที่ใช้บ่อย
| คำสั่ง | หน้าที่ |
|---|---|
kubectl config current-context |
ดู cluster ปัจจุบัน |
kubectl get nodes |
ดู node และความพร้อม |
kubectl apply -f nginx-demo.yaml |
สร้างหรือปรับทรัพยากรตามไฟล์ |
kubectl get pods -l app=nginx-demo |
ดู Pod ของแอป |
kubectl rollout status deployment/nginx-demo |
รอ Deployment พร้อม |
kubectl port-forward service/nginx-demo 8080:80 |
เปิดเว็บจากเครื่อง local |
kubectl scale deployment/nginx-demo --replicas=3 |
เปลี่ยนจำนวน Pod |
kubectl delete -f nginx-demo.yaml |
ลบทรัพยากรในเวิร์กช็อป |