Lab 8.5 - Thiết lập Alerting với Prometheus và Alertmanager
Phần 7 - Debug Alerting và Best Practices trong Production
Sau phần 6, chúng ta đã kiểm thử thành công toàn bộ vòng đời của Alert:
Inactive
↓
Pending
↓
Firing
↓
Resolved
Chúng ta đã tạo ra các tình huống thực tế:
- Backend bị down.
- API trả về HTTP 500.
- Pod restart liên tục.
- CPU tăng cao.
Tuy nhiên, trong môi trường Production, việc tạo được Alert chưa đủ.
Một hệ thống Alert tốt cần đảm bảo:
- Alert đúng vấn đề.
- Alert đúng thời điểm.
- Alert gửi tới đúng người.
- Không tạo quá nhiều cảnh báo gây nhiễu.
Nếu thiết kế Alert không tốt, DevOps có thể rơi vào tình trạng:
1000 Alerts / ngày
↓
Không ai đọc Alert nữa
↓
Bỏ qua cả Alert quan trọng
Hiện tượng này gọi là:
Alert Fatigue
1. Alert Fatigue là gì?
Alert Fatigue (mệt mỏi vì cảnh báo) xảy ra khi hệ thống gửi quá nhiều cảnh báo không cần thiết.
Ví dụ:
Mỗi ngày nhận:
CPU Warning
CPU Warning
CPU Warning
Memory Warning
Memory Warning
Pod Restart
CPU Warning
Sau một thời gian:
DevOps sẽ có xu hướng:
- Ignore Email.
- Tắt Notification.
- Không kiểm tra Alert nữa.
Kết quả:
Một sự cố thật sự xảy ra nhưng không ai phản ứng.
Nguyên tắc tạo Alert
Một Alert tốt phải trả lời được câu hỏi:
"Nếu Alert này xảy ra, tôi có cần hành động ngay không?"
Nếu câu trả lời là:
Không
thì có thể Alert đó không cần tồn tại.
2. Alert nào nên tạo trong Production?
Không phải mọi Metric đều cần Alert.
Ví dụ:
Grafana có thể hiển thị:
- CPU.
- Memory.
- Disk.
- Network.
Nhưng không nhất thiết tất cả đều cần Alert.
Nhóm 1: Availability Alert
Đây là nhóm Alert quan trọng nhất.
Mục tiêu:
Phát hiện hệ thống không phục vụ được người dùng.
Application Down
Ví dụ:
up{job="todo-api"} == 0
Ý nghĩa:
Prometheus không scrape được ứng dụng.
Alert:
alert: TodoApiDown
severity: critical
Đây là Alert cần phản ứng ngay.
Kubernetes Pod Down
Ví dụ:
kube_pod_status_phase{
phase="Failed"
}
Phát hiện:
- Pod Failed.
- Container crash.
Nhóm 2: Error Rate Alert
Không phải lúc nào ứng dụng Down mới là lỗi.
Một ứng dụng có thể:
Pod Running
Service Running
Container Running
nhưng:
90% request trả về HTTP 500
Người dùng vẫn không sử dụng được.
Ví dụ:
rate(
http_server_requests_seconds_count{
status=~"5.."
}[5m]
)
Alert:
alert: HighHTTP5xxRate
severity: critical
Nhóm 3: Latency Alert
Người dùng thường cảm nhận vấn đề qua tốc độ phản hồi.
Ví dụ:
Bình thường:
50ms
Sau sự cố:
3000ms
Ứng dụng vẫn:
Running
nhưng trải nghiệm người dùng rất tệ.
Ví dụ:
(
rate(
http_server_requests_seconds_sum[5m]
)
/
rate(
http_server_requests_seconds_count[5m]
)
)
> 1
Ý nghĩa:
Latency trung bình:
> 1 giây
Nhóm 4: Resource Alert
CPU
CPU cao liên tục có thể gây:
- Response chậm.
- Request timeout.
- HPA scale.
Ví dụ:
CPU > 90%
trong 10 phút
Memory
Memory nguy hiểm hơn CPU.
Nếu vượt giới hạn:
OOMKilled
Pod bị Kubernetes kill.
Ví dụ:
Memory > 90%
trong 5 phút
Nhóm 5: Kubernetes Stability Alert
Một hệ thống Production cần theo dõi sự ổn định của Pod.
Pod Restart
Ví dụ:
increase(
kube_pod_container_status_restarts_total[10m]
)
> 5
Phát hiện:
- CrashLoopBackOff.
- Exception.
- Configuration Error.
Pending Pod
Ví dụ:
kube_pod_status_phase{
phase="Pending"
}
Nguyên nhân:
- Thiếu CPU.
- Thiếu Memory.
- Node lỗi.
3. Severity trong Alert
Không phải Alert nào cũng quan trọng như nhau.
Thông thường chia thành:
Critical
Warning
Info
Critical
Cần xử lý ngay.
Ví dụ:
severity: critical
Ví dụ:
- API Down.
- Database Down.
- HTTP 500 tăng mạnh.
Notification:
Email
Slack
PagerDuty
Warning
Cần theo dõi.
Ví dụ:
severity: warning
Ví dụ:
- CPU 80%.
- Memory 85%.
- Latency tăng nhẹ.
Notification:
Slack
Info
Chỉ mang tính thông báo.
Ví dụ:
Deployment completed
Không cần gửi Notification.
4. Sử dụng Labels để phân loại Alert
Ví dụ:
labels:
severity: critical
team: backend
service: todo-api
Khi Alert gửi tới Alertmanager:
Thông tin này được sử dụng để routing.
Ví dụ:
team=backend
↓
Backend Team nhận
5. Routing Alert trong Alertmanager
Trong Production thường có nhiều team:
Backend Team
Frontend Team
Database Team
Infrastructure Team
Không nên gửi tất cả Alert cho mọi người.
Ví dụ:
route:
routes:
- match:
team: backend
receiver: backend-slack
- match:
team: database
receiver: database-slack
Kết quả:
Todo API Error
↓
Backend Team
PostgreSQL Down
↓
Database Team
6. Tránh Alert dựa trên một Metric đơn lẻ
Một lỗi phổ biến:
Tạo Alert:
CPU > 80%
Ngay lập tức.
Vấn đề:
Một hệ thống có thể bình thường khi CPU tăng trong thời gian ngắn.
Ví dụ:
Deploy Application
↓
CPU 95%
↓
30 giây
↓
CPU bình thường
Không cần Alert.
Nên dùng:
for: 10m
Ví dụ:
CPU > 90%
liên tục 10 phút
7. Sử dụng Multi-condition Alert
Alert tốt thường kết hợp nhiều điều kiện.
Ví dụ:
CPU cao + Request tăng:
CPU > 90%
AND
Request Rate > 1000 req/s
Điều này chính xác hơn.
8. Không Alert mọi thứ
Một số Metric chỉ nên xem trên Grafana.
Ví dụ:
Không nên Alert:
CPU tăng 60%
Disk I/O tăng nhẹ
Thread tăng 10%
Vì đây chỉ là thông tin quan sát.
Nên Alert:
User Impact
System Failure
Data Loss Risk
9. Checklist Debug khi Alert không hoạt động
Khi Alert không chạy, kiểm tra theo thứ tự.
Bước 1: Prometheus có Metric không?
Ví dụ:
up{job="todo-api"}
Nếu không có dữ liệu:
Kiểm tra:
- Service.
- Endpoint.
- Scrape Config.
Bước 2: Prometheus có Load Rule không?
Vào:
Prometheus
↓
Status
↓
Rules
Phải thấy:
todo-alerts
Bước 3: Test PromQL
Copy biểu thức Alert vào Query.
Ví dụ:
up{job="todo-api"} == 0
Nếu không có kết quả:
Alert không thể chạy.
Bước 4: Kiểm tra Alertmanager
Prometheus:
Status
↓
Runtime & Build Information
Kiểm tra:
Alertmanagers
Bước 5: Kiểm tra Alertmanager Log
kubectl logs \
prometheus-alertmanager-0 \
-n monitoring
10. Production Alert Checklist
Một hệ thống Kubernetes Production nên có tối thiểu:
| Alert | Mức độ |
|---|---|
| Application Down | Critical |
| HTTP 5xx tăng cao | Critical |
| Database Down | Critical |
| Pod Restart | Warning |
| Pod Pending | Warning |
| Memory gần giới hạn | Warning |
| CPU cao kéo dài | Warning |
| Node Down | Critical |
| Disk đầy | Critical |
| Certificate hết hạn | Warning |
11. Tổng kết Lab 8
Sau toàn bộ Lab 8, chúng ta đã xây dựng được hệ thống Alerting hoàn chỉnh:
Kubernetes
|
▼
Export Metrics
|
▼
Prometheus
|
Evaluate Rules
|
▼
Alertmanager
/ \
/ \
Email Slack
\ /
\ /
DevOps Team
Bạn đã hiểu:
✅ Alert Rule ✅ PromQL Alert Expression ✅ Alert Lifecycle ✅ Pending ✅ Firing ✅ Resolved ✅ Alertmanager ✅ Email Notification ✅ Slack Notification ✅ Severity ✅ Routing ✅ Alert Best Practices
Bài học rút ra
Monitoring trả lời câu hỏi:
"Điều gì đang xảy ra với hệ thống?"
Alerting trả lời câu hỏi:
"Khi nào chúng ta cần hành động?"
Một hệ thống Production tốt không chỉ cần Dashboard đẹp.
Nó cần khả năng:
- Tự phát hiện sự cố.
- Thông báo đúng người.
- Giảm thời gian phản ứng.
- Giúp DevOps xử lý vấn đề trước khi người dùng bị ảnh hưởng.
Chuẩn bị cho Lab 9
Ở Lab 9, chúng ta sẽ hoàn thiện bộ ba Observability:
Metrics
+
Alerting
+
Logging
Chúng ta sẽ triển khai:
- Centralized Logging.
- Thu thập log từ Kubernetes Pod.
- Loki.
- Promtail.
- Grafana Logs Explorer.
Khi đó DevOps có thể đi theo toàn bộ quy trình xử lý sự cố:
Alert nhận được
↓
Xem Metrics
↓
Xác định vấn đề
↓
Xem Logs
↓
Tìm nguyên nhân gốc
Đây chính là quy trình vận hành một hệ thống Kubernetes Production thực tế.
All Rights Reserved