Internal Training

Kubernetes & Rancher
พื้นฐาน

Day 2 of 2 — พื้นฐาน K8s, การใช้ Rancher และ kubectl เท่าที่ใช้จริง

Docker & Kubernetes Internal TrainingDay 2

ทวน Day 1 สั้นๆ

➡️
วันนี้: แล้วถ้าระบบมี container เป็นร้อยตัว กระจายอยู่หลายเครื่อง — จะดูแลยังไง

Agenda — Day 2

1
Kubernetes คืออะไร — แก้ปัญหาอะไรที่ Docker เดี่ยวๆ แก้ไม่ได้
2
Object พื้นฐาน — Pod, Deployment, Service, Namespace
3
Rancher UI — เครื่องมือหลักที่ทีมใช้ทุกวัน
4
kubectl พื้นฐาน — 6 คำสั่งที่ใช้จริง
5
Use 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 → สร้างใหม่ให้เอง
⚠️
เพราะแบบนี้ ลบ 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 — หน่วยที่เล็กที่สุด

my-api-7d4b8c9f5-x2k9p
└─ deployment ─┘└hash┘└id┘   ← ชื่อลงท้ายสุ่ม = ปกติ
💡
ถ้าลูกค้าบอก "ชื่อ pod เปลี่ยนไปแล้ว" — ไม่ใช่ปัญหา แปลว่ามันถูกสร้างใหม่ ซึ่งเป็นเรื่องปกติ

Deployment — คนคุม Pod

Deployment
→ ดูแล →
📦 Pod
📦 Pod
📦 Pod
✅
เวลาจะ restart ให้ทำที่ระดับ Deployment/Workload ไม่ใช่ไล่ลบ pod ทีละตัว

Service — ที่อยู่ถาวรของแอป

ประเภทใช้ตอนไหน
ClusterIPเรียกกันภายใน cluster เท่านั้น (ค่าเริ่มต้น)
NodePortเปิดพอร์ตบนตัว node ให้เข้าจากข้างนอกได้
LoadBalancerผูกกับ LB ของ cloud — มี IP สาธารณะ
💡
"pod ปกติดี แต่ลูกค้าเข้าไม่ได้" → มักเป็นปัญหาที่ Service หรือ Ingress ไม่ใช่ที่ pod

เส้นทางของ request จากลูกค้า

🌍 ลูกค้า
→
Ingress
ดู URL/domain
→
Service
กระจาย traffic
→
📦 Pod
แอปจริง
เข้าไม่ได้ตรงจุดไหนอาการที่เห็น
Ingress404 / ชื่อโดเมนเข้าไม่ได้ / cert หมดอายุ
Service502 / 503 — หา pod ปลายทางไม่เจอ
Pod500 / 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 นาที = ผิดปกติ
Completedjob ที่รันเสร็จแล้ว — ไม่ใช่ error
Terminatingกำลังปิดตัว — ถ้าค้างนาน อาจติด finalizer
⚠️
Running 0/1 คือกับดัก — เห็นคำว่า Running แต่ลูกค้าใช้ไม่ได้จริง ให้ดูตัวเลข READY เสมอ

Pod Status ที่เจอบ่อย — ตัวที่มีปัญหา

STATUSสาเหตุไปดูต่อที่
CrashLoopBackOffแอปพังตอนเริ่ม แล้ววน restartlogs (previous)
ImagePullBackOffดึง image ไม่ได้ — tag ผิด/ไม่มีสิทธิ์Events
Pendingไม่มี node ว่างพอ / รอ volumeEvents
OOMKilledใช้ RAM เกิน limitmemory limit
Errorcontainer จบด้วย exit code ไม่ใช่ 0logs
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 คืออะไร

✅
ข้อดี
ไม่ต้องจำคำสั่ง เห็นภาพรวมง่าย มี log/exec ในตัว
⚠️
ข้อควรระวัง
กดปุ่มผิดมีผลจริงกับ production ทันที ไม่มี undo

3 อย่างที่ต้องเลือกให้ถูกก่อนทุกครั้ง

1
Cluster — ลูกค้ารายไหน / environment ไหน (เมนูบนซ้าย)
2
Project / Namespace — ทีมหรือระบบย่อยไหน
3
Workload — 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

ดู Log ผ่าน Rancher

1
เข้า Workload → คลิก pod ที่มีปัญหา
2
เมนู ⋮ → View Logs
3
เปิด Previous ถ้า pod เพิ่ง restart ไป — log ของรอบที่พังอยู่ตรงนั้น
4
เปิด Timestamps เพื่อเทียบกับเวลาที่ลูกค้าแจ้ง
5
กด Download เก็บไฟล์ log ไว้แนบ ticket
💡
อ่าน log จากล่างขึ้นบน — หา error แรกสุดที่เกิดขึ้น ไม่ใช่บรรทัดสุดท้าย เพราะ error หลังๆ มักเป็นผลพวง

Events — จุดที่คนมองข้ามบ่อยที่สุด

ข้อความที่เจอบ่อยแปลว่า
Failed to pull imagetag ผิด หรือไม่มีสิทธิ์เข้า registry
Insufficient cpu / memorynode ทรัพยากรไม่พอ pod เลยขึ้นไม่ได้
Liveness probe failedแอปไม่ตอบ health check → โดน restart
FailedMountต่อ volume ไม่ได้
✅
Pod ไม่ยอมขึ้น (Pending / ImagePullBackOff) → ดู Events ก่อน log เสมอ เพราะแอปยังไม่ได้เริ่มรัน จึงยังไม่มี log

Exec, Restart และ Scale ใน Rancher

อยากทำอะไรทำยังไง
เข้าไปข้างใน podPod → ⋮ → Execute Shell
รีสตาร์ททั้ง serviceWorkload → ⋮ → Redeploy (rolling ทีละตัว ระบบไม่ดับ)
เพิ่ม/ลดจำนวน podWorkload → Scale +/−
ดู config/envWorkload → 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-grinderEVENTSไม่มี log ให้ดูเลย เพราะยังไม่เริ่มรัน → ต้องดู Events
steam-wandPREVIOUSlog รอบปัจจุบันไม่มี ต้องกดปุ่ม Previous
menu-screenREADYอยู่ใน readiness probe ที่ไม่เคยผ่าน → ดู Configuration
cash-registerLOGSlog ปกติของตัวที่ไม่ได้ป่วย — ต้องกล้าเปิดดูด้วย
🧠
เรียงกันได้ว่า EVENTS · PREVIOUS · READY · LOGS — ไม่ใช่คำมั่วๆ แต่คือ 4 ที่ที่ต้องดูทุกครั้งเวลาเจอเคสจริง
🎁
โบนัส: ice-maker → คอลัมน์ RESTARTS เพิ่มเรื่อยๆ · describe จะเห็น OOMKilled · Exit 137 = ใช้ RAM เกิน limit
Part 4

kubectl พื้นฐาน

6 คำสั่งที่ครอบคลุมงานที่ต้องใช้

ทำไมต้องรู้ kubectl ทั้งที่มี Rancher

💡
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 จึงสร้างใหม่วนไปเรื่อยๆ

1
logs --previous หรือเปิด Previous ใน Rancher
2
อ่านหา error แรกสุด — มักเป็นหนึ่งใน 3 อย่างนี้
error ที่เจอสาเหตุ
connection refused / timeoutต่อ DB หรือ service อื่นไม่ได้
missing env / undefined configConfigMap หรือ 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 volumestorage มีปัญหา
no nodes availablenode ตายหมดหรือ NotReady
kubectl get nodes            # node ไหน NotReady บ้าง
kubectl describe node <node> # ดูว่าเหลือทรัพยากรเท่าไหร่
🚨
ถ้าหลาย pod ขึ้น Pending พร้อมกัน = ปัญหาระดับ cluster → escalate ทันที ไม่ต้องไล่ทีละตัว

เคส 4 — "ระบบใช้ได้บ้างไม่ได้บ้าง"

อาการแบบสุ่ม มักแปลว่า pod บางตัวเสีย แต่บางตัวยังดี

1
get pods — มีตัวไหน READY ไม่ครบ เช่น 0/1 ไหม
2
ดูคอลัมน์ RESTARTS — ตัวไหนเลขสูงผิดปกติ
3
ถ้า restart เยอะ + memory สูง → สงสัย OOMKilled
4
kubectl 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>
🚨
Rollback บน production ไม่ใช่สิ่งที่เราตัดสินใจเอง — แจ้งทีมที่รับผิดชอบ พร้อมข้อมูลว่า revision ไหนที่ยังดี

Checklist — ไล่ปัญหาบน K8s

1
ถูก cluster / namespace ไหม — เช็คก่อนเสมอ
2
Pod สถานะอะไร READY เท่าไหร่ — get pods
3
RESTARTS เยอะไหม — ถ้าเยอะแปลว่ามีปัญหาแม้จะขึ้น Running
4
Events ว่าอะไร — describe pod (ใช้กับ pod ที่ยังไม่เริ่มรัน)
5
Log ว่าอะไร — 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

💡
ไม่แน่ใจ = ถาม · การถามช้าไป 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

เอาเคสจริงที่เคยเจอมาลองไล่ด้วยกันได้เลย

← → เปลี่ยนสไลด์ · F จอเต็ม · P พิมพ์ PDF