No menu items!
No menu items!
More

    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

    Bài viết gần đây

    spot_img

    Related Stories

    Leave A Reply

    Please enter your comment!
    Please enter your name here

    Đăng ký nhận thông tin bài viết qua email