一、概述

本文介绍如何使用 Kube-Prometheus 监控 MySQL 数据库。通过部署 MySQL Exporter,将 MySQL 的性能指标暴露给 Prometheus 进行采集和监控。

核心组件:

  • MySQL Exporter:用于暴露 MySQL 指标的 Exporter(镜像版本:v0.14.0)
  • ServiceMonitor:Prometheus Operator 的 CRD,用于服务发现和指标采集配置

二、部署 MySQL Exporter

2.1 创建 Deployment

通过 Deployment 部署 MySQL Exporter,需要配置数据库连接信息。

apiVersion: apps/v1
kind: Deployment
metadata:
  #设置唯一名称,建议添加数据库实例ip
  name:  mysql-exporter-172.16.1.77 
  namespace: monitoring
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: mysql-exporter
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: v0.14.0
spec:
  selector:
    matchLabels:
      app.kubernetes.io/component: exporter
      app.kubernetes.io/name: mysql-exporter
      app.kubernetes.io/part-of: kube-prometheus
  replicas: 1
  template:
    metadata:
      labels:
        app.kubernetes.io/component: exporter
        app.kubernetes.io/name: mysql-exporter
        app.kubernetes.io/part-of: kube-prometheus
        app.kubernetes.io/version: v0.14.0
    spec:
      containers:
        - name: mysql-exporter
          image: prom/mysqld-exporter:v0.14.0
          env:
            - name: DATA_SOURCE_NAME
              # 格式:用户名:密码@(数据库地址:端口)/
              # 示例:root:password@(mysql-service.share-components:3306)/
              value: "root:password@(mysql-service.share-components:3306)/"
          resources:
            requests:
              cpu: 20m
              memory: 20Mi
            limits:
              cpu: 100m
              memory: 30Mi
          ports:
            - containerPort: 9104
              name: http
          volumeMounts:
            - name: localtime
              mountPath: /etc/localtime
      volumes:
        - name: localtime
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
      restartPolicy: Always

配置说明:

  • DATA_SOURCE_NAME:MySQL 连接串,需替换为实际的用户名、密码和地址
  • resources:资源限制,根据实际监控规模调整
  • volumeMounts:挂载宿主机时区文件,确保容器时区正确

2.2 创建 Service

为 MySQL Exporter 创建 Service,暴露监控端口。

apiVersion: v1
kind: Service
metadata:
  name: mysql-exporter
  namespace: monitoring
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: mysql-exporter
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: v0.14.0
    platform: mos
spec:
  selector:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: mysql-exporter
    app.kubernetes.io/part-of: kube-prometheus
  type: ClusterIP
  ports:
    - name: http
      port: 9104
      targetPort: http

配置说明:

  • port: 9104:MySQL Exporter 默认暴露端口
  • platform: mos:自定义标签,用于区分不同环境

2.3 创建 ServiceMonitor

ServiceMonitor 用于告诉 Prometheus 如何采集 MySQL Exporter 的指标。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: mysql-exporter
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: v0.14.0
  name: mysql-exporter
  namespace: monitoring
spec:
  endpoints:
    - interval: 15s
      port: http
      relabelings:
        - action: replace
          regex: (.*)
          replacement: $1
          sourceLabels:
            - __meta_kubernetes_pod_node_name
          targetLabel: instance
      scheme: http
  jobLabel: app.kubernetes.io/name
  targetLabels: [platform]
  selector:
    matchLabels:
      app.kubernetes.io/component: exporter
      app.kubernetes.io/name: mysql-exporter
      app.kubernetes.io/part-of: kube-prometheus

配置说明:

  • interval: 15s:每 15 秒采集一次指标
  • relabelings:指标重写规则,将 Pod 节点名作为 instance 标签值
  • targetLabels:将 Service 的 platform 标签添加到采集的指标中

三、验证部署

# 查看 Deployment 状态
kubectl get deployment mysql-exporter-172.16.1.77 -n monitoring

# 查看 Pod 日志
kubectl logs -f <pod-name> -n monitoring

# 访问 Exporter 指标接口
kubectl port-forward svc/mysql-exporter 9104:9104 -n monitoring
curl http://localhost:9104/metrics

四、监控指标说明

MySQL Exporter 提供的核心监控指标:

  • mysql_up:MySQL 实例是否可用
  • mysql_global_status_threads_connected:当前连接数
  • mysql_global_status_queries:查询总数
  • mysql_global_status_slow_queries:慢查询数量
  • mysql_global_variables_max_connections:最大连接数配置

五、注意事项

  1. 数据库权限:MySQL Exporter 需要的最小权限为 PROCESS, REPLICATION CLIENT, SELECT
  2. 多实例监控:监控多个 MySQL 实例时,需为每个实例创建独立的 Deployment,通过 name 区分
  3. 安全配置:生产环境建议使用 Secret 存储数据库密码,而非明文配置