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 ก่อนเริ่ม

#สิ่งที่ต้องเตรียม

  1. ติดตั้งและเปิด Docker Desktop บน Windows, macOS หรือ Linux
  2. ให้ Docker Desktop ทำงานในโหมด Linux containers; บน Windows โหมด Windows containers จะไม่แสดงแท็บ Kubernetes
  3. เตรียมพื้นที่และหน่วยความจำให้เพียงพอ และต่ออินเทอร์เน็ตสำหรับดาวน์โหลด image ครั้งแรก
  4. เปิด Terminal, PowerShell หรือ Command Prompt เพื่อใช้ kubectl

Docker Desktop บน Linux ไม่ติดตั้ง kubectl ให้โดยอัตโนมัติ ต้องติดตั้งแยกตามคู่มือ Kubernetes ส่วน macOS และ Windows มี kubectl มาพร้อม Docker Desktop ตามตำแหน่งติดตั้งที่เอกสาร Docker ระบุไว้

#1. เปิด Kubernetes cluster

  1. เปิด Docker Desktop Dashboard แล้วเข้าเมนู Kubernetes
  2. กด Create cluster
  3. เลือก kind และตั้งจำนวน node เป็น 1 หากมีตัวเลือกนี้
  4. กด 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 ลบทรัพยากรในเวิร์กช็อป

#แหล่งอ้างอิง