# Pre-test / Post-test — Docker & Kubernetes Internal Training

**วิธีใช้:** ใช้ชุดคำถาม**เดียวกัน**ทั้งก่อนเรียนและหลังเรียน เพื่อเทียบคะแนนว่าเพิ่มขึ้นเท่าไหร่ (learning gain)

| | เมื่อไหร่ | เวลา | หมายเหตุ |
|---|---|---|---|
| **Pre-test** | ก่อนเริ่ม Day 1 | 15 นาที | บอกผู้เรียนว่าไม่มีผลต่อการประเมินงาน ตอบไม่ได้ไม่เป็นไร |
| **Post-test** | ท้าย Day 2 | 15 นาที | ข้อสอบชุดเดิม + เพิ่มข้อเขียน |

**คะแนนเต็ม:** 20 คะแนน (ช้อยส์ข้อละ 1 คะแนน)

**เกณฑ์ที่แนะนำสำหรับ HR**

| ผลลัพธ์ | เกณฑ์ |
|---|---|
| ผ่าน | Post-test ≥ 14/20 (70%) |
| ถือว่าคอร์สได้ผล | คะแนนเฉลี่ยทั้งกลุ่มเพิ่มขึ้น ≥ 30% จาก pre-test |
| ควรติดตามเพิ่ม | คนที่ post-test < 12/20 → ให้ทบทวน checklist และจับคู่กับ buddy 2 สัปดาห์ |

---

## ส่วนที่ 1 — ข้อสอบช้อยส์ 20 ข้อ

> เฉลยอยู่ท้ายเอกสาร · เวอร์ชันสำหรับแจกผู้เรียนให้ลบส่วนเฉลยออกก่อน

### Docker (ข้อ 1–10)

**1. Container ต่างจาก Virtual Machine อย่างไร**

- A. Container มีระบบปฏิบัติการเต็มตัวของตัวเอง จึงปลอดภัยกว่า
- B. Container ใช้ระบบของเครื่องแม่ร่วมกัน จึงเบากว่าและสตาร์ทเร็วกว่า
- C. Container รันได้เฉพาะบน Windows เท่านั้น
- D. ไม่ต่างกัน เป็นคำเรียกอย่างเดียวกัน

**2. ลูกค้าแจ้งว่า service หายไป แต่รัน `docker ps` แล้วไม่เห็น container ตัวนั้นเลย ควรทำอะไรต่อ**

- A. แจ้งลูกค้าว่า container ถูกลบไปแล้ว
- B. รัน `docker ps -a` เพื่อดู container ที่หยุดทำงานไปแล้วด้วย
- C. รีสตาร์ท Docker ทั้งตัว
- D. สร้าง container ใหม่ทันที

**3. เห็นสถานะ `Exited (137)` แปลว่าอะไร**

- A. แอปทำงานจบตามปกติ
- B. ไฟล์ config หาย
- C. container ถูกฆ่าเพราะใช้หน่วยความจำเกินที่กำหนด (OOM)
- D. เครือข่ายมีปัญหา

**4. ต้องการดู log ล่าสุด 100 บรรทัดพร้อมเวลาของ container ชื่อ `my-app` ต้องใช้คำสั่งใด**

- A. `docker logs --tail 100 -t my-app`
- B. `docker ps -a my-app`
- C. `docker inspect my-app --logs`
- D. `docker exec my-app logs`

**5. เจอ container ที่มีปัญหา สิ่งที่ควรทำ*ก่อน*กด restart คืออะไร**

- A. ลบ volume ทิ้งก่อนเพื่อเริ่มใหม่
- B. เก็บ log ไว้ก่อน เพราะ restart แล้วหลักฐานจะหาย
- C. แจ้งลูกค้าว่าแก้ไขเรียบร้อยแล้ว
- D. เปลี่ยน image tag เป็น latest

**6. ในไฟล์ compose เขียนว่า `ports: ["8080:3000"]` หมายความว่าอย่างไร**

- A. เข้าใช้งานจากเครื่องแม่ที่พอร์ต 8080 แล้วส่งต่อไปพอร์ต 3000 ในคอนเทนเนอร์
- B. เข้าใช้งานที่พอร์ต 3000 แล้วส่งต่อไป 8080
- C. เปิดพอร์ต 8080 ถึง 3000 ทั้งช่วง
- D. จำกัดให้ใช้ได้เฉพาะพอร์ต 3000 เท่านั้น

**7. ใน Docker Compose service `api` ต้องการต่อกับ service `db` ควรตั้งค่า host เป็นอะไร**

- A. `localhost`
- B. `127.0.0.1`
- C. `db` (ชื่อ service)
- D. IP ของเครื่อง server

**8. คำสั่งใดอันตรายที่สุด และไม่ควรใช้บนเครื่องลูกค้า**

- A. `docker compose ps`
- B. `docker compose logs -f`
- C. `docker compose restart`
- D. `docker compose down -v`

**9. แก้ค่า environment ในไฟล์ `docker-compose.yml` แล้ว ต้องทำอย่างไรให้มีผล**

- A. `docker compose restart` ก็พอ
- B. `docker compose up -d` ใหม่
- C. ไม่ต้องทำอะไร มีผลทันที
- D. ต้องลบ container ทิ้งทั้งหมดก่อนเสมอ

**10. ตอน pull image แล้วขึ้น `unauthorized` สาเหตุที่พบบ่อยที่สุดคืออะไร**

- A. ดิสก์เต็ม
- B. ยังไม่ได้ login เข้า registry หรือไม่มีสิทธิ์เข้าถึง image นั้น
- C. Docker เวอร์ชันเก่าเกินไป
- D. ชื่อ container ซ้ำกับตัวเดิม

### Kubernetes & Rancher (ข้อ 11–20)

**11. Pod คืออะไร**

- A. เครื่อง server หนึ่งเครื่องใน cluster
- B. หน่วยเล็กที่สุดที่ใช้รันแอป โดยปกติมี container 1 ตัวอยู่ข้างใน
- C. ไฟล์ตั้งค่าของ Kubernetes
- D. ระบบเก็บข้อมูลถาวร

**12. ต้องการรีสตาร์ททั้ง service ควรทำที่ระดับไหน**

- A. ลบ pod ทีละตัวด้วยมือ
- B. รีสตาร์ท node ที่ pod นั้นอยู่
- C. สั่ง Redeploy / rollout restart ที่ระดับ Deployment (Workload)
- D. รีสตาร์ททั้ง cluster

**13. เห็น pod สถานะ `Running` แต่คอลัมน์ READY เป็น `0/1` แปลว่าอะไร**

- A. ทุกอย่างปกติ ใช้งานได้แล้ว
- B. container รันอยู่ แต่ยังไม่พร้อมรับ traffic
- C. pod กำลังจะถูกลบ
- D. pod ใช้ CPU เกินกำหนด

**14. เจอ pod สถานะ `CrashLoopBackOff` ควรดู log แบบไหนจึงจะเห็นสาเหตุ**

- A. log ปกติของรอบปัจจุบัน
- B. log ของรอบก่อนหน้า (`--previous` หรือปุ่ม Previous ใน Rancher)
- C. log ของ node
- D. ไม่ต้องดู log ให้ลบ pod ทิ้งเลย

**15. เจอ pod สถานะ `ImagePullBackOff` ควรเริ่มดูจากที่ไหน**

- A. Logs ของ pod
- B. Events ของ pod เพราะ container ยังไม่เริ่มรัน จึงยังไม่มี log
- C. `docker ps` บนเครื่องตัวเอง
- D. ไฟล์ docker-compose.yml

**16. Pod ทุกตัวสถานะปกติ แต่ลูกค้าเข้าเว็บแล้วเจอ error 502 ควรสงสัยจุดใดก่อน**

- A. เครื่องลูกค้าเอง
- B. Service หรือ Ingress ที่นำ traffic เข้ามาหา pod
- C. Docker Compose
- D. Secret หมดอายุ

**17. หา workload ที่ลูกค้าแจ้งไม่เจอใน Rancher สาเหตุที่พบบ่อยที่สุดคืออะไร**

- A. workload ถูกลบไปแล้วแน่นอน
- B. เลือก cluster หรือ namespace ผิด
- C. Rancher ล่ม
- D. ต้องใช้ kubectl เท่านั้นถึงจะเห็น

**18. ข้อใดถูกต้องเกี่ยวกับ Secret ใน Kubernetes**

- A. เข้ารหัสอย่างแข็งแรง เปิดดูและแชร์ได้ปลอดภัย
- B. เป็นเพียง base64 ซึ่งถอดกลับได้ จึงห้าม screenshot หรือแปะค่าลงใน ticket
- C. ใช้เก็บ log ของระบบ
- D. เหมือนกับ ConfigMap ทุกประการ

**19. พบว่ามีหลาย pod ขึ้นสถานะ `Pending` พร้อมกันในหลาย namespace ควรทำอย่างไร**

- A. ไล่ลบ pod ทีละตัว
- B. รอสักครู่แล้วแจ้งลูกค้าว่าปกติ
- C. escalate ทันที เพราะมักเป็นปัญหาระดับ cluster เช่น ทรัพยากร node ไม่พอ
- D. เปลี่ยน image tag ใหม่

**20. ข้อใดคือสิ่งที่ทำเองได้โดยไม่ต้องขออนุมัติ ตามหลัก "อ่านได้เสมอ เขียนต้องมีคนอนุมัติ"**

- A. ดู pod status, logs, events และ describe
- B. แก้ค่าใน ConfigMap ของ production
- C. rollback deployment กลับเวอร์ชันเดิม
- D. ลบ volume ที่คิดว่าไม่ได้ใช้แล้ว

---

## ส่วนที่ 2 — ข้อเขียน (ใช้เฉพาะ Post-test, ไม่คิดคะแนนรวม)

ใช้ประเมินความเข้าใจเชิงลึกและการนำไปใช้จริง ให้ HR/ผู้สอนอ่านประกอบ

1. อธิบายด้วยภาษาของตัวเองว่า **container คืออะไร** เหมือนกำลังอธิบายให้เพื่อนร่วมงานที่ไม่เคยรู้จักฟัง
2. ลูกค้าแจ้งว่า "เข้าระบบไม่ได้เลย" เขียนขั้นตอนที่จะไล่ตรวจสอบ **ตามลำดับ 5 ขั้น**
3. เวลาส่งเคสต่อให้ทีม dev **ต้องแนบข้อมูลอะไรบ้าง** (อย่างน้อย 4 อย่าง)

**เกณฑ์ให้คะแนนข้อเขียนแบบคร่าวๆ**

| ระดับ | ลักษณะคำตอบ |
|---|---|
| ดีมาก | อธิบายเป็นภาษาตัวเองได้ ระบุลำดับถูก และยกตัวอย่างจากงานจริงได้ |
| พอใช้ | ตอบถูกแต่ยังเป็นการท่องจำ ไม่มีตัวอย่างประกอบ |
| ต้องทบทวน | ตอบผิดลำดับ หรือระบุสิ่งที่ทำแล้วเสี่ยงต่อระบบลูกค้า |

---

## ส่วนที่ 3 — ประเมินความมั่นใจตนเอง (ทำทั้ง Pre และ Post)

ให้คะแนน 1–5 (1 = ไม่มั่นใจเลย, 5 = มั่นใจมาก) — ใช้เทียบ before/after ได้ตรงไปตรงมาที่สุด

1. ฉันเข้าใจว่า container และ Docker คืออะไร
2. ฉันสามารถดู log ของ service ที่มีปัญหาได้ด้วยตัวเอง
3. ฉันอ่านสถานะของ container / pod แล้วบอกได้ว่าเกิดอะไรขึ้น
4. ฉันใช้ Rancher หาข้อมูลของ workload ที่มีปัญหาได้
5. ฉันรู้ว่าเคสแบบไหนแก้เองได้ และเคสแบบไหนต้องส่งต่อ

---

## เฉลย

| ข้อ | เฉลย | หัวข้อที่เกี่ยวข้อง |
|---|---|---|
| 1 | **B** | Day 1 — Container vs VM |
| 2 | **B** | Day 1 — `docker ps -a` |
| 3 | **C** | Day 1 — อ่าน exit code |
| 4 | **A** | Day 1 — `docker logs` |
| 5 | **B** | Day 1 — เก็บ log ก่อน restart |
| 6 | **A** | Day 1 — port mapping ซ้าย:ขวา |
| 7 | **C** | Day 1 — เรียกกันด้วยชื่อ service |
| 8 | **D** | Day 1 — `down -v` ลบ volume ถาวร |
| 9 | **B** | Day 1 — แก้ไฟล์แล้วต้อง `up -d` |
| 10 | **B** | Day 1 — registry / login |
| 11 | **B** | Day 2 — Pod |
| 12 | **C** | Day 2 — Deployment / Redeploy |
| 13 | **B** | Day 2 — READY 0/1 |
| 14 | **B** | Day 2 — CrashLoopBackOff + `--previous` |
| 15 | **B** | Day 2 — ImagePullBackOff ดู Events |
| 16 | **B** | Day 2 — เส้นทาง request |
| 17 | **B** | Day 2 — cluster / namespace |
| 18 | **B** | Day 2 — Secret |
| 19 | **C** | Day 2 — Pending / escalate |
| 20 | **A** | Day 2 — ขอบเขตงาน |

**สรุปการกระจายข้อสอบ**

- Docker พื้นฐานและคำสั่ง: 5 ข้อ (1–5)
- Docker Compose: 4 ข้อ (6–9)
- Registry: 1 ข้อ (10)
- K8s object และสถานะ: 5 ข้อ (11–15)
- การไล่ปัญหาและ Rancher: 3 ข้อ (16–18)
- ขอบเขตงานและการ escalate: 2 ข้อ (19–20)
