Hướng dẫn cài đặt và cấu hình kube-state-metrics: Giám sát Pod Restarts, Deployment và Resource Quota trên Kubernetes

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

Sự cố lúc 2 giờ sáng: Khi server vẫn xanh nhưng dịch vụ đã chết

2:15 sáng, hệ thống PagerDuty rung liên tục vì cổng thanh toán trả về hàng loạt lỗi 502 Bad Gateway. Mở nhanh dashboard hạ tầng, mọi thứ trông vẫn rất bình thường: CPU cả cụm chỉ ăn 18%, RAM còn trống hơn một nửa, Disk I/O ổn định.

Nhưng khi chạy lệnh kiểm tra Pod trên production:

kubectl get pods -n production -l app=payment-service

Toàn bộ 4 Pod của dịch vụ thanh toán đang kẹt ở trạng thái CrashLoopBackOff. Số lần restart đã vọt lên 37 lần trong 30 phút do lỗi tràn bộ nhớ (OOMKilled). Cùng lúc đó ở namespace staging, một Deployment mới cập nhật đứng im ở mức 0/3 Pod khả dụng suốt 2 tiếng mà không ai hay biết. Lý do là namespace đã chạm trần ResourceQuota CPU, khiến Kubernetes Scheduler âm thầm từ chối xếp lịch.

Bài học ở đây rất rõ ràng. Các công cụ như node-exporter hay cAdvisor chỉ đo tải phần cứng của máy chủ. Chúng không thể cho bạn biết trạng thái logic của các đối tượng Kubernetes. Để theo dõi số lần Pod restart, độ lệch replica của Deployment hay hạn ngạch tài nguyên, bạn cần kube-state-metrics.

kube-state-metrics hoạt động như thế nào?

Trong hệ sinh thái giám sát Kubernetes, mỗi công cụ đảm nhận một tầng dữ liệu riêng biệt:

  • cAdvisor / metrics-server: Đo lường tài nguyên thực tế (số millicores CPU, dung lượng megabytes RAM, byte mạng I/O) mà container đang tiêu thụ. Dữ liệu này phục vụ cho lệnh kubectl top và bộ tự động co giãn HPA.
  • kube-state-metrics (KSM): Kết nối trực tiếp vào Kubernetes API Server qua cơ chế watch của client-go. KSM không đo CPU/RAM thực tế. Thay vào đó, nó phản ánh trạng thái khai báo và tình trạng sức khỏe của object: Pod đang Pending hay Running, container restart bao nhiêu lần, Deployment có đủ Pod hay không, và ResourceQuota đã dùng hết bao nhiêu phần trăm.

Toàn bộ metadata này được KSM chuẩn hóa thành định dạng Prometheus metrics tại cổng :8080/metrics để Prometheus định kỳ cào dữ liệu (scrape).

3 nhóm chỉ số quan trọng cần đưa vào dashboard

  • kube_pod_container_status_restarts_total: Đếm tổng số lần container bị khởi động lại. Đây là dấu hiệu cảnh báo sớm của lỗi rò rỉ bộ nhớ (memory leak) hoặc crash do unhandled exception.
  • kube_deployment_status_replicas_available và kube_deployment_spec_replicas: Đo độ lệch giữa số Pod thực tế đang nhận traffic và số lượng mong muốn trong cấu hình YAML.
  • kube_resourcequota: Kiểm soát mức tiêu thụ tài nguyên theo namespace, tránh tình trạng cụm âm thầm chặn tạo Pod mới.

Các bước cài đặt và cấu hình kube-state-metrics

Thay vì phải gõ kubectl describe thủ công mỗi khi có sự cố, bạn có thể triển khai KSM qua Helm và tạo các rule cảnh báo tự động chỉ trong vài phút.

Bước 1: Cài đặt kube-state-metrics qua Helm

Sử dụng Helm chart chính thức từ Prometheus Community để triển khai lên cụm:

# Thêm repository chính thức
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# Triển khai vào namespace kube-system
helm install kube-state-metrics prometheus-community/kube-state-metrics \
  --namespace kube-system \
  --set replicas=1 \
  --set metricLabelsAllowlist.pods="[app,version,tier]"

Tham số metricLabelsAllowlist.pods giúp chọn lọc nhãn (labels) cần giữ lại. Mặc định KSM bỏ qua label để tránh bùng nổ số lượng time series (high cardinality). Bạn chỉ nên giữ lại các nhãn phục vụ lọc alert như app hoặc version.

Bước 2: Xác thực dữ liệu đầu ra

Trước hết, kiểm tra xem Pod KSM đã chạy ổn định chưa:

kubectl get pods -n kube-system -l app.kubernetes.io/name=kube-state-metrics

Sau khi Pod chuyển sang trạng thái Running, mở cổng forward về máy để kiểm tra luồng metrics:

kubectl port-forward -n kube-system svc/kube-state-metrics 8080:8080

Chạy lệnh curl trên một cửa sổ terminal khác:

curl -s http://localhost:8080/metrics | grep kube_pod_container_status_restarts_total | head -n 5

Kết quả mẫu trả về sẽ có dạng:

kube_pod_container_status_restarts_total{container="payment-api",namespace="production",pod="payment-service-789f6d4d5-x8k2l"} 37

Bước 3: Thiết lập job thu thập trên Prometheus

Nếu dùng cụm Prometheus cài độc lập, bạn thêm job sau vào file prometheus.yml:

scrape_configs:
  - job_name: 'kube-state-metrics'
    static_configs:
      - targets: ['kube-state-metrics.kube-system.svc.cluster.local:8080']
    scrape_interval: 30s

Sau khi reload Prometheus, truy cập mục Status > Targets trên UI để kiểm tra trạng thái target. Endpoint phải hiển thị màu xanh UP.

Bước 4: 3 câu truy vấn PromQL quan trọng cho hệ thống Alert

Để nhận cảnh báo trước khi người dùng báo lỗi, bạn nên nạp 3 biểu thức PromQL này vào Alertmanager:

1. Cảnh báo container restart dồn dập (hơn 2 lần trong 15 phút)

increase(kube_pod_container_status_restarts_total[15m]) > 2

Hàm increase() tính số lần tăng thêm trong 15 phút. Nếu Pod crash liên tục do thiếu RAM hoặc panic code, rule này sẽ kích hoạt ngay lập tức.

2. Phát hiện Deployment thiếu Pod sẵn sàng

(kube_deployment_spec_replicas - kube_deployment_status_replicas_available) > 0

Biểu thức này phát hiện sự chênh lệch giữa số Pod mong muốn và số Pod thực sự phục vụ được request. Nhờ đó, bạn sẽ bắt được ngay các lỗi như ImagePullBackOff hoặc Pod trượt readinessProbe.

3. Cảnh báo Resource Quota CPU đạt ngưỡng 85%

kube_resourcequota{type="used", resource="requests.cpu"}
/ on(namespace, resourcequota) 
kube_resourcequota{type="hard", resource="requests.cpu"} > 0.85

Biểu thức so sánh tài nguyên đã đăng ký với hạn mức tối đa của namespace. Khi chạm ngưỡng 85%, đội vận hành sẽ có đủ thời gian nâng hạn ngạch trước khi Kubernetes từ chối tạo thêm Pod.

Lời kết

Giám sát Kubernetes không thể dừng lại ở mức đo CPU và RAM của máy chủ. Cài đặt kube-state-metrics giúp bạn theo dõi sát sao tình trạng của từng Pod, Deployment và Quota trong cụm. Bạn nên thiết lập sẵn các rule cảnh báo này ngay từ ngày đầu dựng hệ thống để chủ động xử lý sự cố trước khi dịch vụ bị gián đoạn.

Share: