ข้ามไปเนื้อหาหลัก
คอนเทนเนอร์· ~25 นาที

ทดสอบ End-to-End, Debug ให้เป็น และโจทย์ต่อยอด

ไล่เช็คทั้ง pipeline อย่างเป็นระบบ ฝึกแก้ปัญหาที่เจอบ่อย และรับโจทย์ท้าทายขั้นถัดไป

ระบบเสร็จแล้ว — บทนี้ฝึกทักษะที่แพงที่สุดในสนามจริง: ไล่หาว่าพังตรงไหนอย่างเป็นระบบ เมื่อ pipeline มีหลายชั้น (Browser → Ingress → API → MinIO → Job → MinIO → Browser) ห้ามเดามั่ว ให้ไล่ตามทิศทางข้อมูลทีละข้อต่อ

# 1) ของพื้นฐานยังอยู่ครบไหม
kubectl get pods,svc,jobs -n video
kubectl get ingress -n video

# 2) ชั้นเว็บ: Ingress ตอบไหม
curl -i http://localhost:8080/healthz          # ผ่าน Ingress → API

# 3) ชั้น API: อัปโหลดได้ไหม + log ว่าอะไร
curl -F "video=@sample.mp4" http://localhost:8080/api/upload
kubectl logs deploy/video-api --tail=20

# 4) ชั้น Job: เกิดไหม จบไหม ตายเพราะอะไร
kubectl get jobs
kubectl describe job transcode-xxxx            # ดู events ท้ายจอ
kubectl logs job/transcode-xxxx

# 5) ชั้น storage: ไฟล์ถึงจริงไหม
kubectl run mc --rm -it --image=minio/mc --restart=Never --command -- /bin/sh
#   mc alias set store http://minio:9000 admin password123 && mc ls -r store/vod

# 6) ชั้นผู้ชม: โหลด playlist ได้ไหม
curl -i http://localhost:8080/vod/<videoId>/index.m3u8
💻 checklist ไล่ทั้ง pipeline — จำลำดับนี้ไว้ใช้กับทุกระบบ

คู่มืออาการยอดฮิต

  • `ErrImageNeverPull` / `ImagePullBackOff` → image ไม่อยู่ใน kind: kind load docker-image <ชื่อ> --name video แล้วเช็ค imagePullPolicy: IfNotPresent
  • `CrashLoopBackOff`kubectl logs <pod> --previous ดู log รอบที่ตาย — อย่าลืม --previous เพราะรอบปัจจุบันอาจยังไม่ทัน error
  • `OOMKilled` (ดูใน kubectl describe pod) → FFmpeg ใช้ RAM เกิน limits — เพิ่ม limits.memory หรือลดความละเอียดวิดีโอ
  • API ขึ้น `403 Forbidden` ตอนสร้าง Job → RBAC: เช็คด้วย kubectl auth can-i create jobs --as=system:serviceaccount:video:video-api -n video
  • Job สำเร็จแต่หน้าเว็บไม่ขึ้นวิดีโอ → เช็ค mc ls ว่าไฟล์อยู่จริง แล้วเช็คว่า endpoint /api/videos คืนค่าอะไร — แยกให้ออกว่าปัญหาอยู่ฝั่งข้อมูลหรือฝั่งแสดงผล
  • Pod `Pending` ค้างkubectl describe pod ดู events: มักเป็น resource requests สูงเกิน node หรือ PVC ยัง bind ไม่ได้

ทดลองความอึดของระบบ (สนุกมาก)

for i in 1 2 3 4 5; do
  curl -s -F "video=@sample.mp4" http://localhost:8080/api/upload &
done; wait

kubectl get jobs -w
# Job 5 ตัวเกิดพร้อมกัน — บางตัวรันทันที บางตัวรอ เพราะ CPU requests
# รวมกันเกิน node → scheduler จัดคิวให้อัตโนมัติ นี่แหละพลังของ K8s!

# ลองฆ่า Pod ระหว่างแปลง แล้วดู Job สร้างใหม่เอง (backoffLimit)
kubectl delete pod -l app=transcoder --field-selector=status.phase=Running
💻 อัปโหลดรัว ๆ แล้วดู K8s จัดคิวให้เอง

โจทย์ต่อยอด (เรียงจากง่ายไปยาก)

  1. Status endpoint — เพิ่ม GET /api/videos/:id/status ให้อ่านสถานะ Job (batchApi.readNamespacedJob) แล้วหน้าเว็บโชว์ "กำลังแปลง / เสร็จแล้ว / ล้มเหลว" แทนให้คนกดรีเฟรชเดา ๆ
  2. Adaptive bitrate — แก้ transcode.sh ให้ออก 720p + 480p สองชุด พร้อม master playlist (-var_stream_map) ให้ player เลือกคุณภาพตามเน็ตผู้ชมเอง — นี่คือฟีเจอร์เรือธงของ HLS
  3. Thumbnail — ให้ Job สร้างภาพปกด้วย ffmpeg (-ss 00:00:01 -vframes 1 thumb.jpg) แล้วหน้าเว็บโชว์แทนชื่อ videoId
  4. CI/CD — เขียน GitHub Actions ให้ build image + helm upgrade อัตโนมัติทุกครั้งที่ merge (ต่อกับแนวคิด GitOps ใน Module 7 และ Helm chart ที่กำลังจะทำในสองบทถัดไป)
  5. Monitoring — ติดตั้ง Prometheus + Grafana แล้วทำ dashboard: จำนวน Job ที่รัน/สำเร็จ/ล้มเหลว และ CPU ตอน transcode

สรุป Key Takeaways

  • Debug หลายชั้นให้ไล่ตามทิศทางข้อมูลทีละข้อต่อ ห้ามเดามั่ว
  • ท่าไม้ตาย: kubectl get → describe (ดู events) → logs (--previous ถ้า crash)
  • K8s จัดคิว Job ตาม resource requests และ retry ให้เองเมื่องานตาย
  • ต่อยอดได้อีกเยอะ: ABR, thumbnail, CI/CD, monitoring — และ Helm ในสองบทถัดไป
อ่านจบแล้วอย่าลืมทำเครื่องหมาย