Sunday, January 19, 2025

Monitoring trên Kubernetes Cluster sử dụng Prometheus

-

Giới thiệu

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 và cách cài đặt nó lên Kubernetes Cluster.

Prometheus là gì

Prometheus là một phần mềm giám sát mã nguồn mở, và đang trở nên ngày một phổ biến hơn. Prometheus rất mạnh và lại đặc biệt phù hợp để dùng cho việc giám sát các dịch vụ trên Kubernetes vì nó hỗ trợ sẵn rất nhiều các bộ template giám sát với các service opensource, giúp việc triển khai và cấu hình giám sát nhanh chóng và hiệu quả. Đi kèm với Prometheus (đóng vai trò giám sát) thì cần có thêm Alart Manager (đóng vai trò cảnh báo) để người quản trị có thể phát hiện được một vấn đề xảy ra sớm nhất có thể.

Cách thức hoạt động của Prometheus trên Kubernetes

Cách thức hoạt động của Prometheus khá trong sáng. Nó sẽ định kỳ lấy các thông tin metrics từ các “target, lưu thông tin metric đó và DB. HTTP API Server thực hiện lắng nghe các request từ client (ví dụ Prometheus Dashboard hay Grafana) để lấy thông tin từ DB và trả về kết quả cho client hiển thị lên dashboard.

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 hoạt động của Prometheus gồm các tham số chính:

  • global: Các tham số chung về hoạt động của Prometheus, ví dụ là khoảng thời gian định kì pull dữ liệu metric về chẳng hạn
  • alerting: Thông tin kết nối tới Alert Manager. Bạn có thể cấu hình một hoặc nhiều Alert Manager tùy vào mục đích sử dụng.
  • rule_files: Đây là phần quan trọng trong xử lý các báo. Rule file quy định các điều kiện để sinh ra một cảnh báo từ thông tin metric đầu vào. Ví dụ đặt rule RAM của Node > 80% thì đặt cảnh báo cao tải RAM.
  • 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.

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ài đặt Prometheus và Grafana trên K8S bằng Helm

Nhắc lại một chút trong series bài viết này mình dựng lab K8S gồm 03 Master và 03 Worker. Mình sử dụng 1 node để cài CICD (vtq-cicd) và đồng thời dùng nó là nơi lưu các cấu hình cài đặt các phần mềm lên K8S để dễ quản lý.

Trong bộ cài mình giới thiệu dưới đây đã bao gồm sẵn cả bộ công cụ gồm Prometheus, Alert Manager và Grafana luôn, rất tiện dùng và cài đặt cực kỳ đơn giản.

Các bước thực hiện là

  • 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

Tạo thư mục quản lý manifest cho dự án.

mkdir -p /home/prometheus
cd /home/prometheus

Thêm Helm repo https://prometheus-community.github.io/helm-charts.

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories

Và repo https://charts.helm.sh/stable.

$ helm repo add stable https://charts.helm.sh/stable
"stable" has been added to your repositories

Cập nhật lại danh sách repo sau khi thêm.

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "nginx-stable" chart repository
...Successfully got an update from the "prometheus-community" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈

Tìm repo liên quan đến Prometheus.

$ helm search repo prometheus |egrep "stack|CHART"
NAME                                                    CHART VERSION   APP VERSION     DESCRIPTION                                       
prometheus-community/kube-prometheus-stack              41.7.3          0.60.1          kube-prometheus-stack collects Kubernetes manif...
prometheus-community/prometheus-stackdriver-exp...      4.1.0           0.12.0          Stackdriver exporter for Prometheus               
stable/stackdriver-exporter                             1.3.2           0.6.0           DEPRECATED - Stackdriver exporter for Prometheus  

Tải nó về.

helm pull prometheus-community/kube-prometheus-stack --version 34.9.0

Giải nén file vừa tải về.

tar -xzf kube-prometheus-stack-34.9.0.tgz

Copy file values.yaml và chỉnh sửa nó.

cp kube-prometheus-stack/values.yaml values-prometheus.yaml

Giờ thì ngó qua file values mặc định của bộ helm-chart này sẽ thấy nó đã mặc định cấu hình Rule cho các thành phần của K8S từ etcd, kube-api.. Và Alert Manager cũng dc cài mặc định trong bộ này luôn.

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

Và Alert Manager cũng dc cài mặc định trong bộ này luôn, nếu bạn không muốn cài chung trong bộ này thì có thể sửa enabled: false để tự cài Alert Manager và cấu hình tích hợp với Prometheus sau. Mình thì dùng luôn đỡ mất công cấu hình:

alertmanager:
  enabled: true
  annotations: {}
  apiVersion: v2

Cấu hình tạo ingress cho Alert Manager để kết nối từ bên ngoài vào bằng hostname là alertmanager.hoanghd.com

alertmanager:
  enabled: true
  ingress:
    enabled: true
    ingressClassName: nginx
    hosts:
      - alertmanager.hoanghd.com

Đổi password mặc định khi login và web Grafana theo ý của bạn, ở đây mình đặt là “Hoanghd164“. Cấu hình ingress cho Grafana để kết nối vào từ bên ngoài qua hostname grafana.hoanghd.com

grafana:
    enabled: true
    adminPassword: Hoanghd164
    ingress:
      enabled: true
      ingressClassName: nginx
      hosts:
        - grafana.hoanghd.com

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

prometheus:
    enabled: true
    ingress:
      enabled: true
      ingressClassName: nginx
      hosts:
        - prometheus.hoanghd.com

Do mình sẽ espose các ứng dụng này qua Nginx-Ingress nên tất cả các cấu hình service mình sẽ để mặc định là loại clusterIP.

Sau khi tùy biến file values.yaml rồi thì ta thực hiện triển khai.

$ kubectl create ns monitoring
namespace/monitoring created
$ helm -n monitoring install prometheus-grafana-stack -f values-prometheus.yaml kube-prometheus-stack
NAME: prometheus-grafana-stack
LAST DEPLOYED: Fri Nov  4 07:36:28 2022
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace monitoring get pods -l "release=prometheus-grafana-stack"

Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.

Dùng lệnh dưới để xác nhận triển khai dịch vụ đã triển khai thành công hay chưa.

$ kubectl -n monitoring get all
NAME                                                               READY   STATUS    RESTARTS   AGE
pod/alertmanager-prometheus-grafana-stack-k-alertmanager-0         2/2     Running   0          61m
pod/prometheus-grafana-stack-5f68d94fd-xf44j                       3/3     Running   0          69m
pod/prometheus-grafana-stack-k-operator-bf6cbdbd8-n4pgl            1/1     Running   0          69m
pod/prometheus-grafana-stack-kube-state-metrics-57476c879f-7t9fn   1/1     Running   0          69m
pod/prometheus-grafana-stack-prometheus-node-exporter-5zl5b        1/1     Running   0          69m
pod/prometheus-grafana-stack-prometheus-node-exporter-9tpng        1/1     Running   0          69m
pod/prometheus-grafana-stack-prometheus-node-exporter-df8lt        1/1     Running   0          69m
pod/prometheus-grafana-stack-prometheus-node-exporter-k5k8s        1/1     Running   0          69m
pod/prometheus-grafana-stack-prometheus-node-exporter-nthnf        1/1     Running   0          69m
pod/prometheus-grafana-stack-prometheus-node-exporter-pz6v8        1/1     Running   0          69m
pod/prometheus-grafana-stack-prometheus-node-exporter-tpgkj        1/1     Running   0          69m
pod/prometheus-grafana-stack-prometheus-node-exporter-zz5c7        1/1     Running   0          69m
pod/prometheus-prometheus-grafana-stack-k-prometheus-0             2/2     Running   0          61m

NAME                                                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/alertmanager-operated                               ClusterIP   None             <none>        9093/TCP,9094/TCP,9094/UDP   68m
service/prometheus-grafana-stack                            ClusterIP   10.103.64.59     <none>        80/TCP                       69m
service/prometheus-grafana-stack-k-alertmanager             ClusterIP   10.105.5.105     <none>        9093/TCP                     69m
service/prometheus-grafana-stack-k-operator                 ClusterIP   10.107.129.129   <none>        443/TCP                      69m
service/prometheus-grafana-stack-k-prometheus               ClusterIP   10.101.251.91    <none>        9090/TCP                     69m
service/prometheus-grafana-stack-kube-state-metrics         ClusterIP   10.109.171.142   <none>        8080/TCP                     69m
service/prometheus-grafana-stack-prometheus-node-exporter   ClusterIP   10.102.246.61    <none>        9100/TCP                     69m
service/prometheus-operated                                 ClusterIP   None             <none>        9090/TCP                     68m

NAME                                                               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/prometheus-grafana-stack-prometheus-node-exporter   8         8         8       8            8           <none>          69m

NAME                                                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/prometheus-grafana-stack                      1/1     1            1           69m
deployment.apps/prometheus-grafana-stack-k-operator           1/1     1            1           69m
deployment.apps/prometheus-grafana-stack-kube-state-metrics   1/1     1            1           69m

NAME                                                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/prometheus-grafana-stack-5f68d94fd                       1         1         1       69m
replicaset.apps/prometheus-grafana-stack-k-operator-bf6cbdbd8            1         1         1       69m
replicaset.apps/prometheus-grafana-stack-kube-state-metrics-57476c879f   1         1         1       69m

NAME                                                                    READY   AGE
statefulset.apps/alertmanager-prometheus-grafana-stack-k-alertmanager   1/1     68m
statefulset.apps/prometheus-prometheus-grafana-stack-k-prometheus       1/1     68m

Lấy thông tin Ingress

$ kubectl get ingress -n monitoring -owide
NAME                                      CLASS   HOSTS                      ADDRESS          PORTS   AGE
prometheus-grafana-stack                  nginx   grafana.hoanghd.com        192.168.13.239   80      61m
prometheus-grafana-stack-k-alertmanager   nginx   alertmanager.hoanghd.com   192.168.13.239   80      61m
prometheus-grafana-stack-k-prometheus     nginx   prometheus.hoanghd.com     192.168.13.239   80      61m

Như vậy ta đã cài đặt xong bộ Prometheus + Alert Manager + Grafana. Giờ ta thực hiện khai host trên client và kết nối vào web để kiểm tra.

Đầu tiên phải phải trỏ domain về máy host.

$ cat /etc/hosts | grep hoanghd
192.168.13.239 prometheus.hoanghd.com
192.168.13.239 grafana.hoanghd.com
192.168.13.239 alertmanager.hoanghd.com

Kiểm tra kết nối đến máy host

$ ping prometheus.hoanghd.com
PING prometheus.hoanghd.com (192.168.13.239): 56 data bytes
64 bytes from 192.168.13.239: icmp_seq=0 ttl=64 time=0.499 ms
64 bytes from 192.168.13.239: icmp_seq=1 ttl=64 time=0.570 ms
64 bytes from 192.168.13.239: icmp_seq=2 ttl=64 time=0.468 ms
64 bytes from 192.168.13.239: icmp_seq=3 ttl=64 time=0.593 ms
64 bytes from 192.168.13.239: icmp_seq=4 ttl=64 time=0.472 ms

--- prometheus.hoanghd.com ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.468/0.520/0.593/0.052 ms

Giao diện của Prometheus, xem thông tin “node_memory_MemTotal_bytes” của các node:

Kiểm tra kết nối vào Alert Manager

Kiểm tra kết nối vào Grafana

Lúc này bạn đã cài đặt xong bộ công Prometheus/AlertManager/Grafana và các kèm với đó là các Node Exporter của K8S. Giờ là lúc dùng các thông tin metric lấy được từ Prometheus để hiển thị lên Grafana.

Hãy lựa chọn 1 Dashboard mà bạn muốn xem, ta có thành quả như hình dưới.

Sau khi cài tới đây thì cơ bản lấy được thông tin của K8S và hiển thị dc lên dashboard của Grafana.

Chúc các bạn thành công

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories