No menu items!
No menu items!
More

    Sử dụng Prometheus lấy metric ứng dụng Minio

    MinIO (minio) là một server lưu trữ đối tượng dạng phân tán với hiệu năng cao.

    Trình bày dễ hiểu thì MinIO là một file server giúp bạn dễ dàng upload file, download file như amazon, google drive, mediafire…

    Đặc biệt là MinIO cung cấp các api làm việc giống như Amazon S3, do đó bạn có thể upload, download file, lấy link… qua api một cách đơn giản mà không phải tự cài đặt. Đồng thời cũng rất tiện cho những bạn đang làm việc với Amazon Service.

    Với Minio chúng ta có thể cấu hình kích thước file, loại file, các link public … và rất nhiều tiện ích khác.

    Khi bạn cài một ứng dụng khác lên k8s thì việc cài đặt để lấy dữ liệu của nó và hiển thị lên dashboard sẽ như thế nào? Mình sẽ làm mẫu với việc cài dịch vụ Minio lên K8S và lấy metric của nó qua Prometheus và hiển thị lên dashboard của Grafana.

    Ý tưởng là cài Minio lên k8s (bạn nào chưa biết về Minio thì google thêm nhé, nó cũng khá phổ biến với ai hay dùng open-source). Sau đó cấu hình cho nó expose metric của nó, vì khá nhiều opensource hỗ trợ sẵn metric mà Prometheus có thể hiểu được.

    Sau đó cấu hình scrape-config của Prometheus để chọc vào Minio lấy metric. Cuối cùng là lên mạng tìm một dashboad template của Minio import vào Grafana là xong.

    Cài đặt Minio

    Mình sẽ cài Minio bằng helmchart:

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

    Có thể sử dụng lệnh helm search để list các chart version

    $ helm search repo minio
    NAME            CHART VERSION   APP VERSION     DESCRIPTION                                       
    bitnami/minio   11.10.13        2022.10.29      MinIO(R) is an object storage server, compatibl...
    stable/minio    5.0.33          master          DEPRECATED MinIO is a high performance data inf...

    Dùng lệnh helm pull để tải chart về máy

    helm pull bitnami/minio --version=11.10.13

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

    tar -xzf minio-11.10.13.tgz

    Copy values file ra 1 file mới để chúng ta tiến hành custom nó

    cp minio/values.yaml values-minio.yaml

    Trước hết hãy tạo 1 pv cho minio, mình sử dụng longhorn để tạo mới 1 volume

    Sau khi tạo xong mình có 1 volume mới như hình dưới

    Giờ mình sẽ tạo pv mới từ volume vừa tạo ở trên

    Mình chỉ tạo pv nên mình sẽ bỏ tích pvc

    Chúng ta có 1 pv như dưới

    Kiểm tra lại trên cli ta có kết quả

    $ kubectl get pvc,pv -n minio
    NAME                             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS      REASON   AGE
    persistentvolume/minio-storage   8Gi        RWX            Retain           Available           longhorn-static            2m54s

    Giờ thì sửa vài tham số cơ bản ở file values-minio.yaml để chạy nó lên gồm enable ingress, gán pvc dung lượng 1Gi và khai báo storageclass:

    ingress:
      enabled: true
      ingressClassName: "nginx"
      hostname: minio.hoanghd.com
    
    auth:
      rootUser: admin
      rootPassword: "Hoanghd164"
    
    persistence:
      enabled: true
      storageClass: "longhorn-static"
      size: 8Gi
      accessModes:
        - ReadWriteMany

    Lưu ý storageClass cần khai đúng storage class bạn đang cài trên k8s nhé. Tiếp theo mình sẽ tạo namespace riêng để cài minio.

    $ kubectl create ns minio
    namespace/minio created

    Triển khai minio, nhớ trỏ về file values-minio.yaml để các thay đổi của bạn được cập nhật.

    $ helm -n minio install minio -f values-minio.yaml minio
    NAME: minio
    LAST DEPLOYED: Wed Nov  9 15:26:08 2022
    NAMESPACE: minio
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    CHART NAME: minio
    CHART VERSION: 11.10.13
    APP VERSION: 2022.10.29
    
    ** Please be patient while the chart is being deployed **
    
    MinIO® can be accessed via port  on the following DNS name from within your cluster:
    
       minio.minio.svc.cluster.local
    
    To get your credentials run:
    
       export ROOT_USER=$(kubectl get secret --namespace minio minio -o jsonpath="{.data.root-user}" | base64 -d)
       export ROOT_PASSWORD=$(kubectl get secret --namespace minio minio -o jsonpath="{.data.root-password}" | base64 -d)
    
    To connect to your MinIO® server using a client:
    
    - Run a MinIO® Client pod and append the desired command (e.g. 'admin info'):
    
       kubectl run --namespace minio minio-client \
         --rm --tty -i --restart='Never' \
         --env MINIO_SERVER_ROOT_USER=$ROOT_USER \
         --env MINIO_SERVER_ROOT_PASSWORD=$ROOT_PASSWORD \
         --env MINIO_SERVER_HOST=minio \
         --image docker.io/bitnami/minio-client:2022.10.29-debian-11-r0 -- admin info minio
    
    To access the MinIO® web UI:
    
    - Get the MinIO® URL:
    
       You should be able to access your new MinIO® web UI through
    
       http://minio.hoanghd.com/minio/

    Kết quả khi kiểm ta lại trạng thái pv và pvc, pvc sẽ được tạo tự động như dưới

    $ kubectl get pvc,pv -n minio
    NAME                          STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS      AGE
    persistentvolumeclaim/minio   Bound    minio-storage   8Gi        RWX            longhorn-static   3s
    
    NAME                             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM         STORAGECLASS      REASON   AGE
    persistentvolume/minio-storage   8Gi        RWX            Retain           Bound    minio/minio   longhorn-static            18s

    Storage trên giao diện UI đã chuyển trạng thái Bound

    Kiểm tra các thành phần sau khi triển khai xong

    $ kubectl get po,svc,ingress -n minio
    NAME                         READY   STATUS    RESTARTS   AGE
    pod/minio-56b5c7c8fd-sb5k2   1/1     Running   0          2m27s
    
    NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
    service/minio   ClusterIP   10.105.145.6   <none>        9000/TCP,9001/TCP   2m27s
    
    NAME                              CLASS   HOSTS               ADDRESS          PORTS   AGE
    ingress.networking.k8s.io/minio   nginx   minio.hoanghd.com   192.168.13.239   80      2m27s

    Phần cấu hình loadbalancing mình đã cài đặt từ trước, nên giờ chỉ cần khai hostname ở client và kết nối vào là được.

    $ cat /etc/hosts | grep 'minio.hoanghd.com'
    192.168.13.239 minio.hoanghd.com

    Kiểm tra kết nối

    $ ping minio.hoanghd.com
    PING minio.hoanghd.com (192.168.13.239): 56 data bytes
    64 bytes from 192.168.13.239: icmp_seq=0 ttl=63 time=5.686 ms
    64 bytes from 192.168.13.239: icmp_seq=1 ttl=63 time=5.317 ms
    64 bytes from 192.168.13.239: icmp_seq=2 ttl=63 time=5.345 ms
    64 bytes from 192.168.13.239: icmp_seq=3 ttl=63 time=4.442 ms
    
    --- minio.hoanghd.com ping statistics ---
    4 packets transmitted, 4 packets received, 0.0% packet loss
    round-trip min/avg/max/stddev = 4.442/5.197/5.686/0.460 ms

    Giao diện Minio trên trình duyệt

    Đăng nhập vào bằng user admin và pass như cấu hình bên trên.

    Mình tạo ra 3 bucket để lát check tham số giám sát trên Grafana có chính xác không

    Kết quả sau mình mình tạo ra 3 bucket

    Tiếp đến bạn lưu ý trong file values-minio.yaml bên trên có tham số “path: /minio/v2/metrics/cluster” đó là địa chỉ minio expose metrics của nó ra, mình sẽ dùng để cấu hình cho Prometheus

    Cấu hình Prometheus lấy dữ liệu từ Minio

    Quay lại thư mục cài đặt Prometheus ban đầu, ta sẽ sửa lại file values-prometheus.yaml để update phần scrape-config cho minio như sau:

    – Tìm đến additionalScrapeConfigs và xoá dấu [] ở cuối dòng

    additionalScrapeConfigs: [] -> additionalScrapeConfigs:

    Thêm job mới có tên minio-job, bạn sẽ được đoạn config đầy đủ như dưới

        additionalScrapeConfigs:
        - job_name: minio-job
          metrics_path: /minio/v2/metrics/cluster
          scheme: http
          static_configs:
          - targets: ['minio.minio.svc.kubernetes:9000']

    Trong đó:

    • metric_path: Chính là đường dẫn được cấu hình ở minio để expose metrics
    • targets: Hiểu đơn giản là khai báo IP/Port để kết nối tới địa chỉ expose metrics. Ở đây mình điền service name của Minio và port của nó. Do Prometheus và Minio đang được cài ở 2 namespace khác nhau nên mình phải đặt service name ở dạng full theo format: <service-name>.<namespace>.svc.<cluster-name> trong đó cluster name đang set là “kubernetes”

    Sử dụng lệnh dưới để lấy cluster name

    kubectl config view --minify -o jsonpath='{.clusters[].name}'

    Sử dụng lệnh dưới để lấy service name

    $ kubectl get svc -n minio
    NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
    minio   ClusterIP   10.105.145.6   <none>        9000/TCP,9001/TCP   11h

    Tiếp theo phải update lại Prometheus để nó cập nhật value mình vừa thay đổi:

    $ helm -n monitoring upgrade prometheus-grafana-stack -f values-prometheus.yaml kube-prometheus-stack/
    Release "prometheus-grafana-stack" has been upgraded. Happy Helming!
    NAME: prometheus-grafana-stack
    LAST DEPLOYED: Thu Nov 10 02:34:42 2022
    NAMESPACE: monitoring
    STATUS: deployed
    REVISION: 4
    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.

    Bạn hãy vào Status – > Targets và chờ chút để update rồi vào lại web prometheus kiểm tra trong phần target xem đã có của Minio hay chưa.

    Như vậy là mình đã cấu hình cho Prometheus lấy được dữ liệu metrics của Minio rồi.

    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