一、前言

MinIO 是一个开源的对象存储服务器,它可以在本地或云端部署,提供可伸缩的存储解决方案。尽管MinIO 本身是一个稳定可靠的存储系统,但监控对于任何分布式系统都是至关重要的,包括 MinIO 存储。

针对 kubernetes 集群中的 MinIO 哪几个方面我们需要监控?

1)存储性能:监控MinIO的存储性能,包括 IOPS、吞吐量、响应时间等。

2)可用性和可靠性:监控MinIO服务的可用性和可靠性,确保集群中的节点和组件正常运行。如:MinIO的健康状态、错误率、异常请求等。

3)资源利用率:监控MinIO集群的资源利用率,包括CPU、内存、磁盘空间等

二、MinIO监控

MinIO 自身提供了关于集群状态和操作的相关的 Prometheus SQL 指标与支持 Prometheus 数据模型的 监控指标收集工具进行搭配使用,无论是主机部署亦或是云上部署都可以进行集成。官方选定的第三方监控软件为 Prometheus 和 InfluxDB,大家可以根据各自公司对于监控设施的建设进行选择。

为了保护服务器指标的安全性,MinIO 服务提供了两种安全设置来进行身份安全的验证。

  • 使用 mc 工具来生成 prometheus 必要的令牌
  • 设置参数变量忽略身份验证

2.1 使用mc工具来生成 prometheus 身份令牌

#查看目前的minio host信息
$ mc config host list
...
k8s-s3
  URL       : http://<minio-endpoint>
  AccessKey : <your-access-key>
  SecretKey : <your-secret-key>
  API       : s3v4
  Path      : auto
  Src       : /root/.mc/config.json
...

生成身份令牌:

[root@master01 ~]# mc admin prometheus generate k8s-s3
scrape_configs:
- job_name: minio-job
  bearer_token: <prometheus-bearer-token>
  metrics_path: /minio/v2/metrics/cluster
  scheme: http
  static_configs:
  - targets: [s3.zhang-qing.com]

将 job_name 设置为与 MinIO 部署关联的值:

  • 如果选择使用设置参数变量来忽略身份验证的方式,忽略 bearer_token 字段;
  • 将 scheme 设置为 http,指标抓取的协议;
  • targets 参数为 MinIO 部署的主机名设置,这个可以是任何单个节点,也可以是处理 MinIO 之间负载均衡器的节点。

2.2 测试验证

通过 curl 验证下(由于需要Authorization头部信息,所以浏览器直接访问不行),即可返回prometheus可以抓取读取的监控数据:

$ curl -v -sSL -H 'Authorization: Bearer 你上面申请的token' http://<minio-endpoint>/minio/v2/metrics/cluster

[root@master01 ~]# curl -v -sSL -H "Authorization: Bearer <prometheus-bearer-token>" http://<minio-endpoint>/minio/v2/metrics/cluster

2.3 配置prometheus监控

将上一步生成的 scrape_config 配置添加的 prometheus 配置文件中:

# 添加如下内容
global:
  scrape_interval: 15s
scrape_configs:
  - job_name: minio-job
    bearer_token:
     <prometheus-bearer-token>
    metrics_path: /minio/v2/metrics/cluster
    scheme: http
    static_configs:
      - targets: [s3.zhang-qing.com]

# 完整配置文件
[root@master01 ~]# cat  /root/7/prometheus-config.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: monitor
data:
  prometheus.yml: |
    global:
      scrape_interval:     15s
      evaluation_interval: 15s
      external_labels:
        cluster: "kubernetes"

    ############ 添加配置 Aertmanager 服务器地址 ###################
    alerting:
      alertmanagers:
      - static_configs:
        - targets: ["alertmanager:9093"]         

    ############ 数据采集job ###################

    scrape_configs:
    ########## prometheus 监控配置 ##########
    - job_name: prometheus
      static_configs:
      - targets: ['127.0.0.1:9090']
        labels:
          instance: prometheus

    ########## minio 监控配置 ##########
    - job_name: minio-job
      bearer_token: <prometheus-bearer-token>
      metrics_path: /minio/v2/metrics/cluster
      scheme: http
      static_configs:
        - targets: [s3.zhang-qing.com]
    ########## kube-apiserver 监控配置 ##########
    - job_name: kube-apiserver
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name]
        action: keep
        regex: default;kubernetes
      - source_labels: [__meta_kubernetes_endpoints_name]
        action: replace
        target_label: endpoint
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: service
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: namespace

    ########## kube-controller-manager 监控配置 ##########
    - job_name: 'kube-controller-manager'
      # 使用 Kubernetes Pod 发现机制
      kubernetes_sd_configs:
        - role: pod
      # 强制使用 HTTPS 协议
      scheme: https
      # TLS 配置(测试环境跳过验证)
      tls_config:
        insecure_skip_verify: true
      # 使用 ServiceAccount 的 Token 认证
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
        # 保留标签为 component=kube-controller-manager 的 Pod
        - source_labels: [__meta_kubernetes_pod_label_component]
          regex: kube-controller-manager
          action: keep
        # 重写目标地址为 Pod IP + 10257 端口
        - source_labels: [__meta_kubernetes_pod_ip]
          regex: (.+)
          target_label: __address__
          replacement: "${1}:10257"
        # 强制使用 HTTPS 协议(冗余但明确)
        - source_labels: []
          regex: .*
          target_label: __scheme__
          replacement: https
        # 附加元数据标签
        - source_labels: [__meta_kubernetes_endpoints_name]
          action: replace
          target_label: endpoint
        - source_labels: [__meta_kubernetes_pod_name]
          action: replace
          target_label: pod
        - source_labels: [__meta_kubernetes_service_name]
          action: replace
          target_label: service
        - source_labels: [__meta_kubernetes_namespace]
          action: replace
          target_label: namespace                

    ########## kube-scheduler 监控配置 ##########
    - job_name: 'kube-scheduler'
      kubernetes_sd_configs:
        - role: pod
      scheme: https
      tls_config:
        insecure_skip_verify: true
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
        - source_labels: [__meta_kubernetes_pod_label_component]
          regex: kube-scheduler
          action: keep
        - source_labels: [__meta_kubernetes_pod_ip]
          regex: (.+)
          target_label: __address__
          replacement: "${1}:10259"
        - source_labels: []
          regex: .*
          target_label: __scheme__
          replacement: https
        - source_labels: [__meta_kubernetes_endpoints_name]
          action: replace
          target_label: endpoint
        - source_labels: [__meta_kubernetes_pod_name]
          action: replace
          target_label: pod
        - source_labels: [__meta_kubernetes_service_name]
          action: replace
          target_label: service
        - source_labels: [__meta_kubernetes_namespace]
          action: replace
          target_label: namespace

    ########## kube-state-metrics 监控配置 ##########
    - job_name: kube-state-metrics
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_name]
        regex: kube-state-metrics
        action: keep
      - source_labels: [__meta_kubernetes_pod_ip]
        regex: (.+)
        target_label: __address__
        replacement: ${1}:8080
      - source_labels: [__meta_kubernetes_endpoints_name]
        action: replace
        target_label: endpoint
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: service
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: namespace

    ########## coredns 监控配置 ##########
    - job_name: coredns
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels:
          - __meta_kubernetes_service_label_k8s_app
        regex: kube-dns
        action: keep
      - source_labels: [__meta_kubernetes_pod_ip]
        regex: (.+)
        target_label: __address__
        replacement: ${1}:9153
      - source_labels: [__meta_kubernetes_endpoints_name]
        action: replace
        target_label: endpoint
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: service
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: namespace

    ########## etcd 监控配置 ##########
    - job_name: etcd
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels:
          - __meta_kubernetes_pod_label_component
        regex: etcd
        action: keep
      - source_labels: [__meta_kubernetes_pod_ip]
        regex: (.+)
        target_label: __address__
        replacement: ${1}:2381
      - source_labels: [__meta_kubernetes_endpoints_name]
        action: replace
        target_label: endpoint
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: namespace

    ########## kubelet 监控配置 ##########
    - job_name: kubelet
      metrics_path: /metrics/cadvisor
      scheme: https
      tls_config:
        insecure_skip_verify: true
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - source_labels: [__meta_kubernetes_endpoints_name]
        action: replace
        target_label: endpoint
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: namespace   

    ########## k8s-node 监控配置 ##########
    - job_name: k8s-nodes
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - source_labels: [__meta_kubernetes_endpoints_name]
        action: replace
        target_label: endpoint
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: namespace 

    ########## DNS 监控配置 ##########
    - job_name: "kubernetes-dns"
      metrics_path: /probe              # 不是metrics,是probe
      params:
        module: [dns_tcp]               # 使用DNS TCP模块
      static_configs:
        - targets:
          - kube-dns.kube-system:53             #不要省略端口号
          - 8.8.4.4:53
          - 8.8.8.8:53
          - 223.5.5.5:53
      relabel_configs:
        - source_labels: [__address__]
          target_label: __param_target
        - source_labels: [__param_target]
          target_label: instance
        - target_label: __address__
          replacement: blackbox-exporter.monitor:9115 # 服务地址,和上面的 Service 定义保持一致

    ########## ICMP 监控配置 ##########
    - job_name: icmp-status
      metrics_path: /probe
      params:
        module: [icmp]
      static_configs:
      - targets:
        - 10.0.0.61
        labels:
          group: icmp
      relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter.monitor:9115

    ########## HTTP 监控配置 ##########
    - job_name: 'kubernetes-services'
      metrics_path: /probe
      params:
        module:         ## 使用HTTP_GET_2xx与HTTP_GET_3XX模块
        - "http_get_2xx"
        - "http_get_3xx"
      kubernetes_sd_configs:            ## 使用Kubernetes动态服务发现,且使用Service类型的发现
      - role: service
      relabel_configs:          ## 设置只监测Kubernetes Service中Annotation里配置了注解prometheus.io/http_probe: true的service
      - action: keep
        source_labels: [__meta_kubernetes_service_annotation_prometheus_io_http_probe]
        regex: "true"
      - action: replace
        source_labels: 
        - "__meta_kubernetes_service_name"
        - "__meta_kubernetes_namespace"
        - "__meta_kubernetes_service_annotation_prometheus_io_http_probe_port"
        - "__meta_kubernetes_service_annotation_prometheus_io_http_probe_path"
        target_label: __param_target
        regex: (.+);(.+);(.+);(.+)
        replacement: $1.$2:$3$4
      - target_label: __address__
        replacement: blackbox-exporter.monitor:9115             ## BlackBox Exporter 的 Service 地址
      - source_labels: [__param_target]
        target_label: instance
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        target_label: kubernetes_name   

    ########## TCP 监控配置 ##########
    - job_name: "service-tcp-probe"
      scrape_interval: 1m
      metrics_path: /probe
      # 使用blackbox exporter配置文件的tcp_connect的探针
      params:
        module: [tcp_connect]
      kubernetes_sd_configs:
      - role: service
      relabel_configs:
      # 保留prometheus.io/scrape: "true"和prometheus.io/tcp-probe: "true"的service
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape, __meta_kubernetes_service_annotation_prometheus_io_tcp_probe]
        action: keep
        regex: true;true
      # 将原标签名__meta_kubernetes_service_name改成service_name
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        regex: (.*)
        target_label: service_name
      # 将原标签名__meta_kubernetes_service_name改成service_name
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        regex: (.*)
        target_label: namespace
      # 将instance改成 `clusterIP:port` 地址
      - source_labels: [__meta_kubernetes_service_cluster_ip, __meta_kubernetes_service_annotation_prometheus_io_http_probe_port]
        action: replace
        regex: (.*);(.*)
        target_label: __param_target
        replacement: $1:$2
      - source_labels: [__param_target]
        target_label: instance
      # 将__address__的值改成 `blackbox-exporter.monitor:9115`
      - target_label: __address__
        replacement: blackbox-exporter.monitor:9115

    ########## Ingress 监控配置 ########## 
    - job_name: 'blackbox-k8s-ingresses'
      scrape_interval: 30s
      scrape_timeout: 10s
      metrics_path: /probe
      params:
        module: [http_get_2xx]  # 使用定义的http模块
      kubernetes_sd_configs:
      - role: ingress  # ingress 类型的服务发现
      relabel_configs:
      # 只有ingress的annotation中配置了 prometheus.io/http_probe=true 的才进行发现
      - source_labels: [__meta_kubernetes_ingress_annotation_prometheus_io_http_probe]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]
        regex: (.+);(.+);(.+)
        replacement: ${1}://${2}${3}
        target_label: __param_target
      - target_label: __address__
        replacement: blackbox-exporter.monitor:9115
      - source_labels: [__param_target]
        target_label: instance
      - action: labelmap
        regex: __meta_kubernetes_ingress_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_ingress_name]
        target_label: kubernetes_name

    ########## 外部域名 监控配置 ##########
    - job_name: "blackbox-external-website"
      scrape_interval: 30s
      scrape_timeout: 15s
      metrics_path: /probe
      params:
        module: [http_get_2xx]
      static_configs:
      - targets:
        - https://www.baidu.com # 改为公司对外服务的域名
        - https://www.jd.com
      relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter.monitor:9115
    ########## 云上ECS 监控配置 ##########
    - job_name: 'other-ECS'
      static_configs:
        - targets: ['101.201.68.158:9100']
          labels:
            hostname: 'test-node-exporter'

    ########## 进程 监控配置 ##########
    - job_name: 'process-exporter'
      static_configs:
      - targets: ['<node-ip>:9256']

    ########## Mysql 监控配置 ##########
    - job_name: 'mysql-exporter'
      static_configs:
      - targets: ['<node-ip>:9104']

    ########## Consul 监控配置 ##########
    - job_name: consul
      honor_labels: true
      metrics_path: /metrics
      scheme: http
      consul_sd_configs:    #基于consul服务发现的配置
        - server: <node-ip>:18500    #consul的监听地址
          services: []                 #匹配consul中所有的service
      relabel_configs:             #relabel_configs下面都是重写标签相关配置
      - source_labels: ['__meta_consul_tags']    #将__meta_consul_tags标签的至赋值给product
        target_label: 'servername'
      - source_labels: ['__meta_consul_dc']   #将__meta_consul_dc的值赋值给idc
        target_label: 'idc'
      - source_labels: ['__meta_consul_service']   
        regex: "consul"  #匹配为"consul"的service
        action: drop       #执行的动作为删除 

    ############ 指定告警规则文件路径位置 ###################
    rule_files:
    - /etc/prometheus/rules/*.rules

# 配置生效
[root@master01 ~]# kaf /root/7/prometheus-config.yaml 

# 热加载
[root@master01 ~]# curl -XPOST http://prometheus.zhang-qing.com/-/reload

验证

Day15-Minio存储-图11

如果当前prometheus架构为 Prometheus Operator,大家也来回顾下,这块添加的流程是?

  • 1)创建 MinIO k8s-s3 的 service;(默认已创建,minio-tenant-1 namespace 下的 minio)
  • 2)创建 MinIO 集群的 ServiceMonitor;
  • 3)访问 Prometheus 的 Target 界面。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app: minio-s3
  name: minio-s3
  namespace: monitor
spec:
  endpoints:
    - interval: 15s # 采集频率根据实际需求配置,prometheus默认是15s
      port: minio # 采集节点端口,service中定义的name
      path: /minio/v2/metrics/cluster # 暴露指标的接口路径;默认路径是/metrics,老版本minio的监控接口是/minio/prometheus/metrics ,现在也还能用,暴露的指标少很多
  namespaceSelector:
    matchNames: # Namespace选择器,关联minio service所在namespace
      - monitor
  selector:
    matchLabels: #service选择器,和service的labels保持一致
      app: minio

2.4 分析收集的指标

Prometheus包括一个表达式搜索,可以在此处执行 Prometheus SQL 来查询分析收集的指标。

## 指标示例
minio_cluster_drive_online_total{job="minio-job"}[5m]
结果:
minio_cluster_drive_online_total{instance="s3.zhang-qing.com:80", job="minio-job",
server="minio-1-ss-0-0.minio-1-hl.minio-tenant-1.svc.cluster.local:9000"}
12 @1700300115.203
12 @1700300160.202
12 @1700300205.203
12 @1700300250.202
12 @1700300295.202
12 @1700300340.202
12 @1700300385.202
minio_cluster_drive_online_total{instance="s3.zhang-qing.com:80", job="minio-job",
server="minio-1-ss-0-1.minio-1-hl.minio-tenant-1.svc.cluster.local:9000"}
12 @1700300130.202
12 @1700300175.203
12 @1700300220.202
12 @1700300265.203
12 @1700300310.203
12 @1700300355.202
12 @1700300400.203
minio_cluster_drive_online_total{instance="s3.zhang-qing.com:80", job="minio-job",
server="minio-1-ss-0-2.minio-1-hl.minio-tenant-1.svc.cluster.local:9000"}
12 @1700300145.202
12 @1700300190.202
12 @1700300235.202
12 @1700300280.202
12 @1700300325.202
12 @1700300370.203
-------------------
minio_cluster_drive_offline_total{job="minio-job"}[5m]
minio_cluster_bucket_total{job="minio-job"}[5m]
minio_cluster_capacity_usable_free_bytes{job="minio-job"}[5m]

三、使用 MinIO 指标配置警报规则

MinIO提供相应的指标作为第三方告警平台触发警告的基线,可以通过修改或者其他方式合理的使用这些指标构建自己的告警规则。

# 添加如下内容
  minio.rules: |
    groups:
      - name: minio-alerts
        rules:
          - alert: NodesOffline
            expr: |
              avg_over_time(minio_cluster_nodes_offline_total{job="minio-job"}[5m]) > 0
            for: 10m
            labels:
              severity: warn
            annotations:
              summary: "Node down in MinIO deployment"
              description: "Node(s) in cluster {{ $labels.instance }} offline for more than 5 minutes"
          - alert: DisksOffline
            expr: |
              avg_over_time(minio_cluster_drive_offline_total{job="minio-job"}[5m]) > 0
            for: 10m
            labels:
              severity: warn
            annotations:
              summary: "Disks down in MinIO deployment"
              description: "Disks(s) in cluster {{ $labels.instance }} offline for more than 5 minutes"

# 完整配置文件
[root@master01 ~]# vim  /root/7/prometheus-rules.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-rules
  namespace: monitor
data:
  general.rules: |
    groups:
    - name: general.rules
      rules:
      - alert: InstanceDown
        expr: |
          up{job=~"other-ECS|k8s-nodes|prometheus"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Instance {{ $labels.instance }} 停止工作"
          description: "{{ $labels.instance }} 主机名:{{ $labels.hostname }} 已经停止1分钟以上."

  node.rules: |
    groups:
    - name: node.rules
      rules:
      - alert: NodeFilesystemUsage
        expr: |
          100 - (node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 > 85
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "Instance {{ $labels.instance }} : {{ $labels.mountpoint }} 分区使用率过高"
          description: "{{ $labels.instance }} 主机名:{{ $labels.hostname }} : {{ $labels.mountpoint }} 分区使用大于85% (当前值: {{ $value }})"

  minio.rules: |
    groups:
      - name: minio-alerts
        rules:
          - alert: NodesOffline
            expr: |
              avg_over_time(minio_cluster_nodes_offline_total{job="minio-job"}[5m]) > 0
            for: 10m
            labels:
              severity: warn
            annotations:
              summary: "Node down in MinIO deployment"
              description: "Node(s) in cluster {{ $labels.instance }} offline for more than 5 minutes"
          - alert: DisksOffline
            expr: |
              avg_over_time(minio_cluster_drive_offline_total{job="minio-job"}[5m]) > 0
            for: 10m
            labels:
              severity: warn
            annotations:
              summary: "Disks down in MinIO deployment"
              description: "Disks(s) in cluster {{ $labels.instance }} offline for more than 5 minutes"

# 应用
[root@master01 ~]# kaf /root/7/prometheus-rules.yaml 

# 热加载
[root@master01 ~]# curl -XPOST http://prometheus.zhang-qing.com/-/reload

一旦触发,Prometheus 就会将警报发送到配置的 AlertManager 服务。

image-20250420085949415

四、MinIO原生自带的监控控制台

官方介绍:https://min.io/docs/minio/linux/operations/monitoring/metrics-and-alerts.html

MinIO有着自己独有的客户端控制台,其中集成了监控功能,默认是没使用。

如果要使用,只需稍微增加两行配置参数即可打开。对服务器信息、节点信息、磁盘驱动信息、时间段 上传下载文件的统计、以及整体的容量信息、minio-server请求情况等都有收集。

  • 将 MINIO_PROMETHEUS_URL 设置为 Prometheus 服务的 URL;
  • 将 MINIO_PROMETHEUS_JOB_ID 设置为分配给收集的指标的唯一作业 ID;

如上咱们只需要操作 MINIO_PROMETHEUS_URL 即可,默认MINIO_PROMETHEUS_JOB_ID 已经携带:

$ kubectl edit sts minio-1-ss-0 -nminio-tenant-1

在 env 处,MINIO_PROMETHEUS_JOB_ID 下方新增:
env:
  - name: MINIO_CONFIG_ENV_FILE
    value: /tmp/minio/config.env
  - name: MINIO_OPERATOR_VERSION
    value: (dev)
  - name: MINIO_PROMETHEUS_JOB_ID
    value: minio-job
  - name: MINIO_PROMETHEUS_URL
    value: "http://prometheus.monitor.svc:9090"

修改完成后,会自动重启 MinIO 服务,访问控制台 Monitoring 菜单即可查看到监控指标。

五、常见的核心监控指标

由于 MinIO 版本更新较快,对应的数据指标名称可能会变化,如果采集数据为空,大家可以参照官方提供的数据进行当前版本的指标确认!

[root@master01 ~]# curl -v -sSL -H "Authorization: Bearer <prometheus-bearer-token>" http://<minio-endpoint>/minio/v2/metrics/cluster

官方参照数据:

5.1 对象和存储桶指标(核心指标)

指定格式:{bucket="STRING"}

#指标名称 #解释
minio_cluster_objects_size_distribution 给定存储桶中对象大小的分布
minio_cluster_usage_object_total 给定存储桶中的对象总数
minio_cluster_usage_total_bytes 给定存储桶中的总存储桶大小(以字节为单位)
minio_cluster_quota_total_bytes 存储桶总配额大小(以字节为单位)

5.2 复制指标(核心指标)

#指标名称 #解释
minio_cluster_replication_failed_bytes 对于给定存储桶,至少复制一次失败的字节总数
minio_cluster_replication_pending_bytes 给定存储桶挂起的待复制字节总数
minio_cluster_replication_received_bytes 从另一个源存储桶复制到此存储桶的总字节数
minio_cluster_replication_sent_bytes 复制到目标存储桶的总字节数。 您可以使用标签标识存储桶
minio_cluster_replication_pending_count 给定存储桶挂起的复制操作总数
minio_cluster_replication_failed_count 给定存储桶失败的复制操作总数

5.3 容量指标(核心指标)

#指标名称 #解释
minio_cluster_capacity_raw_free_bytes 集群中在线空闲容量总和
minio_cluster_capacity_raw_total_bytes 集群中的在线总容量。
minio_cluster_capacity_usable_free_bytes 集群中可用的空闲容量
minio_cluster_capacity_usable_total_bytes 集群中的总可用容量。
minio_node_disk_free_bytes MinIO 部署中节点的特定驱动器上可用的总存储量
minio_node_disk_total_bytes MinIO 部署中节点的特定驱动器上的总存储量
minio_node_disk_used_bytes MinIO 部署中节点的特定驱动器上使用的总存储量

5.4 生命周期管理指标(核心指标)

#指标名称 #解释
minio_node_ilm_transitioned_bytes 使用分层/转换生命周期管理规则转换的总字节数
minio_node_ilm_transitioned_objects 使用分层/转换生命周期管理规则转换的对象总数
minio_node_ilm_transitioned_versions 使用分层/转换生命周期管理规则转换的非当前对象版本总数
minio_node_ilm_transition_pending_tasks 挂起的对象转换任务总数
minio_node_ilm_expiry_pending_tasks 挂起对象过期任务总数
minio_node_ilm_expiry_active_tasks 活动对象过期任务总数

5.5 节点和驱动器运行状况指标(核心指标)

#指标名称 #解释
minio_cluster_drive_online_total 在线驱动器总数
minio_cluster_drive_offline_total 离线驱动器总数
minio_cluster_drive_total 驱动器总数
minio_cluster_nodes_online_total 在线的MinIO节点总数
minio_cluster_nodes_offline_total 离线的MinIO节点总数
minio_heal_objects_error_total 处在自我修复运行中修复失败的对象总数
minio_heal_objects_heal_total 在当前自我修复运行中修复的对象总数
minio_heal_objects_total 当前自我修复运行中扫描的对象总数
minio_heal_time_last_activity_nano_seconds 距离上次自我修复的事件(以纳秒为单位)

5.6 通知队列指标

#指标名称 #解释
minio_audit_target_queue_length 队列中未发送的审核消息总数。
minio_audit_total_messages 自上次服务器启动以来发送的审核消息总数。
minio_audit_failed_messages 自上次服务器启动以来未能发送的审核消息总数。
minio_notify_current_send_in_progress 正在向配置的目标发送的通知消息总数。
minio_notify_target_queue_length 队列中未发送的通知消息总数。

5.7 扫描仪指标

#指标名称 #解释
minio_node_scanner_bucket_scans_finished 自服务器启动以来完成的存储桶扫描总数
minio_node_scanner_bucket_scans_started 自服务器启动以来启动的存储桶扫描总数。
minio_node_scanner_directories_scanned 自服务器启动以来扫描的目录总数。
minio_node_scanner_objects_scanned 自服务器启动以来扫描的唯一对象总数。
minio_node_scanner_versions_scanned 自服务器启动以来扫描的对象版本总数。
minio_node_syscall_read_total 对内核的读取系统调用总数
minio_node_syscall_write_total 对内核的写入系统调用总数

5.8 S3指标

#指标名称 #解释
minio_bucket_traffic_sent_bytes 每个存储桶发送的 S3 流量的总字节数。 您可以使用标签标识存储桶
minio_bucket_traffic_received_bytes 每个存储桶接收的 S3 流量的总字节数。 您可以使用标签标识存储桶
minio_s3_requests_inflight_total 当前正在运行的 S3 请求总数
minio_s3_requests_total S3 请求总数
minio_s3_time_ttfb_seconds_distribution  API 调用之间分配到第一个字节的时间
minio_s3_traffic_received_bytes 接收的 S3 字节总数
minio_s3_traffic_sent_bytes 发送的 S3 字节总数
minio_s3_requests_errors_total 具有 4xx  5xx 错误的 S3 请求总数
minio_s3_requests_4xx_errors_total 具有 4xx 错误的 S3 请求总数
minio_s3_requests_5xx_errors_total 具有 5xx 错误的 S3 请求总数(原文此处“具有 3xx 错误的 S5 请求总数”可能有误,推测为 5xx 错误的 S3 请求总数)

5.9 内部指标

#指标名称 #解释
minio_inter_node_traffic_received_bytes 从其他对等节点接收的总字节数
minio_inter_node_traffic_sent_bytes 发送到其他对等节点的总字节数
minio_node_file_descriptor_limit_total 限制 MinIO 服务器进程的打开文件描述符总数
minio_node_file_descriptor_open_total MinIO 服务器进程打开的文件描述符总数
minio_node_io_rchar_bytes 进程从底层存储系统读取的总字节数,包括缓存(/proc/[pid]/io rchar)
minio_node_io_read_bytes 进程从底层存储系统读取的总字节数(/proc/[pid]/io read_bytes)
minio_node_io_wchar_bytes 进程写入底层存储系统的总字节数,包括页面缓存(/proc/[pid]/io wchar)
minio_node_io_write_bytes 进程写入底层存储系统的总字节数(/proc/[pid]/io write_bytes)

5.10 软件和流程指标

#指标名称 #解释
minio_software_commit_info MinIO 版本的 Git 提交哈希。
minio_software_version_info 服务器的 MinIO 发布标记
minio_node_process_starttime_seconds 每个节点的 MinIO 进程的开始时间,自 Unix 纪元以来的时间(以秒为单位)。
minio_node_process_uptime_seconds 每个节点的 MinIO 进程正常运行时间(以秒为单位)。

六、Grafana 监控大盘

更多大盘数据:https://min.io/docs/minio/kubernetes/upstream/operations/monitoring/grafana.ht ml

导入官方监控模板:13502

Day15-Minio存储-图12

Day15-Minio存储-图13

Day15-Minio存储-图14

七、MinIO 监控配置的踩坑记录

1)Prometheus 采集MinIO集群数据后,target 页面报错 server returned HTTP status 403 Forbidden。

原因:

MinIO 配置 Prometheus 访问权限异常,导致 Prometheus 没有权限访问 MinIO 集群,重点查看 bearer_token 或者 scheme。

2)导入MinIO 监控模板 13502 到 Grafana 后,无法看到 job 集群,也无法看到数据。

原因:

  • Grafana 版本过低,该错误是在 Grafana 的 7.3.4 版本出现,把 Grafana 升级到 8.5.5 版本后, Dashboard 立即恢复正常。
  • 查看确认 Grafana 的 DataSource 是否正确,查看异常大盘的指标数据,去 prometheus 中验证, 是否有这部分数据。