Cài đặt OpenCost trên Kubernetes: Bóc tách chi phí Cloud theo thời gian thực với Prometheus

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

Cú sốc hóa đơn Cloud lúc 2 giờ sáng

2 giờ sáng, chuông PagerDuty réo inh ỏi. Lần này không phải sự cố sập DB hay nghẽn mạng. Đó là cảnh báo vượt ngân sách từ AWS: hóa đơn cụm EKS tháng này vừa vọt thêm $1.800 chỉ sau 5 ngày. Bật máy kiểm tra AWS Cost Explorer, bạn chỉ thấy duy nhất một con số tổng cho dàn EC2 worker nodes. AWS hay GCP chỉ tính tiền theo số lượng VM mà bạn chạy. Họ không thể biết namespace nào, microservice nào hay team nào bên trong cluster đang âm thầm “đốt tiền”.

Dashboard Grafana trước đây chỉ giúp bạn nhìn thấy phần cứng. Bạn biết Pod A ăn 8 Core CPU, Pod B ngốn 16GB RAM. Nhưng Pod A tốn bao nhiêu USD mỗi giờ? Không ai trả lời được. Muốn giải bài toán này, bạn cần gắn biểu giá thực tế của hạ tầng vào từng container metric đang chạy: đó là lúc OpenCost phát huy tác dụng.

OpenCost hoạt động thế nào với Prometheus?

OpenCost là dự án mã nguồn mở thuộc CNCF Sandbox và chính là lõi tính toán chi phí đằng sau Kubecost. Nhiệm vụ chính của nó: đo lường và phân bổ chi phí Kubernetes theo thời gian thực.

Cơ chế định giá và bóc tách chi phí

Mỗi pod chạy trên worker node đều tiêu thụ tài nguyên phần cứng. OpenCost lấy mức request và usage thực tế, sau đó đối soát trực tiếp với biểu giá máy ảo của AWS, GCP, Azure hoặc bảng giá On-Premises do bạn tự định nghĩa:

  • CPU & RAM Cost: Lấy tỷ lệ tài nguyên container đăng ký (requests) so với tổng dung lượng node, rồi nhân với giá thuê theo giờ của instance type đó (ví dụ: c5.2xlarge giá $0.34/giờ trên AWS us-east-1).
  • Storage Cost: Tính toán trực tiếp dựa trên StorageClass (GP3, io2) và dung lượng thực của Persistent Volume Claim (PVC).
  • Network Cost: Đo đạc lưu lượng egress ra Internet, dữ liệu truyền liên vùng (cross-zone) hoặc liên khu vực (cross-region).

Cặp bài trùng: OpenCost và Prometheus

Thay vì tự viết exporter mới từ đầu, OpenCost tận dụng triệt để Prometheus sẵn có. Nó kéo dữ liệu cAdvisor và kube-state-metrics từ cluster về làm dữ liệu đầu vào. OpenCost đóng vai trò một engine tính toán: định kỳ truy vấn metric tài nguyên, nhân với đơn giá máy ảo, rồi xuất ngược các metric chi phí (như node_cpu_hourly_cost hay opencost_allocation_cpu_cost_hourly) để Prometheus scrape lại và hiển thị lên Grafana.

Các bước triển khai OpenCost trên Kubernetes

Bài viết này giả định cụm của bạn đã cài sẵn Prometheus Operator (kube-prometheus-stack). Quá trình tích hợp chỉ mất chưa đầy 10 phút.

Bước 1: Tạo Namespace và kiểm tra Prometheus endpoint

Trước hết, hãy gom tài nguyên OpenCost vào một namespace riêng:

kubectl create namespace opencost

Tiếp theo, bạn cần lấy đúng địa chỉ service nội bộ của Prometheus. Với kube-prometheus-stack, service thường có dạng:

http://prometheus-operated.monitoring.svc.cluster.local:9090

Nếu dùng Prometheus bản tiêu chuẩn, endpoint thường là http://prometheus-k8s.monitoring.svc.cluster.local:9090.

Bước 2: Cài đặt OpenCost bằng Helm

Khai báo repository chính thức của OpenCost:

helm repo add opencost https://opencost.github.io/opencost-helm-chart
helm repo update

Tạo file cấu hình values-opencost.yaml. Lưu ý trỏ đúng tên Service Prometheus và nhà cung cấp cloud bạn đang dùng:

opencost:
  prometheus:
    internal:
      serviceName: "prometheus-operated"
      namespaceName: "monitoring"
      port: 9090
  exporter:
    defaultClusterId: "production-k8s-cluster"
    cloudProvider: "AWS" # Đổi thành GCP hoặc Azure tùy hạ tầng
  ui:
    enabled: true

serviceMonitor:
  enabled: true
  namespace: opencost
  additionalLabels:
    release: kube-prometheus-stack

Chạy lệnh cài đặt vào cluster:

helm install opencost opencost/opencost \
  --namespace opencost \
  -f values-opencost.yaml

Bước 3: Kiểm tra trạng thái Pods và Logs

Đảm bảo các pod khởi động bình thường và kết nối thông suốt với Prometheus:

kubectl get pods -n opencost

# Soi log kiểm tra luồng kéo metric
kubectl logs -n opencost -l app.kubernetes.io/name=opencost -c opencost --tail=50

Nếu thấy log xuất hiện dòng Querying Prometheus at http://prometheus-operated... kèm thông báo tải bảng giá cloud thành công, hệ thống đã chạy chuẩn chỉ.

Bước 4: Mở giao diện OpenCost UI

Chưa cần cấu hình Ingress phức tạp, bạn có thể port-forward trực tiếp để xem dashboard:

kubectl port-forward --namespace opencost service/opencost-ui 9090:9090

Mở trình duyệt tại http://localhost:9090. Bạn có thể lọc chi phí ngay theo nhu cầu:

  • Namespace: Nhìn thấy ngay team Data ngốn $45/ngày hay team Core API tiêu $12/ngày.
  • Controller / Deployment: Bóc tách chi phí riêng lẻ của từng microservice.
  • Cost Allocation Window: Xem biến động hóa đơn theo giờ, theo ngày hoặc 30 ngày gần nhất.

Bước 5: Viết câu lệnh PromQL để cảnh báo chi phí

Vì OpenCost xuất dữ liệu dưới dạng metric chuẩn, bạn có thể tạo alert trực tiếp qua Alertmanager hoặc dựng panel trên Grafana.

Tính tổng chi phí theo giờ cho từng Namespace:

sum(opencost_allocation_cpu_cost_hourly + opencost_allocation_ram_cost_hourly) by (namespace)

Tính chi phí CPU lãng phí do Pod xin cấp phát nhiều nhưng không dùng hết (Idle Cost):

sum(opencost_allocation_cpu_idle_cost_hourly) by (namespace)

Chỉ số này cực kỳ giá trị: nó chỉ rõ nơi bạn đang trả tiền cho CPU rảnh rỗi mà không đem lại giá trị nào.

Tạm kết

Đừng chờ tới kỳ thanh toán cuối tháng để hồi hộp mở hóa đơn cloud. OpenCost kết hợp với Prometheus sẽ giúp bạn minh bạch hóa từng đồng chi phí Kubernetes theo thời gian thực. Khi biết rõ container nào đang lãng phí tài nguyên, việc tối ưu requests/limits và cắt giảm 20-30% chi phí hạ tầng sẽ trở nên đơn giản hơn rất nhiều.

Share: