Phát triển

Monitoring trên K8s cluster với Prometheus và Grafana

Trang Vũ 19-09-2023
Monitoring trên K8s cluster với Prometheus và Grafana

Trong bài viết này, Stringee và các bạn sẽ cùng tìm hiểu về một chủ đề khá quan trọng và cần thiết khi làm việc với K8s đó là monitoring, cụ thể hơn là ở đây chúng ta sẽ sử dụng Prometheus và Grafana. Một hệ thống lớn với vô số các pod được triển khai trên một cluster K8s không thể tránh khỏi các sai sót và lỗi trong quá trình vận hành. Vì thế mà việc vận hành thành thạo một hệ thống giám sát cho cluster của bạn có thể coi là một kỹ năng "must-have" khi làm việc với Kubernetes. Chúng ta hãy cùng bắt đầu nhé.

1. Giới thiệu về Prometheus và Grafana

Prometheus và Grafana là các phần mềm Open-Source, các bạn hoàn toàn có thể cài nó trên k8s, cài trên Docker hoặc trên OS service đều được cả. Trong phạm vi bài viết này mình sẽ giới thiệu sơ qua về Prometheus/Grafana, cách cài đặt nó lên Kubernetes để có thể thực hiện monitoring trên k8s Cluster.

2. Tìm hiểu về Prometheus

2.1. Prometheus là gì ?

Prometheus là một công cụ chuyên dùng trong việc giám sát hệ thống, ở thời điểm mình viết bài này thì nó là công cụ phổ biến nhất. Prometheus sẽ thu thập và lưu trữ các thông số của hệ thống dưới database của nó, các giá trị nó thu thập được sẽ được lưu trữ dưới Prometheus ở dạng time series. Bạn có thể xem Prometheus như là một time series database.

2.2. Kiến trúc của Prometheus

Thành phần chính của Prometheus là một Prometheus Server gồm các thành phần có nhiệm vụ:

  • Time Series Database là nơi lưu trữ thông tin metrics của các đối tượng được giám sát

  • Data Retrieval Worker có nhiệm vụ lấy tất cả thông tin metric từ các đối tượng được giám sát như server, services, ứng dụng.. và lưu vào database

  • HTTP Server API là nơi tiếp nhận các truy vấn lấy dữ liệu được lưu ở DB, nó được sử dụng để hiển thị dữ liệu lên dashboard.

2.3. Prometheus hoạt động với Kubernetes thế nào

Prometheus sẽ định kỳ lấy các thông tin metrics từ các target, sau đó lưu các thông tin này vào DB. HTTP API Server thực hiện lắng nghe các request từ client và lấy thông tin từ DB sau đó trả về kết quả cho client hiển thị lên Dashboard, thường ở đây được tích hợp kèm với Grafana.

Prometheus cho phép bạn cấu hình các quy tắc sinh cảnh báo (rule), khi các giá trị thỏa mãn các điều kiện đó thì cảnh báo sẽ được sinh ra và gửi tới Alert Manager. Tại Alert Manager sẽ tiếp tục là nơi xử lý gửi cảnh báo tới các nơi nhận, gọi là "receiver", ví dụ như Email, Telegram...

Để cấu hình được Prometheus, chúng ta sẽ cần cấu hình các tham số sau:

  • global: Các tham số chung cấu hình cho Prometheus: thời gian pull các thông số định kì, ...

  • alerting: Thông tin cấu hình tới Alert Manager

  • rule_files: Cấu hình các rule quy định để sinh ra cảnh báo dựa vào metrics đầu vào. Các rule có thể đơn giản như việc monitor bộ nhớ, khi ổ cứng đầy hơn 90% thì đưa ra cảnh báo đầy ổ cứng.

  • scrape_configs: Đây là phần cấu hình liên quan tới kết nối tới các target để lấy metric. Ví dụ bạn cần lấy performance của các K8S Node, và lấy thêm metric của database đang được cài trên K8S chẳng hạn thì bạn cần cài 2 exporter cho 2 target trên, và cấu hình scrape_configs để lấy thông tin từ exporter đó export ra.

3. Grafana là gì

Grafana là phần mềm open-source dùng để phân tích và hiển thị trực quan dữ liệu. Nó giúp việc xử lý hiển thị dữ liệu trên các dashboard với khả năng tùy biến hoàn hảo, hỗ trợ rất lớn cho việc theo dõi phân tích dữ liệu theo thời gian. Nó lấy nguồn dữ liệu từ nguồn như Prometheus, Graphite hay ElasticSearch..

Các tính năng chính của Grafana:

  • Dashboard Đây là tính năng "đỉnh" nhất của Grafana với rất nhiều tùy biến cũng như hệ thống template cực kỳ đa dạng giúp việc hiển thị dữ liệu trở nên sinh động, trực quan.

  • Alerts: Việc đặt ngưỡng cảnh có thể được thực hiện ở Grafana (tương tự cấu hình rule ở Alert Manager vậy).

  • Native Support: Được hỗ trợ native từ rất nhiều database phổ biến như MySQL, Postgres..

  • Built-in Support: Hỗ trợ sẵn các datasource đối với Prometheus, Influx DB, CloudWatch, Graphite, ElasticSearch.

Xem thêm bài viết:

- Hướng dẫn cài đặt Web server Apache trên CentOS 7

- Cài đặt cấu hình cân bằng tải với HaProxy và Docker

- Tìm hiểu về ràng buộc (Constraint) trong SQL

4. Thực hiện cài đặt Prometheus và Grafana lên K8s bằng Helm

Vậy là chúng ta đã tìm hiểu và biết được các phần mềm chính hôm nay chúng ta sẽ cài đặt là gì và chúng có nhiệm vụ như sau. Trước khi vào cài đặt một phần mềm gì đó, chúng ta nên vạch ra cho mình ý tưởng và cách bước triển khai phần mềm đó. Dưới đây sẽ là các bước chúng ta cần thực hiện:

  • Tải helm-chart về
  • Tạo file config và tùy biến các tham số cấu hình:
  • Đổi pass login mặc định
  • Cấu hình ingress cho Alert Manager
  • Cấu hình ingress cho Grafana
  • Cấu hình ingress cho Prometheus
  • Cài đặt, kiểm tra kết nối lấy dữ liệu metric trên dashboard

Và bây giờ, chúng ta sẽ bắt đầu cài đặt:

Khai báo repo Helm và download helm-chart của Prometheus về

[root@localhost]$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
[root@localhost]$ helm repo add stable https://charts.helm.sh/stable
[root@localhost]$ helm repo update
[root@localhost]$ helm search repo prometheus |egrep "stack|CHART"
NAME                                                    CHART VERSION   APP VERSION     DESCRIPTION
prometheus-community/kube-prometheus-stack              34.9.0          0.55.0          kube-prometheus-stack collects Kubernetes manif...
prometheus-community/prometheus-stackdriver-exp...      2.2.0           0.12.0          Stackdriver exporter for Prometheu
stable/stackdriver-exporter                             1.3.2           0.6.0           DEPRECATED - Stackdriver exporter for Prometheus
[root@localhost]$ helm pull prometheus-community/kube-prometheus-stack --version 34.9.0
[root@localhost]$ tar -xzf kube-prometheus-stack-34.9.0.tgz
[root@localhost]$ cp kube-prometheus-stack/values.yaml values-prometheus.yaml

Khi kiểm tra qua file values mặc định của bộ helm-chart này, chúng ta sẽ thấy mặc định cấu hình Rule cho các thành phần của K8s như etcd, kube-api,... Trong bộ cài này, chúng ta sẽ thấy Alert Manager đã được cài mặc định, từ đó chúng ta có thể cấu hình thêm cho các phần alert sau này

defaultRules:
  create: true
  rules:
    alertmanager: true
    etcd: true
    configReloaders: true
    general: true
    k8s: true
    kubeApiserver: true
    kubeApiserverAvailability: true
    kubeApiserverSlos: true
    kubelet: true
    kubeProxy: true
    kubePrometheusGeneral: true
    kubePrometheusNodeRecording: true
    kubernetesApps: true
    kubernetesResources: true
    kubernetesStorage: true
    kubernetesSystem: true
    kubeScheduler: true
    kubeStateMetrics: true
    network: true
    node: true
    nodeExporterAlerting: true
    nodeExporterRecording: true
    prometheus: true
    prometheusOperator: true

Còn dưới đây là cấu hình AlertManger, các bạn có thể tắt nó đi bằng cách set enable là false nhé, nhưng nếu nó đã có sẵn rồi thì tại sao mình lại không tận dụng nhỉ. Ở đây, chúng ta sẽ sử dụng lại luôn các phần cấu hình này.

alertmanager:
  ## Deploy alertmanager
  ##
  enabled: true

  ## Annotations for Alertmanager
  ##
  annotations: {}

  ## Api that prometheus will use to communicate with alertmanager. Possible values are v1, v2
  ##
  apiVersion: v2

Chúng ta sẽ cấu hình thêm 1 ingress để kết nối từ bên ngoài vào

   ingress:
     enabled: true
     hosts:
        - alertmanager.monitor.local
      ## Paths to use for ingress rules - one path should match the alertmanagerSpec.routePrefix
      ##
     paths:
      - /

Đổi password mặc định khi login và web Grafana theo ý của bạn, ở đây mình đặt là "root@123$":

   adminPassword: root@123$

Cấu hình ingress cho Grafana để kết nối vào từ bên ngoài qua hostname grafana.monitor.local

    ingress:
      ## If true, Grafana Ingress will be created
      enabled: true
      hosts:
       - grafana.monitor.local
      #hosts: []
      ## Path for grafana ingress
      path: /

Cấu hình ingress cho Prometheus để kết nối vào từ bên ngoài

   ingress:
     enabled: true
     hosts:
       - prometheus.monitor.local
     #hosts: []

      ## Paths to use for ingress rules - one path should match the prometheusSpec.routePrefix
      ##
     paths:
      - /

Và chúng ta đã hoàn thành cài đặt bộ công cụ Prometheus-Grafana. Ở đây, AlertManager cũng đã được cấu hình, tuy chỉ là cấu hình rất cơ bản, chúng ta sẽ tìm hiểu sâu về nó trong một bài viết khác nhé.

Kết

Qua bài viết này hy vọng các bạn sẽ hiểu được Prometheus/Grafana là gì và ý tưởng của nó trong việc giám sát và trực quan hóa các thông tin hoạt động của dịch vụ trên K8S.

Stringee Communication APIs là giải pháp cung cấp các tính năng như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài chăm sóc khách hàng có thể tích hợp trực tiếp vào các ứng dụng/website của doanh nghiệp nhanh chóng. Bộ giải pháp này giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Mời quý bạn đọc đăng ký dùng thử và nhận tư vấn tại đây: