แผนการเรียนรู้
/

สัปดาห์ที่ 13: Advanced Monitoring & Troubleshooting

ยกระดับการเฝ้าระวังระบบด้วยตัวชี้วัดเชิงลึก และศิลปะแห่งการสืบสวนและแก้ไขปัญหาในระดับ Production

Agenda วันนี้

  • Exporters: การเก็บ Metrics ขั้นสูง (Node Exporter, Blackbox Exporter)
  • SRE Concepts: ทำความเข้าใจตัวชี้วัด SLI, SLO, SLA และ Error Budgets
  • Troubleshooting Frameworks: ระเบียบวิธีวิเคราะห์ปัญหา (USE และ RED Methods)
  • Debugging in Action: การสืบสวนปัญหาผ่าน Logs และ Metrics
  • Post-mortem Analysis: การเรียนรู้จากความล้มเหลวแบบไร้การกล่าวโทษ (Blameless)
DevOps Course: Week 13

ทบทวนสัปดาห์ที่ 12 (Recap)

สัปดาห์ที่แล้วเราได้เรียนรู้ "3 เสาหลักของ Observability" และเครื่องมือพื้นฐาน

📈 Metrics

ตัวชี้วัดเชิงตัวเลข จัดเก็บและดึงข้อมูลด้วย Prometheus และแสดงผลด้วย Grafana

📄 Logs

บันทึกเหตุการณ์เป็นข้อความ ค้นหาและวิเคราะห์แบบรวมศูนย์ด้วย ELK Stack

🚨 Alerting

การแจ้งเตือนอัตโนมัติผ่าน Alertmanager เมื่อตัวชี้วัดเกินเกณฑ์ที่กำหนด

ทำไมต้องทำ Advanced Monitoring?

การรู้แค่ว่า "CPU กำลังทำงาน 80%" ไม่เพียงพออีกต่อไปในยุคของ Microservices

  • เราต้องรู้ให้ลึกถึงระดับฮาร์ดแวร์ (OS, Disk I/O, Network Drops)
  • เราต้องรู้มุมมองจากภายนอก (ผู้ใช้เข้าเว็บเราได้ไหม? ติด SSL Error หรือเปล่า?)
  • เราต้องเชื่อมโยงความสัมพันธ์ทางธุรกิจกับความพร้อมใช้งานของระบบ
  • ระบบที่ซับซ้อนต้องการ "กรอบความคิด" (Framework) ในการแก้ปัญหา ไม่ใช่การเดาสุ่ม
🔌

Part 1: การใช้ Exporters

ในระบบ Prometheus การจะดึงข้อมูลมาเก็บได้ (Scrape) บริการปลายทางต้องเปิด Endpoint /metrics เอาไว้

แต่ถ้าซอฟต์แวร์นั้นไม่ได้สร้างมาเพื่อ Prometheus ล่ะ จะทำอย่างไร?

คำตอบคือการใช้ "Exporter" ซึ่งทำหน้าที่เป็น "ตัวกลางล่ามแปลภาษา" ดึงข้อมูลดิบจากระบบเป้าหมาย แล้วแปลงให้อยู่ในรูปแบบที่ Prometheus เข้าใจ

Node Exporter (OS & Hardware Metrics)

หน้าที่หลัก

ทำหน้าที่รวบรวมข้อมูลระดับฮาร์ดแวร์และระบบปฏิบัติการ (OS) ของเครื่อง Linux/UNIX

  • CPU: การใช้งานแต่ละ Core (user, system, idle)
  • Memory: RAM ที่เหลือ, Swap usage
  • Disk: พื้นที่ว่าง, จำนวน Read/Write (I/O)
  • Network: ปริมาณ Bandwidth, Packet errors

# ตัวอย่าง Metrics จาก Node Exporter

node_cpu_seconds_total{mode="idle"} 1234.56

node_memory_MemAvailable_bytes 2147483648

node_filesystem_free_bytes{fstype="ext4"} ...

*มักจะถูกรันแบบ DaemonSet ใน Kubernetes เพื่อให้ทำงานอยู่บนทุกๆ Worker Node

Blackbox Exporter (Probing Metrics)

มองระบบแบบกล่องดำ (External View)

แทนที่จะดึงข้อมูลจาก "ภายใน" เครื่อง Blackbox Exporter ทำหน้าที่ "ยิง Probe" ไปทดสอบเป้าหมายจากภายนอก จำลองพฤติกรรมเสมือนว่าผู้ใช้กำลังเข้าเว็บไซต์

ความสามารถในการ Probe:

  • HTTP/HTTPS: เว็บโหลดขึ้นไหม? (HTTP 200 OK) ใช้เวลาเท่าไหร่?
  • DNS: ระบุชื่อ Domain ไปหา IP ถูกต้องไหม?
  • TCP/ICMP: พอร์ตเปิดอยู่ไหม? ปิง (Ping) เจอหรือเปล่า?

ตัวอย่าง Use Case ที่สำคัญ:

  • การแจ้งเตือน "SSL Certificate กำลังจะหมดอายุ!" (probe_ssl_earliest_cert_expiry)
  • ตรวจสอบเว็บไซต์คู่แข่ง หรือ 3rd Party API ว่าล่มหรือไม่

Application-Specific Metrics (Custom)

หากต้องการรู้ลึกถึงระดับ Business Logic คุณต้องฝัง Code ลงไปเอง (Instrumentation)

# ตัวอย่างการใช้ Prometheus Client Library ใน Python (Flask)

from prometheus_client import Counter


# สร้าง Metric ประเภท Counterเพื่อนับจำนวน

checkout_requests = Counter('checkout_total', 'Total successful checkouts')


@app.route('/checkout')

def checkout():

    # เมื่อมีผู้ใช้เข้า URL นี้ ให้เพิ่มค่าขึ้น 1

    checkout_requests.inc()

    return "Payment Successful!"

*ข้อมูลเหล่านี้จะถูกเปิดให้ Prometheus มาดึงไป ซึ่งมีประโยชน์มากในการวัดยอดขาย หรือจำนวนคิวงานที่ค้างอยู่

⚖️

Part 2: Site Reliability Engineering (SRE)

"SRE is what happens when you ask a software engineer to design an operations team."

- Benjamin Treynor Sloss, VP of Engineering, Google

SRE นำหลักการของการเขียนโปรแกรมและวิศวกรรมซอฟต์แวร์มาใช้กับงาน Operations (ดูแลระบบ) โดยมีเป้าหมายหลักคือการรักษาสมดุลระหว่าง "ความน่าเชื่อถือของระบบ (Reliability)" และ "ความเร็วในการปล่อยฟีเจอร์ใหม่ (Feature Velocity)"

ไขรหัสลับ: SLA vs SLO vs SLI

เพื่อวัดความน่าเชื่อถือ SRE ได้กำหนดคำศัพท์สำคัญ 3 คำ

SLA (Service Level Agreement)

"สัญญาข้อตกลงธุรกิจ" ถ้าเราทำไม่ได้ตามเป้า จะเกิดผลตามกฎหมายหรือต้องจ่ายเงินคืนลูกค้า

SLO (Service Level Objective)

"เป้าหมายภายในทีม" ตัวเลขที่เราตั้งเป้าไว้ให้ระบบทำงานได้ (ต้องเข้มงวดกว่า SLA เสมอ)

SLI (Service Level Indicator)

"ตัวชี้วัดความจริง" ตัวเลขที่วัดได้จริงๆ ณ ปัจจุบัน จากระบบ Monitoring (เช่น Prometheus)

SLI (Service Level Indicator)

"สัดส่วนของเหตุการณ์ที่ดี ต่อ เหตุการณ์ทั้งหมด" (แสดงเป็นเปอร์เซ็นต์)

SLI = (Good Events / Valid Total Events) * 100

ประเภทของ SLI ที่นิยมวัด:

  • Availability: สัดส่วนเวลาที่ระบบไม่ล่ม (Uptime)
  • Error Rate: จำนวน Request ที่สถานะไม่ใช่ 5xx เทียบกับ Request ทั้งหมด
  • Latency (ความหน่วง): จำนวน Request ที่ตอบสนองเร็วกว่า 200ms เทียบกับ Request ทั้งหมด

SLO (Service Level Objective)

เป้าหมายตัวเลขที่เราต้องการให้ SLI ไปถึง

SLI ≥ SLO ➡ Users are Happy! 😊

ตัวอย่างการตั้ง SLO:

  • 99.9% ของ HTTP Requests ทั้งหมดในรอบ 30 วัน จะต้องสำเร็จ (ไม่ติด Error 5xx)
  • 99% ของ API Requests ในรอบ 7 วัน จะต้องตอบสนองภายในเวลา 300ms

*คำเตือน: การตั้ง SLO ไม่ควรตั้งจากสิ่งที่ทีม IT ทำได้ แต่ควรตั้งจาก "ความคาดหวังขั้นต่ำที่ทำให้ผู้ใช้งานพึงพอใจ"

ทฤษฎีเลขเก้า (The "Nines" of Availability)

การตั้งเป้าให้ระบบล่ม 0% (Uptime 100%) เป็นเป้าหมายที่แพงและเป็นไปไม่ได้ในทางปฏิบัติ

Availability (Nines) เวลาที่ยอมให้ล่มได้ (ต่อปี) เวลาที่ยอมให้ล่มได้ (ต่อเดือน) เหมาะสำหรับ
99% (Two 9s) 3.65 วัน 7.30 ชั่วโมง เว็บไซต์ภายในองค์กร, ระบบที่ไม่วิกฤต
99.9% (Three 9s) 8.76 ชั่วโมง 43.8 นาที แอปพลิเคชันทั่วไป, E-Commerce ทั่วไป
99.99% (Four 9s) 52.5 นาที 4.38 นาที บริการระบบคลาวด์, Core Services
99.999% (Five 9s) 5.25 นาที 26 วินาที ระบบการเงิน, เครื่องมือแพทย์, โทรคมนาคม

Error Budgets (งบประมาณความผิดพลาด)

Error Budget = 100% - SLO

ถ้ายอมรับความจริงว่าระบบ 100% ไม่มีอยู่จริง พื้นที่ที่เหลือจากเป้าหมาย (เช่น ถ้าตั้ง SLO ไว้ที่ 99.9% งบประมาณที่เรายอมให้พังได้คือ 0.1%) เรียกว่า Error Budget

ทำไมต้องมี?

  • เพื่อเป็น "ข้อตกลงสงบศึก" ระหว่างทีม Dev (อยากเข็นฟีเจอร์ใหม่) และทีม Ops/SRE (อยากให้ระบบเสถียรที่สุด)
  • ใช้อนุญาตให้ทำการทดลอง (Chaos Engineering), ปล่อยฟีเจอร์ใหม่, หรืออัปเดตระบบตราบใดที่ "งบประมาณยังเหลือ"

การตัดสินใจด้วย Error Budgets

🟢

Error Budget เหลือเยอะ

ระบบเสถียรมาก ผู้ใช้มีความสุข


Action:

ปล่อยฟีเจอร์ใหม่รัวๆ, ทดลองเทคโนโลยีใหม่, หรือเพิ่มรอบ Deploy ต่อวัน

🔴

Error Budget หมด (หรือติดลบ)

ระบบเริ่มรวน ผู้ใช้เริ่มบ่น


Action (Freeze!):

หยุด Deploy ฟีเจอร์ใหม่ชั่วคราว, ดึงทีม Dev มาช่วยทีม Ops แก้ Bug และเขียน Test จนกว่ารอบเดือนถัดไป (Budget รีเซ็ต)

🕵️‍♂️

Part 3: พื้นฐานการแก้ไขปัญหา (Troubleshooting)

เมื่อเกิดเหตุฉุกเฉิน (Incident) สัญชาตญาณมนุษย์มักจะนำไปสู่ความตื่นตระหนกและเดาสุ่ม DevOps และ SRE ที่ดีต้องมี "กรอบแนวคิด (Framework)" ในการสืบสวนปัญหา

  • ปัญหาเกี่ยวกับเครื่องฮาร์ดแวร์/OS ➡ ใช้กรอบแนวคิด USE Method
  • ปัญหาเกี่ยวกับ API/Microservices ➡ ใช้กรอบแนวคิด RED Method
  • การประมวลผลข้อมูล ➡ ใช้ทั้ง Metrics และ Logs ควบคู่กัน

The USE Method (สำหรับ Resource/Hardware)

คิดค้นโดย Brendan Gregg เป็นเช็คลิสต์สำหรับวิเคราะห์ "ทุกๆ Resource" ในระบบ (CPU, RAM, Disk, Network)

U

Utilization (การใช้งาน)

สัดส่วนเปอร์เซ็นต์ที่ Resource ถูกใช้งานไป เช่น CPU ทำงานอยู่ที่ 90%

S

Saturation (ความอิ่มตัว)

การมีงานมา "รอคิว (Queue)" มากกว่าที่ระบบจะรับไหว เช่น คิว Disk I/O สูงปรี๊ด

E

Errors (ข้อผิดพลาด)

จำนวนข้อผิดพลาดระดับฮาร์ดแวร์/OS เช่น Network Packet drops หรือ Bad sectors

The RED Method (สำหรับ Services/APIs)

คิดค้นโดย Tom Wilkie สำหรับเฝ้าระวัง Microservices โดยดูจากมุมมองของผู้ใช้งาน (User Experience)

R

Rate (ปริมาณ)

จำนวน Request ที่เข้ามาต่อวินาที (Requests per second) ถ้าร่วงลงกะทันหัน อาจแปลว่าระบบหน้าบ้านพัง

E

Errors (พัง)

จำนวน Request ที่ล้มเหลว (เช่น ขึ้น HTTP 500) ต่อวินาที

D

Duration (ความช้า)

เวลาที่ใช้ในการตอบสนอง (Latency) วัดด้วย Percentile (P95, P99) เช่น ผู้ใช้ 99% โหลดเว็บเสร็จใน 1 วิ

สืบสวนด้วย Metrics (ค้นหา "เกิดอะไรขึ้น?")

Metrics มีไว้เพื่อหาว่า "มีปัญหาอะไร และ สโคปแค่ไหน"

  • เปิดดู Dashboards: ใน Grafana ลองส่องดูภาพกว้าง (Macro view) ว่ากราฟมีการเปลี่ยนแปลงกะทันหันในช่วงเวลาที่มี Alert ไหม
  • กรอง (Filter) ด้วย Labels: หากมี 10 Pods ลองเช็คว่ามันพังทุก Pod หรือพังแค่เฉพาะ Pod ที่อัปเดตเวอร์ชันใหม่
  • เทียบกับอดีต: เทียบกราฟของวันนี้กับวันเดียวกันของสัปดาห์ที่แล้ว (Week-over-week) เพื่อหาสิ่งที่ผิดปกติ

*ข้อดีของ Metrics คือดูได้อย่างรวดเร็วและใช้ทรัพยากรน้อย แต่บอกไม่ได้ลึกว่าบรรทัดไหนใน Code พัง

สืบสวนด้วย Logs (ค้นหา "ทำไมถึงเกิด?")

Logs มีไว้เพื่อหา "สาเหตุเบื้องลึก (Root Cause) ณ จุดเวลานั้น"

  • ค้นหาช่วงเวลาที่แคบลง: หลังจากได้เวลาที่เกิดเหตุจาก Metrics ให้ไปค้นหา Logs (ใน ELK/Kibana) ในกรอบเวลานั้น (+/- 5 นาที)
  • ค้นหาด้วย Keywords: กรองหาคำว่า "ERROR", "Exception", "Timeout"
  • ดูบริบท (Context): อ่าน Stack trace ว่าระบบพังที่ฟังก์ชันไหน? ฐานข้อมูลตาย หรือ API ภายนอกไม่ตอบสนอง?
[ERROR] 2026-04-09 09:50:11 - Database connection timeout. Unable to reach 10.x.x.x

คำสั่งสืบสวนพื้นฐานใน Kubernetes

เมื่อคุณรู้แล้วว่ามี Pod ตัวไหนมีปัญหา เหล่านี้คือคำสั่งเอาชีวิตรอด:

# 1. เช็คเหตุการณ์ที่เกิดขึ้นกับ Pod (หาสาเหตุที่ไม่ยอมรัน)

$ kubectl describe pod [pod-name]

... Events: BackOff (ImagePullBackOff)


# 2. ดู Logs สดของแอปพลิเคชัน

$ kubectl logs [pod-name] --tail=50 -f

# 3. มุดเข้าไปใน Container เพื่อทดสอบ Network/Files

$ kubectl exec -it [pod-name] -- /bin/sh


# 4. ดูการใช้ Resources จริง (CPU/RAM) เทียบกับ Limit

$ kubectl top pod [pod-name]

กฎทอง: บรรเทาผลกระทบก่อน ค่อยหาทางแก้ถาวร

Mitigation vs Resolution

เมื่อระบบล่ม (Downtime) เวลาคือเงิน! หน้าที่แรกของ DevOps คือการทำให้ระบบกลับมาให้บริการลูกค้าได้เร็วที่สุด (Mitigate) ไม่ใช่นั่งอ่าน Code เพื่อหาบั๊ก (Resolve) กลางดึก

ท่าบรรเทาผลกระทบ (Mitigation Actions):

  • Rollback: ย้อนกลับไปใช้ Version ก่อนหน้าที่ทำงานได้ปกติ (K8s: kubectl rollout undo deployment)
  • Scale Out: ถ้าโหลดล้น ก็ยิง Pod หรือเพิ่ม Server เพิ่มเข้าไปชั่วคราว
  • Restart: ถ้า Memory Leak ก็สั่ง Restart Service (เป็นวิธีฉุกเฉิน แต่ได้ผลบ่อย)

ต่อจิ๊กซอว์ด้วย Distributed Tracing

เสาหลักที่ 3 ของ Observability (ถัดจาก Metrics และ Logs)

ในสถาปัตยกรรม Microservices หนึ่ง Request จากผู้ใช้ อาจวิ่งผ่านไป 5-10 Services การใช้ Logs ธรรมดาจะหาทางตามรอยได้ยากมาก

  • Tracing จะแปะ "Trace ID" ที่ไม่ซ้ำกันเข้าไปใน Request ตั้งแต่ทางเข้า (Ingress/Gateway)
  • ID นี้จะถูกส่งต่อไปยังทุก Service ที่รับงานต่อ (เช่น Auth ➡ Backend ➡ DB)
  • เครื่องมืออย่าง Jaeger หรือ Tempo จะนำ ID นี้มาวาดเป็น "แผนภาพเวลา (Waterfall Chart)" ทำให้เห็นชัดเจนว่า Request ไป "คอขวด (Bottleneck)" อยู่ที่ Service ตัวไหน!
📝

Part 4: Post-mortem Analysis

"อย่าปล่อยให้ระบบล่มฟรีๆ จงเรียนรู้จากมัน"

Post-mortem หรือ Incident Report คือกระบวนการเขียนสรุปและวิเคราะห์เหตุการณ์หลังจากที่ระบบล่มและแก้ไขจนกลับมาทำงานปกติได้แล้ว

  • จัดทำขึ้นทุกครั้งที่มี Incident กระทบผู้ใช้อย่างรุนแรง (Sev-1, Sev-2)
  • ไม่ใช่การหาคนผิด แต่เป็นการหาวิธีป้องกันไม่ให้เกิดซ้ำเดิม
  • เป็นเอกสารสำหรับแชร์ความรู้ (Knowledge Sharing) ให้คนทั้งองค์กร

วัฒนธรรมไร้การกล่าวโทษ (Blameless Culture)

Toxic Culture (หาแพะรับบาป)

"ใครเป็นคนพิมพ์คำสั่งนี้? ทำไมถึงสะเพร่าแบบนี้? ไล่ออกเดี๋ยวนี้!"

ผลลัพธ์: วิศวกรจะหวาดกลัว ปิดบังความผิด ไม่กล้าแก้ไขปัญหา หรือโยนความผิดให้ทีมอื่น ไม่เกิดการเรียนรู้

Blameless Culture (วิเคราะห์ระบบ)

"เราเชื่อว่าทุกคนตัดสินใจด้วยเจตนาดีที่สุดจากข้อมูลที่มีในตอนนั้น"

ผลลัพธ์: เราโทษกระบวนการ ไม่ใช่คน (เช่น ทำไมระบบถึงปล่อยให้คนพิมพ์คำสั่งผิดพลาดหลุดขึ้น Production ได้โดยไม่มีคน Review หรือระบบ Test พลาด?)

การวิเคราะห์ต้นตอ (Root Cause Analysis - RCA)

[อ้างอิงจากหลักการ CI/CD RCA] การถามว่า "อะไรที่หายไปในกระบวนการของเรา ที่ปล่อยให้ปัญหานี้หลุดการตรวจสอบภายในและถูกปล่อยออกไปได้?"

เทคนิค "The 5 Whys" (ถามทำไม 5 ครั้ง):

  1. ระบบล่ม ทำไม? ➡ เพราะ Database พัง
  2. Database พัง ทำไม? ➡ เพราะ Disk เต็ม 100%
  3. Disk เต็ม ทำไม? ➡ เพราะ Logs ระบบไม่ได้ตั้งค่าให้ลบอัตโนมัติ (Rotate logs)
  4. ไม่ได้ตั้ง Rotate Logs ทำไม? ➡ เพราะคนเซ็ตอัปครั้งแรกตั้งค่าผิดพลาดใน Ansible
  5. ตั้งค่าผิด ทำไม? ➡ เพราะไม่มีคู่มือมาตรฐาน และไม่มีระบบ Alert แจ้งเตือนเมื่อ Disk เกิน 80% (นี่คือ Root Cause จริงๆ!)

โครงสร้างของเอกสาร Post-mortem

1. ข้อมูลสรุป (Executive Summary)

สรุปสั้นๆ ใน 1-2 ย่อหน้า เกิดอะไรขึ้น กระทบลูกค้ากี่คน ใช้เวลาแก้เท่าไหร่

2. ลำดับเหตุการณ์ (Timeline)

เวลาเริ่มมีปัญหา ➡ เวลาที่ Alert ดัง ➡ เวลาที่เริ่มวิเคราะห์ ➡ เวลาแก้สำเร็จ (ใช้ Log ของเวลาจริงๆ)

3. สาเหตุที่แท้จริง (Root Cause)

คำอธิบายเชิงลึกถึงกระบวนการหรือบั๊กที่เป็นตัวการ (ใช้ The 5 Whys)

4. แผนปฏิบัติการ (Action Items)

งานที่ต้องไปทำต่อเพื่อป้องกันไม่ให้เกิดซ้ำ (ต้องระบุผู้รับผิดชอบและ Ticket Number)

สรุปบทเรียน (Summary)

Exporters: ตัวช่วยแปลงข้อมูลระบบ/แอป เป็น Metrics ให้ Prometheus (Node, Blackbox)
SRE Concepts: SLI (ตัววัดจริง), SLO (เป้าหมายภายใน), Error Budget (โควตาความผิดพลาดเพื่อให้ยังปล่อยของใหม่ได้)
Troubleshooting: ใช้ USE สำหรับ Hardware และ RED สำหรับ Services (บรรเทาผลกระทบก่อน ค่อยแก้ถาวร)
Post-mortem: การเรียนรู้แบบ Blameless โฟกัสไปที่ข้อบกพร่องของระบบและกระบวนการ ไม่ใช่ตัวบุคคล
💬

Q & A

มีคำถามเกี่ยวกับ Monitoring Framework, Error Budgets หรือ Post-mortem ไหมครับ?

เตรียมตัวทำ Lab! 🚨

Next: Alerting & Troubleshooting in Action

ในส่วนปฏิบัติการถัดไป เราจะจำลองสถานการณ์ฉุกเฉิน (Incident) ให้ระบบล่มจริงๆ!

  • สร้างกฎ Alerting Rule ใน Prometheus/Grafana
  • จำลองการก่อกวนระบบ (เช่น CPU usage สูง หรือ Service ล่ม)
  • ใช้คำสั่ง kubectl logs และ kubectl describe เพื่อวิเคราะห์หาจุดพัง (Troubleshooting)
เปิดหน้าจอ Grafana ทิ้งไว้ แล้วสวมบทบาทเป็น On-call Engineer กันในชั่วโมง Lab ครับ!

Lab: Alerting & Troubleshooting 🚨

สวมบทบาทเป็น Site Reliability Engineer (SRE) เฝ้าระวังระบบและสืบสวนสาเหตุเมื่อเกิดปัญหา

🎯 เป้าหมายของ Lab นี้

  • ✅ สร้าง Alerting Rule บน Grafana เพื่อแจ้งเตือนเมื่อ CPU ทำงานหนัก
  • ✅ จำลองสถานการณ์ High CPU Usage ใน Kubernetes Cluster
  • ✅ สังเกตการเปลี่ยนสถานะของการแจ้งเตือน (Pending ➡ Firing)
  • ✅ ฝึกใช้คำสั่ง kubectl describe เพื่อวิเคราะห์ปัญหา Pod ที่สร้างไม่สำเร็จ
  • ✅ ฝึกใช้คำสั่ง kubectl logs เพื่อดู Error Message จาก Application ที่แครช

Step 1: สร้าง Alerting Rule ใน Grafana

เราจะตั้งค่าให้ Grafana คอยเฝ้าดู Metrics จาก Prometheus และแจ้งเตือนเมื่อมี Container ใช้ CPU เกินกำหนด

การตั้งค่าบนหน้าเว็บ Grafana:

  1. ไปที่เมนูซ้ายมือ เลือก AlertingAlert rules ➡ คลิกปุ่ม New alert rule
  2. Step 1 (Query): ตั้งชื่อ Rule เช่น High CPU Alert เลือก Data source เป็น Prometheus และใส่ PromQL:
    sum(rate(container_cpu_usage_seconds_total{namespace="default"}[1m])) * 100 > 80
  3. Step 2 (Condition): เลือก Condition เป็น A (อ้างอิงจาก Query A) IS ABOVE 80
  4. Step 3 (Details): ในช่อง Folder เลือก (หรือสร้าง) โฟลเดอร์ชื่อ K8s Alerts และ Evaluation group ให้ตั้งรันทุกๆ 1m (1 นาที)
  5. คลิกปุ่ม Save rule and exit ที่มุมขวาบน

Step 2: จำลองปัญหา CPU Usage สูง

เราจะสร้าง Pod วายร้ายที่กินทรัพยากร CPU 100% อย่างต่อเนื่อง เพื่อทดสอบว่า Alert ของเราทำงานหรือไม่

# 1. รัน Pod ด้วย Image busybox และสั่งให้ทำ Infinite Loop (วนลูปไม่รู้จบ)

$ kubectl run cpu-hog --image=busybox --restart=Never -- /bin/sh -c "while true; do :; done"

pod/cpu-hog created


# 2. ตรวจสอบการกินทรัพยากร (อาจต้องรอสัก 1-2 นาทีให้ Metrics Server เก็บข้อมูล)

$ kubectl top pod cpu-hog

NAME CPU(cores) MEMORY(bytes) cpu-hog 999m 1Mi

*หมายเหตุ: 999m หมายถึงกิน CPU ไปเกือบ 1 Core เต็มๆ (1000 millicores = 1 CPU)

Step 3: สังเกตการทำงานของ Alert (Firing)

กลับไปที่หน้าจอกราฟหรือหน้า Alerting ของ Grafana เพื่อดูพฤติกรรมของระบบ

วงจรของ Alert State:

  • 🟢 Normal: ค่า CPU ยังต่ำกว่า 80% (ปกติ)
  • 🟡 Pending: ค่า CPU ทะลุ 80% แล้ว แต่กำลังรอดูให้แน่ใจตามระยะเวลาที่กำหนด (หลีกเลี่ยง False Positive)
  • 🔴 Firing: ค่า CPU ทะลุ 80% ต่อเนื่อง Alert จะถูกยิงออกไป (ส่งเข้า Slack, Email ฯลฯ)
🔥
FIRING

High CPU Alert

Active since: 1 minute ago

✅ เมื่อเห็นสถานะเป็น FIRING ถือว่าการตั้งค่า Alert สำเร็จ ให้คุณเคลียร์ Pod ทิ้งด้วยคำสั่ง kubectl delete pod cpu-hog

Step 4: ฝึกสืบสวนด้วย kubectl describe

สมมติว่ามีการ Deploy ระบบ แต่รันไม่ขึ้น เราจะใช้คำสั่ง describe เพื่อดู "เหตุการณ์ (Events)" ระดับ Cluster

# 1. จำลองการสร้าง Pod โดยพิมพ์ชื่อ Image ผิด

$ kubectl run web-broken --image=nginx:v999


# 2. ลอง get pods ดู จะพบความผิดปกติ

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

web-broken 0/1 ImagePullBackOff 0 45s


# 3. ใช้ describe เพื่อหาสาเหตุ

$ kubectl describe pod web-broken

... (เลื่อนลงไปล่างสุดที่หัวข้อ Events)

Events:

Type Reason Age From Message

---- ------ ---- ---- -------

Normal Pulling 15s (x3 over 45s) kubelet Pulling image "nginx:v999"

Warning Failed 14s (x3 over 44s) kubelet Failed to pull image "nginx:v999": rpc error: code = NotFound...

Warning Failed 14s (x3 over 44s) kubelet Error: ErrImagePull

Step 5: ฝึกสืบสวนด้วย kubectl logs

คำสั่ง describe บอกปัญหาภายนอก (เช่น ดึง Image ไม่ได้) แต่ถ้าแอปพัง "จากภายใน" เราต้องดูด้วย logs

# 1. จำลองแอปพลิเคชันที่แครชทันที (รันแล้วพ่น Error ใส่ Console)

$ kubectl run db-crash --image=busybox --restart=Never -- /bin/sh -c "echo 'FATAL: Connection Refused. Invalid Password' && exit 1"


# 2. ดูสถานะ Pod จะเห็นว่า Error (หรือ CrashLoopBackOff ถ้ารันผ่าน Deployment)

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

db-crash 0/1 Error 0 10s


# 3. เจาะดู Log ภายใน Container

$ kubectl logs db-crash

FATAL: Connection Refused. Invalid Password

💡 สรุปทริคจำง่าย:
- พังก่อนรัน (Pending, ImagePullBackOff) ➡ ใช้ kubectl describe
- พังตอนรัน (Error, CrashLoopBackOff) ➡ ใช้ kubectl logs
🩺

Lab Complete! การส่งงาน

รายละเอียดสิ่งที่ต้องส่ง (Submission):

  • ภาพที่ 1: Grafana Alert

    แคปเจอร์หน้าจอ Grafana ที่แสดงสถานะ Alert Rule "High CPU Alert" ขึ้นเป็นสีแดง (FIRING)

  • ภาพที่ 2: การใช้ kubectl describe

    แคปเจอร์หน้าจอ Terminal ของคำสั่ง kubectl describe pod web-broken โดยให้เห็นบรรทัด Events ที่แจ้งเตือน Failed to pull image

  • ภาพที่ 3: การใช้ kubectl logs

    แคปเจอร์หน้าจอ Terminal ของคำสั่ง kubectl logs db-crash ที่โชว์ข้อความ Error สีแดงจากตัวแอปพลิเคชัน

ลบ Pod ที่จำลองปัญหาทิ้งให้เรียบร้อยด้วย kubectl delete pod cpu-hog web-broken db-crash