Giám sát Kubernetes Cluster với Prometheus Operator và Grafana: Tự động thu thập metrics

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

Với Kubernetes, làm sao để biết hệ thống đang hoạt động thế nào là một trong những thách thức lớn nhất. Các pod có chạy ổn định không? Node có bị quá tải tài nguyên không? Ứng dụng của bạn có đang gặp vấn đề về hiệu suất mà bạn chưa biết? Nếu không có một hệ thống giám sát đúng đắn, việc quản lý một Kubernetes cluster giống như lái xe trong sương mù – bạn chẳng thấy đường đi đâu cả.

Trước đây, khi còn làm monitoring cho các server vật lý hay máy ảo, mình thường cài đặt Prometheus và Grafana thủ công. Mình định nghĩa các scrape_configs trong file prometheus.yml để thu thập metrics từ Node Exporter hay cAdvisor.

Cách đó hiệu quả cho số lượng server ít. Nhưng khi chuyển sang Kubernetes với hàng trăm, thậm chí hàng nghìn pod thay đổi liên tục, việc cấu hình thủ công trở nên bất khả thi. Các pod sinh ra, chết đi, IP thay đổi liên tục, làm sao Prometheus có thể tự động biết để thu thập metrics đây?

Đó là lúc Prometheus Operator xuất hiện như một vị cứu tinh. Bài viết này sẽ hướng dẫn bạn cách triển khai Prometheus Operator và Grafana để tự động giám sát Kubernetes cluster, giúp bạn chủ động phát hiện và xử lý sự cố.

Quick Start: Triển khai Prometheus Operator và Grafana trong 5 phút

Để bạn thấy ngay kết quả, chúng ta sẽ cài đặt toàn bộ stack giám sát lên cluster bằng Helm. Stack này bao gồm Prometheus Operator, Prometheus, Grafana, Alertmanager, Node Exporter và Kube-state-metrics. Đảm bảo bạn đã cài đặt Helm và có quyền truy cập vào Kubernetes cluster.

1. Thêm Helm repository

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

2. Cài đặt kube-prometheus-stack

kube-prometheus-stack là một gói Helm bao gồm Prometheus Operator và tất cả các thành phần cần thiết khác.

helm install prometheus prometheus-community/kube-prometheus-stack --namespace monitoring --create-namespace

Lệnh này sẽ tạo một namespace mới tên là monitoring và triển khai toàn bộ stack vào đó. Quá trình này có thể mất vài phút.

3. Truy cập Grafana

Sau khi các pod đã chạy ổn định, bạn cần port-forward để truy cập Grafana dashboard. Đầu tiên, lấy mật khẩu admin của Grafana:

kubectl get secret prometheus-grafana -n monitoring -o jsonpath="{.data.admin-password}" | base64 --decode

Sau đó, port-forward dịch vụ Grafana:

kubectl port-forward service/prometheus-grafana 3000:80 -n monitoring

Bây giờ, mở trình duyệt và truy cập http://localhost:3000. Đăng nhập với username admin và mật khẩu vừa lấy được. Bạn sẽ thấy hàng loạt dashboard có sẵn để giám sát Kubernetes cluster của mình!

Giải thích Chi tiết: Tại sao cần Prometheus Operator cho Kubernetes?

Vấn đề: Giám sát Kubernetes phức tạp

Kubernetes là một hệ thống phân tán phức tạp với nhiều thành phần động: các Node, Pod, Service, Deployment, StatefulSet, Ingress, Controller,… Mỗi thành phần đều có trạng thái và hiệu suất riêng. Việc theo dõi thủ công từng thứ một là không khả thi. Hơn nữa, các Pod được tạo ra và hủy đi liên tục, IP thay đổi, điều này làm cho việc cấu hình tĩnh cho Prometheus trở nên vô dụng.

Nguyên nhân: Tính động của Kubernetes

Tính chất động của Kubernetes là nguyên nhân chính gây khó khăn cho việc giám sát truyền thống. Prometheus cần biết các target (điểm cuối cung cấp metrics) để thu thập dữ liệu. Trong môi trường tĩnh, bạn chỉ cần liệt kê các IP. Nhưng với Kubernetes, các Pod có thể được scale up/down, di chuyển giữa các Node, hoặc thay đổi IP bất cứ lúc nào.

Giải pháp: Prometheus Operator và Grafana

Đây là lúc Prometheus Operator và Grafana phát huy sức mạnh.

  • Prometheus Operator: Đây là một Kubernetes Operator, được xây dựng để tự động hóa việc triển khai, quản lý và vận hành Prometheus trên Kubernetes. Thay vì cấu hình Prometheus thủ công, bạn định nghĩa các tài nguyên tùy chỉnh (Custom Resources – CRDs), chẳng hạn như Prometheus, ServiceMonitor, PodMonitor, hay Alertmanager. Operator sẽ đọc các định nghĩa này để tự động tạo và quản lý các đối tượng Prometheus tương ứng.
  • ServiceMonitor và PodMonitor: Đây là hai CRD quan trọng nhất của Prometheus Operator. Chúng cho phép bạn định nghĩa cách Prometheus sẽ tự động phát hiện và thu thập metrics từ các Service hoặc Pod trong cluster dựa trên các label selector. Điều này giải quyết hoàn toàn vấn đề tính động của Kubernetes.
  • Grafana: Là công cụ visualization mạnh mẽ. Nó kết nối với Prometheus để truy vấn dữ liệu metrics và hiển thị chúng dưới dạng biểu đồ, bảng biểu dễ hiểu thông qua các dashboard.

Kiến trúc hệ thống giám sát Kubernetes

Khi sử dụng kube-prometheus-stack, hệ thống giám sát của bạn sẽ có kiến trúc như sau:

  • Node Exporter: Triển khai dưới dạng DaemonSet, chạy trên mỗi Node để thu thập metrics về tài nguyên Node (CPU, RAM, Disk, Network).
  • Kube-state-metrics: Thu thập metrics về trạng thái của các đối tượng Kubernetes (số lượng Pod đang chạy, Deployment bị lỗi, PersistentVolume đang sử dụng,…).
  • Prometheus: Là trái tim của hệ thống, thu thập metrics từ Node Exporter, Kube-state-metrics và các ứng dụng của bạn thông qua ServiceMonitor/PodMonitor.
  • Prometheus Operator: Giám sát các CRD (Prometheus, ServiceMonitor, PodMonitor, Alertmanager) và đảm bảo Prometheus và Alertmanager instances được cấu hình và chạy đúng cách.
  • Alertmanager: Xử lý các cảnh báo được tạo ra từ Prometheus, gửi thông báo đến các kênh khác nhau (email, Slack, Telegram,…).
  • Grafana: Kết nối với Prometheus để hiển thị dữ liệu và dashboard.

Nâng cao: Tự động thu thập metrics với ServiceMonitor

Điểm mạnh của Prometheus Operator chính là khả năng tự động khám phá các Service/Pod để thu thập metrics. Giả sử bạn có một ứng dụng web chạy trong Kubernetes và nó expose metrics ở path /metrics trên port 8080. Bạn có thể tạo một ServiceMonitor để Prometheus tự động thu thập metrics từ Service của ứng dụng đó.

Ví dụ về ServiceMonitor

Đầu tiên, ứng dụng của bạn cần có một Service để Prometheus có thể tiếp cận:

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
  labels:
    app: my-app
spec:
  selector:
    app: my-app
  ports:
  - name: web
    port: 80
    targetPort: 8080 # Port mà ứng dụng expose metrics

Sau đó, tạo một ServiceMonitor để Prometheus biết cách thu thập metrics từ Service này:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: my-app-servicemonitor
  labels:
    app: my-app # Label này quan trọng, Prometheus Operator sẽ dùng nó để chọn ServiceMonitor
spec:
  selector:
    matchLabels:
      app: my-app # Chọn Service có label app: my-app
  endpoints:
  - port: web # Tên port từ Service ở trên
    path: /metrics # Đường dẫn metrics của ứng dụng
  namespaceSelector:
    matchNames:
    - default # Hoặc namespace chứa ứng dụng của bạn

Khi bạn apply file YAML này, Prometheus Operator sẽ phát hiện ServiceMonitor mới. Nó sẽ tự động cấu hình Prometheus để bắt đầu scrape metrics từ my-app-service tại port web và path /metrics. Bạn không cần chỉnh sửa file cấu hình Prometheus thủ công nữa!

Cấu hình Rule và Alertmanager

kube-prometheus-stack cũng bao gồm Alertmanager và các PrometheusRule CRD. Bạn có thể định nghĩa các rule cảnh báo (ví dụ: CPU usage của Pod vượt quá 80% trong 5 phút) bằng cách tạo một tài nguyên PrometheusRule:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: my-app-alerts
  labels:
    app: my-app
spec:
  groups:
  - name: my-app.rules
    rules:
    - alert: HighCpuUsage
      expr: sum(rate(container_cpu_usage_seconds_total{namespace="default", pod=~"my-app.*"}[5m])) by (pod) > 0.8
      for: 5m
      labels:
        severity: critical
      annotations:
        summary: "CPU usage for pod {{ $labels.pod }} is high"
        description: "Pod {{ $labels.pod }} has been using more than 80% CPU for 5 minutes."

Prometheus Operator sẽ tự động tải các rule này vào Prometheus, và khi điều kiện cảnh báo được đáp ứng, Prometheus sẽ gửi cảnh báo đến Alertmanager. Alertmanager sẽ xử lý và gửi thông báo đến các kênh bạn đã cấu hình (ví dụ: Slack, email).

Tips thực tế và Kinh nghiệm cá nhân

Giám sát ứng dụng của mình

Để tận dụng tối đa hệ thống giám sát này, các ứng dụng của bạn cũng cần expose metrics theo định dạng Prometheus. Hầu hết các framework hiện đại đều có thư viện hỗ trợ: ví dụ Spring Boot có Actuator, Node.js có prom-client, Python có prometheus_client. Chỉ cần thêm dependency, cấu hình expose metrics ở một endpoint (thường là /metrics), và tạo ServiceMonitor là xong.

Kinh nghiệm xương máu

Hệ thống monitoring của mình hiện tại gồm Prometheus + Grafana theo dõi khoảng 15 server vật lý và một Kubernetes cluster lớn. Setup này đã nhiều lần giúp mình phát hiện sự cố trước khi người dùng kịp báo.

Có lần, một ứng dụng trong K8s bắt đầu có độ trễ cao, mình thấy ngay trên Grafana dashboard là số lượng request thành công giảm và thời gian phản hồi tăng vọt. Nhờ cảnh báo từ Alertmanager, mình đã kịp thời scale up số lượng pod và tìm ra root cause trước khi nó ảnh hưởng rộng rãi đến user. Nếu không có monitoring, có lẽ đã phải đợi đến khi user báo lỗi mới biết, lúc đó thì đã muộn rồi!

Lưu trữ dài hạn (Long-term storage)

Prometheus mặc định chỉ lưu trữ dữ liệu trong một khoảng thời gian nhất định (thường là vài tuần đến vài tháng) trên ổ đĩa cục bộ. Đối với phân tích xu hướng dài hạn hoặc tuân thủ quy định, bạn có thể cần giải pháp lưu trữ dài hạn như Thanos hoặc Cortex. Những giải pháp này cho phép Prometheus lưu trữ dữ liệu vào các object storage như S3, GCS.

Bảo mật Grafana

Luôn đổi mật khẩu admin mặc định của Grafana. Cân nhắc tích hợp Grafana với hệ thống xác thực tập trung (LDAP/OAuth) nếu bạn có nhiều người dùng. Đảm bảo Grafana không bị lộ ra Internet một cách không cần thiết. Nếu bắt buộc phải expose, hãy đặt nó phía sau một Ingress Controller với cấu hình bảo mật chặt chẽ (ví dụ: HTTPS, xác thực cơ bản).

Kết luận

Prometheus Operator và Grafana tạo thành một bộ đôi mạnh mẽ và linh hoạt để giám sát hiệu suất và sức khỏe của Kubernetes cluster. Với khả năng tự động khám phá và thu thập metrics, bạn có thể dễ dàng mở rộng hệ thống giám sát của mình mà không cần tốn nhiều công sức cấu hình thủ công. Hãy triển khai ngay để có cái nhìn sâu sắc về hệ thống Kubernetes của bạn!

Share: