Sunday, November 24, 2024

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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories