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

