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.