Internal Training
Kubernetes & Rancher
พื้นฐาน
Day 2 of 2 — พื้นฐาน K8s, การใช้ Rancher และ kubectl เท่าที่ใช้จริง
ทวน Day 1 สั้นๆ
- Container = แอป + ของที่มันต้องใช้ แพ็กรวมไว้ในกล่องเดียว
docker ps -a ดูสถานะ · docker logs ดูว่ามันบ่นอะไร
- อ่าน exit code เป็น: 0 ปกติ · 1 แอปพัง · 137 OOM
- Compose = ไฟล์เดียวที่บอกว่าระบบมี service อะไร ต่อกันยังไง
➡️วันนี้: แล้วถ้าระบบมี container เป็นร้อยตัว กระจายอยู่หลายเครื่อง — จะดูแลยังไง
Agenda — Day 2
1Kubernetes คืออะไร — แก้ปัญหาอะไรที่ Docker เดี่ยวๆ แก้ไม่ได้
2Object พื้นฐาน — Pod, Deployment, Service, Namespace
3Rancher UI — เครื่องมือหลักที่ทีมใช้ทุกวัน
4kubectl พื้นฐาน — 6 คำสั่งที่ใช้จริง
5Use case ที่เจอบ่อย — และเมื่อไหร่ควร escalate
🏥ภาคบ่ายมีเกม "ล่ารหัสลับ" — เปิดในเบราว์เซอร์ ทำคนเดียว 12 นาที ไม่ต้องต่อ VPN
Part 1
Kubernetes คืออะไร
และทำไมถึงต้องมี ในเมื่อมี Docker แล้ว
ปัญหาที่ Docker เดี่ยวๆ แก้ไม่ได้
😰 ถ้ามีแค่ Docker
- container ตายตอนตีสาม → ต้องมีคนไป restart เอง
- คนใช้เยอะขึ้น → ต้องเพิ่มเครื่องเอง
- เครื่อง server พังทั้งเครื่อง → ทุกอย่างล่ม
- deploy ใหม่ = ต้องดับของเก่าก่อน
🎯 Kubernetes ทำให้
- container ตาย → สร้างใหม่เองอัตโนมัติ
- สั่งเพิ่ม/ลดจำนวนได้ในคำสั่งเดียว
- เครื่องนึงพัง → ย้ายไปรันเครื่องอื่นให้
- deploy ใหม่แบบไม่ต้องดับระบบ
💡Docker = คนคุมกล่องทีละใบ · Kubernetes = ผู้จัดการคลังสินค้า ที่คุมกล่องเป็นร้อยใบให้เอง
Kubernetes คืออะไร
📘Kubernetes (เรียกสั้นๆ ว่า K8s) คือระบบที่คอยรันและดูแล container จำนวนมากให้อัตโนมัติ — กระจายอยู่ได้หลายเครื่อง โดยเราไม่ต้องไปนั่งสั่งทีละตัว
ที่มาสั้นๆ
Google ต่อยอดจากระบบภายในของตัวเองที่ชื่อ Borg แล้วเปิดเป็น open source ปี 2014 · ตอนนี้อยู่ในความดูแลของมูลนิธิ CNCF และกลายเป็นมาตรฐานที่แทบทุกที่ใช้
ชื่อย่อ K8s มาจาก K + ตัวอักษรตรงกลาง 8 ตัว + s
มันทำอะไรให้
- เลือกว่า container ไหนไปรันเครื่องไหน
- ตายแล้วสร้างขึ้นมาใหม่ให้เอง
- เพิ่ม/ลดจำนวนได้ตามโหลด
- อัปเดตเวอร์ชันใหม่โดยระบบไม่ดับ
- ทำให้แต่ละส่วนเรียกหากันเจอ
🚫สิ่งที่ K8s ไม่ใช่: ไม่ได้ build image ให้ · ไม่ใช่ระบบ CI/CD · ไม่ได้แก้บั๊กในแอปให้ — หน้าที่มันคือ "ดูแลให้ container รันตามที่สั่งไว้" เท่านั้น
Container Orchestration คืออะไร
📘Orchestration คือการสั่งการ container จำนวนมากให้ทำงานร่วมกันอย่างเป็นระบบ โดยไม่ต้องมีคนคอยดูทีละตัว · มาจากคำว่า orchestra — K8s ทำหน้าที่เหมือนวาทยกร ที่คุมนักดนตรีทั้งวง
| งานที่มันทำแทนคน | แปลว่า |
| Scheduling | ตัดสินใจว่า container ตัวไหนควรไปรันบนเครื่องไหน |
| Self-healing | ตรวจว่าตัวไหนตายหรือไม่ตอบสนอง แล้วสร้างใหม่ให้ |
| Scaling | เพิ่ม/ลดจำนวนตามโหลดหรือตามที่สั่ง |
| Service discovery | ทำให้แต่ละส่วนเรียกหากันเจอ แม้ที่อยู่จะเปลี่ยนตลอด |
| Rolling update | เปลี่ยนเวอร์ชันทีละตัว ระบบไม่ต้องดับ |
💡ในตลาดมีหลายเจ้า (Kubernetes, Docker Swarm, Nomad, ECS) แต่ K8s เป็นที่นิยมที่สุด · Rancher ไม่ใช่คู่แข่งของ K8s แต่เป็นหน้าจอที่ช่วยให้จัดการ K8s ได้ง่ายขึ้นอีกที
K8s ในภาษาคน: ร้านกาแฟหนึ่งเชน ☕
คำศัพท์ทั้งวันนี้ ถ้าเทียบกับร้านกาแฟจะเข้าใจง่ายขึ้นเยอะ — เดี๋ยวจะอ้างถึงภาพนี้ตลอด
| ศัพท์ K8s | ในร้านกาแฟคือ |
| 📦 Pod | พนักงานชงกาแฟ 1 คน — คนที่ลงมือทำงานจริง |
| 👔 Deployment | หัวหน้าร้าน — กำหนดว่าต้องมีพนักงานกี่คน ใครลาออกก็หาคนใหม่มาแทนทันที |
| 🧾 Service | เคาน์เตอร์รับออเดอร์ — ลูกค้าสั่งที่เดิมเสมอ ไม่ต้องรู้ว่าวันนี้ใครเป็นคนชง |
| 🏪 Node | สาขา — สถานที่ที่พนักงานไปยืนทำงาน |
| 🏢 Cluster | ทั้งเชนรวมกัน |
| 🚪 Ingress | พนักงานต้อนรับหน้าร้าน — ชี้ว่าลูกค้าคนไหนควรไปเคาน์เตอร์ไหน |
| 🗂️ Namespace | โซนในร้าน เช่น โซนกาแฟ โซนเบเกอรี่ — ของคนละโซนไม่ปนกัน |
| 📺 Rancher | จอ CCTV + รีโมตของผู้จัดการ — นั่งดูทุกสาขาได้จากที่เดียว |
หัวใจของ K8s: Desired State
เราบอกว่า "อยากได้ 3 ตัว"
→
K8s คอยเช็คตลอดเวลา
→
ตายไป 1 → สร้างใหม่ให้เอง
- เราไม่ได้สั่งว่า "ทำ ก ข ค" — เราบอกแค่ว่า ผลลัพธ์ที่อยากได้คืออะไร
- K8s จะพยายามทำให้สถานะจริง = สถานะที่เราต้องการ ตลอดเวลา
- ☕ เหมือนสั่งหัวหน้าร้านว่า "กะนี้ขอพนักงาน 3 คน" — ใครลาป่วย หัวหน้าร้านหาคนมาแทนเองโดยไม่ต้องถามเรา
⚠️เพราะแบบนี้ ลบ pod ทิ้งมันจะเกิดใหม่เอง — ไม่ใช่เรื่องผิดปกติ และเป็นเหตุผลว่าทำไม "restart pod" ถึงปลอดภัยกว่าที่คิด
โครงสร้างแบบง่ายที่สุด
🏢Cluster
ระบบทั้งก้อน = กลุ่มเครื่องที่ทำงานร่วมกัน · ลูกค้าแต่ละรายอาจมีคนละ cluster
🖥️Node
เครื่อง server 1 เครื่องใน cluster · pod จะไปรันอยู่บน node
📦Pod
หน่วยเล็กที่สุดที่รันแอป · ข้างในมี container 1 ตัว (ส่วนใหญ่)
🧠Control Plane = สมองของ cluster คอยสั่งว่า pod ไหนไปอยู่ node ไหน — เราไม่ต้องยุ่งโดยตรง แต่ถ้ามันมีปัญหา ทั้ง cluster จะรวน
Part 2
Object พื้นฐาน
รู้จัก 5 ตัวนี้ก็คุยกับ dev รู้เรื่องแล้ว
Pod — หน่วยที่เล็กที่สุด
- Pod คือที่อยู่ของ container — ปกติ 1 pod = 1 container
- Pod มี IP ของตัวเอง แต่ เปลี่ยนทุกครั้งที่เกิดใหม่
- Pod เป็นของชั่วคราว — ตายแล้วไม่ฟื้น ระบบจะสร้างตัวใหม่ขึ้นมาแทน (ชื่อจะเปลี่ยน)
- ☕ เทียบร้านกาแฟ: pod = พนักงานชงกาแฟ 1 คน · ลาออกแล้วร้านจ้างคนใหม่มาแทน ไม่ใช่คนเดิมกลับมา ชื่อจึงเปลี่ยน
my-api-7d4b8c9f5-x2k9p
└─ deployment ─┘└hash┘└id┘ ← ชื่อลงท้ายสุ่ม = ปกติ
💡ถ้าลูกค้าบอก "ชื่อ pod เปลี่ยนไปแล้ว" — ไม่ใช่ปัญหา แปลว่ามันถูกสร้างใหม่ ซึ่งเป็นเรื่องปกติ
Deployment — คนคุม Pod
Deployment
→ ดูแล →
📦 Pod
📦 Pod
📦 Pod
- บอกว่า "อยากได้ pod แบบนี้ จำนวน 3 ตัว จาก image tag นี้"
- Pod ตาย → Deployment สร้างใหม่ให้อัตโนมัติ
- เปลี่ยน image tag → ทยอยเปลี่ยน pod ทีละตัว (rolling update) ระบบไม่ดับ
- ใน Rancher จะเห็นเป็น Workload — และนี่คือระดับที่เรามักจะไป restart หรือ scale
- ☕ เทียบร้านกาแฟ: Deployment = หัวหน้าร้านที่สั่งไว้ว่า "กะนี้ต้องมีพนักงาน 3 คนเสมอ"
✅เวลาจะ restart ให้ทำที่ระดับ Deployment/Workload ไม่ใช่ไล่ลบ pod ทีละตัว
Service — ที่อยู่ถาวรของแอป
- Pod IP เปลี่ยนตลอด → ถ้าเรียก pod ตรงๆ จะพังทันทีที่ pod เกิดใหม่
- Service = ชื่อ/IP ที่ไม่เปลี่ยน แล้วกระจาย traffic ไปยัง pod ที่ยังไหว
- ☕ เทียบร้านกาแฟ: Service = เคาน์เตอร์รับออเดอร์ · ลูกค้าสั่งที่เดิมทุกครั้ง ไม่ต้องรู้ว่าวันนี้ใครเป็นคนชง
| ประเภท | ใช้ตอนไหน |
| ClusterIP | เรียกกันภายใน cluster เท่านั้น (ค่าเริ่มต้น) |
| NodePort | เปิดพอร์ตบนตัว node ให้เข้าจากข้างนอกได้ |
| LoadBalancer | ผูกกับ LB ของ cloud — มี IP สาธารณะ |
💡"pod ปกติดี แต่ลูกค้าเข้าไม่ได้" → มักเป็นปัญหาที่ Service หรือ Ingress ไม่ใช่ที่ pod
เส้นทางของ request จากลูกค้า
🌍 ลูกค้า
→
Ingress
ดู URL/domain
→
Service
กระจาย traffic
→
📦 Pod
แอปจริง
| เข้าไม่ได้ตรงจุดไหน | อาการที่เห็น |
| Ingress | 404 / ชื่อโดเมนเข้าไม่ได้ / cert หมดอายุ |
| Service | 502 / 503 — หา pod ปลายทางไม่เจอ |
| Pod | 500 / timeout — แอปเองมีปัญหา |
☕เทียบร้านกาแฟ: ลูกค้าเดินเข้าร้าน → พนักงานต้อนรับชี้ทาง (Ingress) → ต่อคิวที่เคาน์เตอร์ (Service) → พนักงานชงให้ (Pod) · ติดตรงไหน ลูกค้าก็ไม่ได้กาแฟ
Namespace, ConfigMap & Secret
🗂️Namespace
โซนแบ่งของใน cluster เช่น prod, staging · ต้องเลือกให้ถูกก่อนหาอะไรเสมอ ☕ = โซนกาแฟ / โซนเบเกอรี่
⚙️ConfigMap
ค่า config ที่ไม่ลับ เช่น URL, feature flag ☕ = สูตรกาแฟที่ติดไว้หลังเคาน์เตอร์
🔐Secret
ค่าที่เป็นความลับ เช่น password, token ☕ = รหัสตู้เซฟหลังร้าน
🚫Secret ไม่ได้เข้ารหัสจริง — มันแค่ถูกเข้ารหัสแบบ base64 ซึ่งถอดได้ทันที · ห้าม screenshot หรือแปะค่าใน ticket / แชท เด็ดขาด
⚠️หาอะไรไม่เจอใน Rancher ให้เช็คก่อนเลยว่า อยู่ผิด namespace หรือผิด cluster หรือเปล่า
Pod Status ที่เจอบ่อย — ตัวที่ปกติ
| STATUS | แปลว่า |
| Running 1/1 | ปกติ container พร้อมใช้งาน |
| Running 0/1 | รันอยู่ แต่ ยังไม่พร้อมรับ traffic — readiness ยังไม่ผ่าน |
| ContainerCreating | กำลังสร้าง — ถ้าค้างเกิน 2-3 นาที = ผิดปกติ |
| Completed | job ที่รันเสร็จแล้ว — ไม่ใช่ error |
| Terminating | กำลังปิดตัว — ถ้าค้างนาน อาจติด finalizer |
⚠️Running 0/1 คือกับดัก — เห็นคำว่า Running แต่ลูกค้าใช้ไม่ได้จริง ให้ดูตัวเลข READY เสมอ
Pod Status ที่เจอบ่อย — ตัวที่มีปัญหา
| STATUS | สาเหตุ | ไปดูต่อที่ |
| CrashLoopBackOff | แอปพังตอนเริ่ม แล้ววน restart | logs (previous) |
| ImagePullBackOff | ดึง image ไม่ได้ — tag ผิด/ไม่มีสิทธิ์ | Events |
| Pending | ไม่มี node ว่างพอ / รอ volume | Events |
| OOMKilled | ใช้ RAM เกิน limit | memory limit |
| Error | container จบด้วย exit code ไม่ใช่ 0 | logs |
| Evicted | โดนไล่ออกจาก node เพราะ node ทรัพยากรหมด | node status |
💡สังเกตคอลัมน์ RESTARTS ด้วย — เลขสูงและเพิ่มเรื่อยๆ = มีปัญหาแม้สถานะจะเป็น Running
การ์ดอาการ 6 แบบ 🩺
จำ 6 ใบนี้ได้ = ไล่เคสได้เกือบทุกเคสที่จะเจอ · บ่ายนี้จะได้ใช้จริงในคลินิก
💚Running 1/1
สบายดี ทำงานปกติ
→ ไม่ต้องทำอะไร
😴Running 0/1
มาทำงานแล้ว แต่ยังไม่พร้อมรับลูกค้า
→ ดู Events + readiness
🔁CrashLoopBackOff
เข้างานแล้วเป็นลมทุกรอบ
→ ดู Logs (Previous)
📦ImagePullBackOff
ยังไม่ได้ตัวคนมาเลย หยิบของผิดกล่อง
→ ดู Events
🪑Pending
ไม่มีที่ให้ยืนทำงาน
→ ดู Events + ทรัพยากร node
🍔OOMKilled
กินเกินโควตา เลยโดนเชิญออก
→ ดู RESTARTS + memory limit
💡กฎเดียวที่ต้องจำ: ยังไม่ได้เริ่มทำงาน → ดู Events · เริ่มทำงานแล้วล้ม → ดู Logs
Part 3
Rancher UI
เครื่องมือหลักที่เราจะใช้จริงทุกวัน
Rancher คืออะไร
- หน้าจอเว็บสำหรับจัดการ Kubernetes — ทำแทน kubectl ได้เกือบทั้งหมด
- ☕ เทียบร้านกาแฟ: Rancher = จอ CCTV + รีโมตของผู้จัดการ นั่งดูได้ทุกสาขาจากที่เดียว
- ดูได้หลาย cluster จากที่เดียว
- มีระบบสิทธิ์ — เห็นเฉพาะ project/namespace ที่ได้รับสิทธิ์
✅ข้อดี
ไม่ต้องจำคำสั่ง เห็นภาพรวมง่าย มี log/exec ในตัว
⚠️ข้อควรระวัง
กดปุ่มผิดมีผลจริงกับ production ทันที ไม่มี undo
3 อย่างที่ต้องเลือกให้ถูกก่อนทุกครั้ง
1Cluster — ลูกค้ารายไหน / environment ไหน (เมนูบนซ้าย)
2Project / Namespace — ทีมหรือระบบย่อยไหน
3Workload — service ที่เป็นปัญหาชื่ออะไร
🚨เช็ค cluster ให้ชัวร์ก่อนกดทุกครั้ง — เคสอุบัติเหตุที่เจอบ่อยที่สุดคือเผลอไป restart ของ production ทั้งที่ตั้งใจจะแตะ staging
💡ตั้งชื่อ cluster ให้แยก prod/staging ชัดเจน และอ่านชื่อบนหัวจอทุกครั้งก่อนลงมือ
ดู Workload และ Pod ใน Rancher
Cluster: prod-th · Namespace: payment · Workloads
🟢 payment-apiDeployment · 3/3 · 12d
🔴 payment-workerDeployment · 0/2 · CrashLoopBackOff
🟢 redisStatefulSet · 1/1 · 30d
- Workloads → เห็นทุก service ในหน้าเดียว พร้อมสถานะสี
- ตัวเลข 3/3 = พร้อมใช้ 3 จาก 3 ตัวที่ต้องการ · 0/2 = ไม่มีตัวไหนพร้อมเลย
- คลิกชื่อ workload → เห็นรายชื่อ pod ข้างใน
ดู Log ผ่าน Rancher
1เข้า Workload → คลิก pod ที่มีปัญหา
3เปิด Previous ถ้า pod เพิ่ง restart ไป — log ของรอบที่พังอยู่ตรงนั้น
4เปิด Timestamps เพื่อเทียบกับเวลาที่ลูกค้าแจ้ง
5กด Download เก็บไฟล์ log ไว้แนบ ticket
💡อ่าน log จากล่างขึ้นบน — หา error แรกสุดที่เกิดขึ้น ไม่ใช่บรรทัดสุดท้าย เพราะ error หลังๆ มักเป็นผลพวง
Events — จุดที่คนมองข้ามบ่อยที่สุด
- Events บอกว่า K8s พยายามทำอะไรและติดตรงไหน — ต่างจาก log ที่เป็นเสียงจากตัวแอป
- ดูได้ที่หน้า pod ส่วน Events หรือเมนู Cluster → Events
| ข้อความที่เจอบ่อย | แปลว่า |
| Failed to pull image | tag ผิด หรือไม่มีสิทธิ์เข้า registry |
| Insufficient cpu / memory | node ทรัพยากรไม่พอ pod เลยขึ้นไม่ได้ |
| Liveness probe failed | แอปไม่ตอบ health check → โดน restart |
| FailedMount | ต่อ volume ไม่ได้ |
✅Pod ไม่ยอมขึ้น (Pending / ImagePullBackOff) → ดู Events ก่อน log เสมอ เพราะแอปยังไม่ได้เริ่มรัน จึงยังไม่มี log
Exec, Restart และ Scale ใน Rancher
| อยากทำอะไร | ทำยังไง |
| เข้าไปข้างใน pod | Pod → ⋮ → Execute Shell |
| รีสตาร์ททั้ง service | Workload → ⋮ → Redeploy (rolling ทีละตัว ระบบไม่ดับ) |
| เพิ่ม/ลดจำนวน pod | Workload → Scale +/− |
| ดู config/env | Workload → tab Configuration |
| ย้อนกลับเวอร์ชันเดิม | Workload → ⋮ → Rollback (ต้องได้รับอนุมัติก่อน) |
⚠️Redeploy ปลอดภัยกว่าลบ pod ทีละตัว — แต่ทั้งคู่ทำให้ log ของรอบเดิมหายไป เก็บ log ก่อนเสมอ
🔎 Lab · 12 นาที · ทำคนเดียว
ล่ารหัสลับใน Kubernetes
เปิดไฟล์ k8s-clinic-simulator.html ที่แจกให้ (ดับเบิลคลิกได้เลย ไม่ต้องต่อ VPN) · ข้างในมี workload 5 ตัว ซ่อนรหัสลับไว้ 4 คำ คนละที่กัน
| Workload | ใบ้ |
bean-grinder | ดึง image ไม่ได้ — ชื่อ image ที่ดึงไม่สำเร็จมีรหัสอยู่ |
steam-wand | ตายแล้วเกิดใหม่ตลอด · รหัสอยู่ใน log รอบที่มันตาย |
menu-screen | ดูเหมือนปกติ แต่ใช้ไม่ได้ · รหัสอยู่ใน "เงื่อนไขที่ไม่เคยผ่าน" |
cash-register | ปกติดี 100% แต่รหัสก็ซ่อนอยู่ในนั้น |
🎁โบนัส: ice-maker ไม่มีรหัส แต่มีตัวเลขน่าสงสัย 1 ช่อง — ช่องไหน แปลว่าอะไร
🩺กดปุ่ม วินิจฉัย ในแต่ละตัวเพื่อเก็บคะแนน (เต็ม 15) — ใครได้เต็มบ้าง เดี๋ยวมาดูกัน
🔑 เฉลย
รหัสลับทั้ง 4 คำ
| Workload | รหัส | เจอได้จากไหน |
bean-grinder | EVENTS | ไม่มี log ให้ดูเลย เพราะยังไม่เริ่มรัน → ต้องดู Events |
steam-wand | PREVIOUS | log รอบปัจจุบันไม่มี ต้องกดปุ่ม Previous |
menu-screen | READY | อยู่ใน readiness probe ที่ไม่เคยผ่าน → ดู Configuration |
cash-register | LOGS | log ปกติของตัวที่ไม่ได้ป่วย — ต้องกล้าเปิดดูด้วย |
🧠เรียงกันได้ว่า EVENTS · PREVIOUS · READY · LOGS — ไม่ใช่คำมั่วๆ แต่คือ 4 ที่ที่ต้องดูทุกครั้งเวลาเจอเคสจริง
🎁โบนัส: ice-maker → คอลัมน์ RESTARTS เพิ่มเรื่อยๆ · describe จะเห็น OOMKilled · Exit 137 = ใช้ RAM เกิน limit
Part 4
kubectl พื้นฐาน
6 คำสั่งที่ครอบคลุมงานที่ต้องใช้
ทำไมต้องรู้ kubectl ทั้งที่มี Rancher
- เร็วกว่ามากเวลาต้องดูหลาย pod พร้อมกัน
- ก๊อป output แนบ ticket ได้เลย — ชัดเจนกว่า screenshot
- บางข้อมูล UI ไม่แสดง (เช่น
describe แบบเต็ม)
- เวลา Rancher เองมีปัญหา ยังเข้าถึง cluster ได้
💡Rancher มี kubectl Shell ในตัว (ปุ่ม >_ มุมขวาบน) — ใช้ได้ทันทีโดยไม่ต้องตั้งค่าอะไรในเครื่อง
kubectl get — ดูว่ามีอะไรอยู่บ้าง
kubectl get pods -n k8s-clinic # ดู pod ใน namespace
kubectl get pods -n k8s-clinic -o wide # เห็น node และ IP ด้วย
kubectl get pods -A # ดูทุก namespace
kubectl get deploy,svc -n k8s-clinic # ดูหลายชนิดพร้อมกัน
# หา pod ที่มีปัญหาเร็วๆ
kubectl get pods -A | grep -v Running
⚠️ลืม -n <namespace> แล้วจะไม่เจออะไรเลย — เพราะมันจะไปดูที่ namespace default ให้แทน
describe & logs — สองตัวที่ใช้บ่อยสุด
# ดูรายละเอียด + Events ของ pod (สำคัญมาก)
kubectl describe pod <pod> -n payment
# ดู log
kubectl logs <pod> -n payment --tail 200
kubectl logs -f <pod> -n payment # real-time
kubectl logs <pod> -n payment --previous # ← รอบที่มันพังไป
kubectl logs -l app=payment-api -n payment # ดูทุก pod ของ service
✅เจอ CrashLoopBackOff ให้ใช้ --previous เสมอ ไม่งั้นจะได้ log ของรอบใหม่ที่ยังไม่ทันพ่น error อะไรออกมา
คำสั่งที่เหลือ
# เข้าไปข้างใน pod
kubectl exec -it <pod> -n payment -- sh
# ดู events เรียงตามเวลา ← ใช้ตอน pod ไม่ยอมขึ้น
kubectl get events -n payment --sort-by=.lastTimestamp
# restart ทั้ง deployment แบบ rolling
kubectl rollout restart deploy/payment-api -n payment
kubectl rollout status deploy/payment-api -n payment
# ทดสอบต่อเข้า service จากเครื่องตัวเอง
kubectl port-forward svc/payment-api 8080:80 -n payment
💡port-forward ช่วยแยกได้ว่าปัญหาอยู่ที่ แอป หรือที่ ingress/network — ถ้ายิงตรงแล้วได้ แปลว่าแอปปกติ
Cheat Sheet — kubectl
ดูสถานะ
kubectl get pods -n <ns>
kubectl get pods -n <ns> -o wide
kubectl get pods -A | grep -v Running
kubectl top pods -n <ns>
หาสาเหตุ
kubectl describe pod <pod> -n <ns>
kubectl get events -n <ns> \
--sort-by=.lastTimestamp
ดู log
kubectl logs <pod> -n <ns> --tail 200
kubectl logs <pod> -n <ns> --previous
kubectl logs -f <pod> -n <ns>
ลงมือแก้
kubectl exec -it <pod> -n <ns> -- sh
kubectl rollout restart deploy/<name>
kubectl rollout undo deploy/<name>
⚡ Mini Challenge · 5 นาที
อ่าน output ของ kubectl ให้เป็น
ถ้าวันหนึ่งได้สิทธิ์ใช้ kubectl ผลลัพธ์จะหน้าตาแบบนี้ — ลองตอบ 3 ข้อจากภาพนี้
$ kubectl get pods -n k8s-clinic
NAME READY STATUS RESTARTS AGE
bean-grinder-5f9c7d8b6-mn4tq 0/1 ImagePullBackOff 0 12m
cash-register-7d4b8c9f5-x2k9p 1/1 Running 0 3h
ice-maker-8b7d6c5f4-r7t2m 1/1 Running 14 52m
menu-screen-4d5e6f7a8-q9z1c 0/1 Running 0 41m
steam-wand-6c8f9d7a5-k2p9w 0/1 CrashLoopBackOff 7 18m
1ตัวไหนที่ลูกค้า "ใช้งานไม่ได้" ทั้งที่สถานะเขียนว่า Running
2ตัวไหนน่าเป็นห่วงที่สุดถ้าปล่อยไว้ข้ามคืน และดูจากคอลัมน์ไหน
3ถ้าจะหาสาเหตุของ bean-grinder ต้องดู Events หรือ Logs
Part 5
เคสจริงที่เจอบ่อย
อาการ → เช็คอะไร → แก้ได้เองหรือต้องส่งต่อ
เคส 1 — CrashLoopBackOff
แปลว่า: แอปเริ่มทำงานแล้วพังทันที K8s จึงสร้างใหม่วนไปเรื่อยๆ
1logs --previous หรือเปิด Previous ใน Rancher
2อ่านหา error แรกสุด — มักเป็นหนึ่งใน 3 อย่างนี้
| error ที่เจอ | สาเหตุ |
| connection refused / timeout | ต่อ DB หรือ service อื่นไม่ได้ |
| missing env / undefined config | ConfigMap หรือ Secret หาย/ผิด |
| permission denied | สิทธิ์ไฟล์หรือ volume ไม่ถูก |
⚠️Restart ซ้ำๆ ไม่ช่วยถ้าสาเหตุยังอยู่ — เก็บ log แล้วส่งต่อจะเร็วกว่า
เคส 2 — ImagePullBackOff
แปลว่า: ดึง image ไม่ได้ pod เลยยังไม่เริ่มรัน (ยังไม่มี log ให้ดู)
1ดู Events → บรรทัด Failed to pull image จะบอกสาเหตุตรงๆ
2เช็คว่า image tag ที่ระบุมีอยู่จริงใน registry ไหม
3ถ้าเป็น unauthorized → imagePullSecret หมดอายุ/ไม่ถูกต้อง
✅ทำเองได้: ยืนยันว่า tag ผิดหรือ registry มีปัญหา
➡️ต้อง escalate: การแก้ secret หรือแก้ tag บน production
เคส 3 — Pod ค้างที่ Pending
แปลว่า: K8s หา node ให้ pod ไปรันไม่ได้
| ใน Events เขียนว่า | สาเหตุ |
| Insufficient cpu / memory | ทุก node เต็ม — ต้องขยาย cluster หรือลดของที่ไม่จำเป็น |
| node(s) had taint... | ตั้งค่า scheduling ไว้ ทำให้ลงบาง node ไม่ได้ |
| FailedMount / waiting for volume | storage มีปัญหา |
| no nodes available | node ตายหมดหรือ NotReady |
kubectl get nodes # node ไหน NotReady บ้าง
kubectl describe node <node> # ดูว่าเหลือทรัพยากรเท่าไหร่
🚨ถ้าหลาย pod ขึ้น Pending พร้อมกัน = ปัญหาระดับ cluster → escalate ทันที ไม่ต้องไล่ทีละตัว
เคส 4 — "ระบบใช้ได้บ้างไม่ได้บ้าง"
อาการแบบสุ่ม มักแปลว่า pod บางตัวเสีย แต่บางตัวยังดี
1get pods — มีตัวไหน READY ไม่ครบ เช่น 0/1 ไหม
2ดูคอลัมน์ RESTARTS — ตัวไหนเลขสูงผิดปกติ
3ถ้า restart เยอะ + memory สูง → สงสัย OOMKilled
4kubectl top pods -n <ns> ดูการใช้ CPU/RAM จริง
💡Service กระจาย traffic ไปทุก pod — ถ้ามี 1 ใน 3 ตัวเสีย ลูกค้าจะเจอ error ประมาณ 1 ใน 3 ครั้ง นี่คือที่มาของอาการ "เป็นๆ หายๆ"
เคส 5 — "หลัง deploy แล้วพัง"
# ดูประวัติการ deploy
kubectl rollout history deploy/<name> -n <ns>
# ดูว่า rollout ค้างอยู่หรือเปล่า
kubectl rollout status deploy/<name> -n <ns>
# ย้อนกลับเวอร์ชันก่อนหน้า ← ต้องได้รับอนุมัติก่อนเสมอ
kubectl rollout undo deploy/<name> -n <ns>
- เทียบเวลาที่ deploy กับเวลาที่ลูกค้าเริ่มแจ้ง — ตรงกันไหม
- ใน Rancher ดูได้ที่ tab Recent Changes / Revision History ของ workload
🚨Rollback บน production ไม่ใช่สิ่งที่เราตัดสินใจเอง — แจ้งทีมที่รับผิดชอบ พร้อมข้อมูลว่า revision ไหนที่ยังดี
Checklist — ไล่ปัญหาบน K8s
1ถูก cluster / namespace ไหม — เช็คก่อนเสมอ
2Pod สถานะอะไร READY เท่าไหร่ — get pods
3RESTARTS เยอะไหม — ถ้าเยอะแปลว่ามีปัญหาแม้จะขึ้น Running
4Events ว่าอะไร — describe pod (ใช้กับ pod ที่ยังไม่เริ่มรัน)
5Log ว่าอะไร — logs --previous (ใช้กับ pod ที่เคยรันแล้วพัง)
6ถ้า pod ปกติหมด → ปัญหาอยู่ที่ Service / Ingress / นอก cluster
✅จำหลักง่ายๆ: pod ยังไม่เริ่มรัน → ดู Events · pod เคยรันแล้วพัง → ดู Logs
สิ่งที่ทำได้เอง vs ต้องส่งต่อ
ทำได้เอง
- ดู pod status / logs / events
- เข้า shell เพื่อดูค่า (อ่านอย่างเดียว)
- ดู config ของ workload
- Redeploy ตามขั้นตอนที่ได้รับมอบหมาย
- Scale ตาม runbook ที่มีอยู่
ต้อง escalate
- แก้ ConfigMap / Secret
- Rollback หรือเปลี่ยน image tag
- ลบ pod/workload/volume
- เรื่องระดับ node หรือ cluster
- ทุกเคสที่เกี่ยวกับข้อมูลสูญหาย
⚠️หลักคิดง่ายๆ: อ่านได้เสมอ · เขียนต้องมีคนอนุมัติ
ส่งเคสต่อยังไงให้ dev แก้ได้เร็ว
ข้อมูลที่ต้องมีครบ
- Cluster + Namespace + ชื่อ workload
- ชื่อ pod และสถานะ (พร้อม READY / RESTARTS)
- Log ~200 บรรทัด พร้อม timestamp
- Events จาก
describe - เวลาที่เริ่มมีอาการ + จำนวนลูกค้าที่กระทบ
- มีการ deploy หรือเปลี่ยนอะไรก่อนหน้าไหม
ตัวอย่างการเขียน
Cluster: prod-th · NS: payment
Workload: payment-worker (0/2)
Pod: payment-worker-6f8d…-k2p9
Status: CrashLoopBackOff · RESTARTS 47
เริ่มมีอาการ: 04/08 14:20
ก่อนหน้า: deploy tag 2.3.1 เวลา 14:05
Log (previous): ECONNREFUSED redis:6379
ลองแล้ว: redeploy 1 ครั้ง อาการเดิม
ข้อควรระวังบน Production
- อย่ากดอะไรก่อนอ่านชื่อ cluster บนหัวจอ
- อย่าแก้ไฟล์หรือ config ข้างใน pod — หายทันทีที่ pod เกิดใหม่
- อย่า screenshot หน้า Secret หรือแปะค่าลง ticket
- อย่าลบ pod เพื่อ "ลองดู" — ใช้ Redeploy ตาม runbook แทน
- อย่า restart ก่อนเก็บ log — หลักฐานจะหายไปพร้อมกัน
💡ไม่แน่ใจ = ถาม · การถามช้าไป 5 นาที ดีกว่ากดผิดแล้วระบบลูกค้าล่ม
สรุป 2 วัน
Day 1 — Docker
- container คืออะไร ต่างจาก VM ยังไง
ps -a · logs · exec · stats- อ่าน exit code เป็น
- Compose: image / ports / env / volumes
Day 2 — K8s & Rancher
- Pod / Deployment / Service / Namespace
- อ่าน pod status และ RESTARTS เป็น
- Rancher: logs, events, exec, redeploy
- kubectl: get / describe / logs --previous
🎯สิ่งที่อยากให้ติดตัวไปที่สุด: pod ไม่ขึ้น → ดู Events · pod พังหลังรัน → ดู Logs · ไม่แน่ใจ → เก็บข้อมูลให้ครบแล้วส่งต่อ
Q&A
เอาเคสจริงที่เคยเจอมาลองไล่ด้วยกันได้เลย