Prometheus实战教程:k8s平台-Mysql监控案例

配置文件优化后的 Prometheus 自动发现 MySQL 实例的完整 YAML 文件。该配置包括:

  1. MySQL Exporter 部署 :使用 ConfigMap 提供 MySQL 连接信息。
  2. Prometheus 自动发现:通过 Kubernetes 服务发现自动抓取 MySQL 实例。

1、mysql 配置文件 (mysql-deployment.yaml)

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
      annotations:
        prometheus.io/scrape: "true"  # 允许 Prometheus 抓取
        prometheus.io/port: "9104"    # MySQL Exporter 暴露的端口
    spec:
      containers:
      - name: mysql
        image: harbor.fq.com/public/mysql:9.1.0  # 使用官方 MySQL 镜像
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"  # 设置 MySQL root 密码
        ports:
        - containerPort: 3306  # MySQL 默认端口
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  labels:
    app: mysql
  annotations:
    prometheus.io/scrape: "true"  # 允许 Prometheus 抓取
    prometheus.io/port: "9104"    # MySQL Exporter 暴露的端口
spec:
  selector:
    app: mysql
  ports:
  - name: mysql
    protocol: TCP
    port: 3306
    targetPort: 3306

cat mysql-statefulset.yaml

复制代码
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  serviceName: "mysql"
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
      annotations:
        prometheus.io/scrape: "true"  # 允许 Prometheus 抓取
        prometheus.io/port: "9104"    # MySQL Exporter 暴露的端口
    spec:
      containers:
      - name: mysql
        image: harbor.fq.com/public/mysql:9.1.0  # MySQL 镜像
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"  # 设置 MySQL root 密码
        ports:
        - containerPort: 3306  # MySQL 默认端口
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql  # MySQL 数据存储路径
      volumes:
      - name: mysql-data
        emptyDir: {}  # 使用空目录,不持久化数据

---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  labels:
    app: mysql
  annotations:
    prometheus.io/scrape: "true"  # 允许 Prometheus 抓取
    prometheus.io/port: "9104"    # MySQL Exporter 暴露的端口
spec:
  selector:
    app: mysql
  ports:
  - name: mysql
    protocol: TCP
    port: 3306
    targetPort: 3306
  type: ClusterIP  # 内部服务

2、登录mysql,并创建'mysql_exporter'用户

2.1、查看mysql容器名称,登录到容器内

复制代码
[root@k8s-master01 example]# kubectl get pod
NAME                                  READY   STATUS    RESTARTS   AGE
kuard-d574f5b78-r2l77                 1/1     Running   0          278d
mysql-0                               1/1     Running   0          6s

[root@k8s-master01 example]# kubectl exec -it mysql-0 -- bash
bash-5.1# 

2.2、确保 mysql_exporter 用户存在**

使用 MySQL root 用户登录并检查 mysql_exporter 用户:

复制代码
SELECT user, host FROM mysql.user WHERE user = 'mysql_exporter';

2.3、如果没有该用户,则创建:

复制代码
CREATE USER 'mysql_exporter'@'%' IDENTIFIED BY 'your_password';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysql_exporter'@'%';
FLUSH PRIVILEGES;

实操:

复制代码
CREATE USER 'mysql_exporter'@'%' IDENTIFIED BY 'mysql123!';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysql_exporter'@'%';
FLUSH PRIVILEGES;

![[IMG-5、k8s平台:mysql 监控案例-20250318102405307.png]]

复制代码
mysql> SELECT user, host FROM mysql.user WHERE user = 'mysql_exporter';
Empty set (0.00 sec)

mysql> CREATE USER 'mysql_exporter'@'%' IDENTIFIED BY 'mysql123!';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysql_exporter'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT user, host FROM mysql.user WHERE user = 'mysql_exporter';
+----------------+------+
| user           | host |
+----------------+------+
| mysql_exporter | %    |
+----------------+------+
1 row in set (0.00 sec)

mysql>

注意 :确保 your_passwordmysqld-exporter 配置的密码匹配。

4. MySQL Exporter 配置文件 (mysql-exporter-config.yaml)

复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-exporter-config
data:
  .my.cnf: |-
    [client]
    user = mysql_exporter
    password = mysql123!

    [client.servers]
    user = mysql_exporter
    password = mysql123!

5. MySQL Exporter 部署文件 (mysql-exporter-deployment.yaml)

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-exporter
  labels:
    app: mysql-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql-exporter
  template:
    metadata:
      labels:
        app: mysql-exporter
      annotations:
        prometheus.io/scrape: "true"  # 允许 Prometheus 抓取
        prometheus.io/port: "9104"    # MySQL Exporter 暴露的端口
    spec:
      volumes:
      - name: mysql-exporter-config
        configMap:
          name: mysql-exporter-config
          items:
          - key: .my.cnf
            path: .my.cnf
      containers:
      - name: mysql-exporter
        image: harbor.fq.com/prometheus/mysql-exporter:v0.16.0
        command:
        - mysqld_exporter
        - --config.my-cnf=/etc/mysql-exporter/.my.cnf  # 指定配置文件路径
        securityContext:
          runAsUser: 0  # 以 root 用户运行
        ports:
        - containerPort: 9104  # MySQL Exporter 默认端口
        volumeMounts:
        - name: mysql-exporter-config
          mountPath: /etc/mysql-exporter/.my.cnf
          subPath: .my.cnf
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-exporter-service
  labels:
    app: mysql-exporter
  annotations:
    prometheus.io/scrape: "true"  # 允许 Prometheus 抓取
    prometheus.io/port: "9104"    # MySQL Exporter 暴露的端口
spec:
  selector:
    app: mysql-exporter
  ports:
  - protocol: TCP
    port: 9104
    targetPort: 9104
  type: ClusterIP

6. Prometheus 自动发现配置 (prometheus.yml)

复制代码
scrape_configs:
  - job_name: 'mysql'
    kubernetes_sd_configs:
      - role: endpoints  # 从 Kubernetes Endpoints 发现服务
    relabel_configs:
      # 只抓取带有 `prometheus.io/scrape: "true"` 注解的服务
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true

      # 替换目标地址为服务的 IP 和指定端口(9104)
      - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
        action: keep
        regex: Pod;(.*mysql-exporter.*)  # 仅抓取名称包含 "mysql-exporter" 的 Pod
      - source_labels: [__meta_kubernetes_pod_ip]
        action: replace
        target_label: __address__
        replacement: $1:9104  # 指定 MySQL Exporter 的端口为 9104

      # 添加 Kubernetes 服务的 app 标签
      - source_labels: [__meta_kubernetes_service_label_app]
        action: replace
        target_label: app

      # 添加 Kubernetes 命名空间标签
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: namespace

      # 添加 Kubernetes 服务名称标签
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: service

      # 添加 Kubernetes Pod 名称标签
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod

      # 添加 Kubernetes 节点名称标签
      - source_labels: [__meta_kubernetes_pod_node_name]
        action: replace
        target_label: node

      # 添加实例标签(用于区分不同的 MySQL 实例)
      - source_labels: [__meta_kubernetes_pod_ip]
        action: replace
        target_label: instance

7. 部署步骤

  1. 创建 ConfigMap

    复制代码
    kubectl apply -f mysql-exporter-config.yaml
  2. 部署 MySQL Exporter:

    复制代码
    kubectl apply -f mysql-exporter-deployment.yaml
  3. 更新 Prometheus 配置文件(prometheus.yml),添加 MySQL 的自动发现配置。

  4. 重启 Prometheus 以加载新配置。


8. 验证

  1. 检查 mysql-exporter 容器日志:

    复制代码
    kubectl logs <mysql-exporter-pod-name> -c mysql-exporter
    • 确保没有错误日志。
  2. 检查 Pod 状态:

    复制代码
    kubectl get pods
    • 确保 mysql-exporter 容器处于 Running 状态。
  3. 访问 Prometheus Web UI(http://<prometheus-server>:9090),查看 Targets 页面,确认 MySQL 目标已被发现。 ![[IMG-5、k8s平台:mysql 监控案例-20250317170341907.png]]


9. 生产环境建议

  • 高可用性 :部署多个 MySQL Exporter 实例,并使用 Kubernetes 的 HorizontalPodAutoscaler 实现自动扩展。
  • 监控告警:设置 MySQL 关键指标的告警规则(如连接数、慢查询等)。
  • 资源限制:为 MySQL Exporter 设置资源限制(CPU 和内存)。
  • 日志管理:收集 MySQL Exporter 的日志,便于排查问题。

10. 示例告警规则 (mysql-alerts.yml)

复制代码
groups:
  - name: mysql_alerts
    rules:
      - alert: MySQLDown
        expr: mysql_up == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "MySQL is down"
          description: "MySQL instance {{ $labels.instance }} is down."

      - alert: HighMySQLConnections
        expr: mysql_global_status_connections > 1000
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High number of MySQL connections"
          description: "MySQL instance {{ $labels.instance }} has more than 1000 connections."

      - alert: HighMySQLSlowQueries
        expr: mysql_global_status_slow_queries > 10
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High number of slow queries on MySQL"
          description: "MySQL instance {{ $labels.instance }} has more than 10 slow queries."
相关推荐
什么半岛铁盒12 分钟前
Linux信号的保存
linux·运维·网络
黄暄31 分钟前
初识计算机网络。计算机网络基本概念,分类,性能指标
笔记·学习·计算机网络·考研
noravinsc40 分钟前
国产化中间件 替换 nginx
运维·nginx·中间件
惜.己1 小时前
Linux常用命令(十四)
linux·运维·服务器
梅子酱~1 小时前
Vue 学习随笔系列二十三 -- el-date-picker 组件
前端·vue.js·学习
Alice-YUE2 小时前
【HTML5学习笔记1】html标签(上)
前端·笔记·学习·html·html5
linkingvision2 小时前
H5S 视频监控AWS S3 对象存储
linux·运维·aws·视频监控s3对象存储
jerry6092 小时前
LLM笔记(五)概率论
人工智能·笔记·学习·概率论
doupoa2 小时前
Fabric 服务端插件开发简述与聊天事件监听转发
运维·python·fabric
BillKu2 小时前
服务器多JAR程序运行与管理指南
运维·服务器·jar