Triển khai Prometheus Operator trên Kubernetes
Chúng ta sẽ sử dụng Helm để deploy kube-prometheus-stack, đây là giải pháp chuẩn de facto để vận hành Prometheus trong Kubernetes. Package này bao gồm Prometheus, Alertmanager, Grafana và các service discovery tự động.
Tại sao dùng Operator: Nó tự động quản lý vòng đời của Prometheus, tự động phát hiện service mới, và đồng bộ cấu hình scrape_config mà không cần restart pod.
Kết quả mong đợi: Một Pod prometheus-kube-prometheus-prometheus chạy ở trạng thái Running và có thể truy cập web UI.
Trước tiên, thêm repository của Prometheus Community vào Helm client.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
Helm sẽ trả về thông báo Successfully added và cập nhật các chart mới nhất.
Tạo thư mục để chứa file cấu hình custom cho việc triển khai hybrid, đảm bảo cấu hình không bị overwrite khi upgrade sau này.
mkdir -p ~/observability/prometheus-hybrid
cd ~/observability/prometheus-hybrid
Hệ thống sẽ chuyển vào thư mục vừa tạo.
Sử dụng lệnh helm template để render ra file values.yaml mặc định, sau đó chỉnh sửa theo yêu cầu hybrid.
helm show values prometheus-community/kube-prometheus-stack > values-hybrid.yaml
File values-hybrid.yaml được tạo ra với nội dung cấu hình mặc định của stack.
Chỉnh sửa file values-hybrid.yaml để tối ưu bộ nhớ và cấu hình cơ bản cho Prometheus.
cat > values-hybrid.yaml
File cấu hình values-hybrid.yaml đã được ghi đè với các thông số tài nguyên và lưu trữ phù hợp.
Triển khai stack vào namespace observability với file cấu hình vừa tạo.
kubectl create namespace observability
helm install prometheus prometheus-community/kube-prometheus-stack \
-n observability \
-f values-hybrid.yaml \
--wait \
--timeout 10m
Terminal sẽ in log quá trình install và kết thúc bằng dòng Release "prometheus" has been deployed.
Verify kết quả triển khai
Trạng thái của các Pod trong namespace observability phải là Running.
kubectl get pods -n observability | grep prometheus
Kiểm tra trạng thái Ready của Prometheus bằng cách xem logs của Pod.
kubectl logs -n observability -l app.kubernetes.io/name=prometheus | grep "Ready to scrape"
Sử dụng port-forward để truy cập web UI nếu chưa có ingress.
kubectl port-forward -n observability svc/prometheus-kube-prometheus-prometheus 9090:9090
Mở trình duyệt truy cập http://localhost:9090 để thấy dashboard Prometheus.
Cấu hình Remote Write đồng bộ lên Cloud Storage
Trong môi trường Hybrid, Prometheus On-prem cần đẩy metrics lên Cloud Storage (ví dụ: AWS Managed Prometheus, GCP Managed Service Monitoring, hoặc Thanos) để lưu trữ dài hạn và backup.
Tại sao cần Remote Write: Để tách biệt tính năng lưu trữ (Storage) khỏi tính năng thu thập (Scraping), giúp Prometheus on-prem nhẹ hơn và đảm bảo dữ liệu không mất khi on-prem gặp sự cố.
Kết quả mong đợi: Prometheus tự động đẩy dữ liệu metrics theo chu kỳ (interval) đã định cấu hình lên endpoint Cloud.
Tạo file cấu hình prometheus-remote-write-configmap.yaml để chứa thông tin kết nối remote. Đây là cách an toàn để quản lý secret thông qua ConfigMap (hoặc nên dùng Secret, nhưng ở đây dùng ConfigMap cho dễ minh họa cấu trúc).
cat > prometheus-remote-write-configmap.yaml
File prometheus-remote-write-configmap.yaml được tạo với cấu hình remote write chi tiết.
Áp dụng ConfigMap vào cluster Kubernetes.
kubectl apply -f prometheus-remote-write-configmap.yaml
Kubectl trả về thông báo configmap/prometheus-remote-write-config created.
Cập nhật file values-hybrid.yaml để tham chiếu vào ConfigMap vừa tạo, kích hoạt tính năng Remote Write.
cat >> values-hybrid.yaml
File values-hybrid.yaml đã được bổ sung cấu hình remote write.
Deploy lại Helm chart để áp dụng thay đổi cấu hình. Prometheus sẽ tự động reload cấu hình mà không cần restart (nếu cấu hình hỗ trợ hot-reload) hoặc restart pod.
helm upgrade prometheus prometheus-community/kube-prometheus-stack \
-n observability \
-f values-hybrid.yaml \
--wait
Helm trả về Release "prometheus" has been upgraded.
Verify kết quả Remote Write
Truy cập vào Pod Prometheus để xem logs, tìm dòng ghi nhận việc kết nối thành công hoặc lỗi khi gửi dữ liệu.
kubectl logs -n observability -l app.kubernetes.io/name=prometheus --tail=50 | grep "Remote write"
Kiểm tra trạng thái remote write trực tiếp trên web UI Prometheus tại tab Status -> Remote Write.
curl -s http://localhost:9090/api/v1/status/remote_write | jq '.data'
Các trường queue phải có num_samples_sent tăng dần, chứng tỏ dữ liệu đang được đẩy đi.
Cấu hình Service Discovery cho môi trường Hybrid
Môi trường Hybrid bao gồm các target On-prem (không chạy trên K8s) và Cloud (có thể là K8s hoặc VM). Prometheus cần cấu hình static_configs cho On-prem và podMonitor cho Cloud.
Tại sao cần cấu hình riêng biệt: On-prem thường dùng IP cố định hoặc file host, trong khi Cloud (K8s) thay đổi IP liên tục, cần cơ chế discovery động.
Kết quả mong đợi: Tab Targets trên Prometheus hiển thị đầy đủ các target từ cả On-prem và Cloud ở trạng thái UP.
Tạo file static-targets-configmap.yaml để định nghĩa các target On-prem (ví dụ: Database, Legacy App).
cat > static-targets-configmap.yaml
File static-targets-configmap.yaml được tạo với danh sách các target On-prem.
Áp dụng ConfigMap vào cluster.
kubectl apply -f static-targets-configmap.yaml
Kubectl trả về configmap/prometheus-static-targets created.
Cập nhật values-hybrid.yaml để Prometheus đọc các job từ ConfigMap này.
cat >> values-hybrid.yaml
File values-hybrid.yaml đã được bổ sung cấu hình static targets.
Deploy lại Prometheus để áp dụng các job mới.
helm upgrade prometheus prometheus-community/kube-prometheus-stack \
-n observability \
-f values-hybrid.yaml \
--wait
Helm trả về Release "prometheus" has been upgraded.
Để các target On-prem có thể scrape được, đảm bảo Node Exporter đang chạy trên các server đó. Nếu chưa, cài đặt nhanh trên server On-prem.
curl -s https://raw.githubusercontent.com/prometheus/node_exporter/master/node_exporter.service | sudo tee /etc/systemd/system/node_exporter.service
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
Node Exporter chạy và lắng nghe trên cổng 9100.
Verify kết quả Service Discovery
Kiểm tra tab Targets trên web UI Prometheus. Các job onprem-legacy-apps và onprem-databases phải hiện diện và trạng thái UP.
curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | select(.labels.job | contains("onprem"))'
API trả về danh sách các target có label env: onprem với trạng thái health: UP.
Tối ưu hóa Retention và Sharding cho lưu trữ dài hạn
Để lưu trữ metrics trong thời gian dài (ví dụ: 90 ngày) mà không làm quá tải một node Prometheus, chúng ta cần cấu hình retention và chuẩn bị cho sharding (chia nhỏ dữ liệu).
Tại sao cần tối ưu: Dữ liệu metrics tăng theo hàm mũ. Nếu không cắt retention hoặc chia sharding, Prometheus sẽ hết bộ nhớ và crash.
Kết quả mong đợi: Prometheus tự động xóa dữ liệu cũ hơn ngưỡng quy định và phân tải dữ liệu nếu chạy nhiều instance (sharding).
Cập nhật values-hybrid.yaml để tăng thời gian retention lên 90 ngày và kích hoạt wal_compression để giảm dung lượng disk.
cat > retention-patch.yaml
File retention-patch.yaml được tạo để patch cấu hình retention.
Sử dụng lệnh helm upgrade để áp dụng cấu hình retention mới. Lưu ý: Thay đổi retention có thể kích hoạt quá trình compact dữ liệu cũ.
helm upgrade prometheus prometheus-community/kube-prometheus-stack \
-n observability \
-f values-hybrid.yaml \
--set-file 'prometheus.prometheusSpec.additionalScrapeConfigs=./static-targets-configmap.yaml' \
--wait
Helm cập nhật và Prometheus sẽ bắt đầu quá trình compact dữ liệu cũ nếu cần.
Để chuẩn bị cho sharding (nếu bạn cần mở rộng quy mô), cấu hình sharding trong Prometheus Operator. Điều này yêu cầu chạy nhiều replica của Prometheus và mỗi replica chỉ scrape một phần target dựa trên hash.
cat > sharding-patch.yaml
File sharding-patch.yaml được tạo với cấu hình sharding và anti-affinity.
Áp dụng cấu hình sharding vào deployment.
helm upgrade prometheus prometheus-community/kube-prometheus-stack \
-n observability \
-f values-hybrid.yaml \
-f sharding-patch.yaml \
--wait
Helm sẽ tạo thêm 2 Pod Prometheus mới (tổng cộng 3 replicas) và tự động phân chia target.
Verify kết quả Retention và Sharding
Kiểm tra số lượng Pod Prometheus đang chạy, phải có 3 Pod.
kubectl get pods -n observability | grep prometheus-kube-prometheus-prometheus
Kiểm tra trạng thái retention trên web UI Prometheus (tab Status -> TSDB).
curl -s http://localhost:9090/api/v1/status/tsdb | jq '.data.retention'
API trả về thời gian retention là 90d.
Kiểm tra xem sharding có hoạt động bằng cách xem logs của từng Pod, tìm dòng shard hoặc số lượng target đang scrape.
kubectl logs -n observability prometheus-kube-prometheus-prometheus-0 --tail=20 | grep "scrape loop"
Logs cho thấy mỗi Pod đang quản lý một tập con các target (ví dụ: Pod 0 scrape 30%, Pod 1 scrape 30%...).
Điều hướng series:
Mục lục: Series: Series: Xây dựng hệ thống observability toàn diện (Logging, Metrics, Tracing) cho môi trường Hybrid Cloud với Prometheus, Grafana và OpenTelemetry
« Phần 1: Khởi động dự án: Kiến trúc, yêu cầu và chuẩn bị môi trường Hybrid Cloud
Phần 3: Triển khai nền tảng Logging: Xây dựng pipeline tập trung với Loki »