基于kubernetes的Prometheus监控mysql

kubernetes Prometheus监控mysql

Prometheus监控Pod中的应用,比如mysql,有2种方法

1.exporter pod方式,通过这个pod去监控mysql service上的数据,在通过/metrics暴露监控数据。

2.sidecar方式,在mysql pod中起一个exporter container,暴露/metrics。

说明:下面的实验我基于前面的ingress-nginx Prometheus监控实验,所有的deployment和svc都在ingress-nginx namespace 下面。

1.部署mysql

创建pv–5G限制,hostpath方式

创建pvc–申请1G,供mysql使用

创建service–名为mysql,暴露3306端口

创建deployment–用户名root,密码password

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  namespace: ingress-nginx
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  namespace: ingress-nginx
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: ingress-nginx
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None

---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: mysql
  namespace: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
          # Use secret in real usage
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

2.部署mysql exporter

创建service–名为mysql-export,暴露9104端口,供prometheus获取数据

创建exporter–env指定所监控的mysql service,需要用户名和密码

---
apiVersion: v1
kind: Service
metadata:
  name: mysql-exporter
  namespace: ingress-nginx
  labels:
    k8s-app: mysql-exporter
spec:
  selector:
    k8s-app: mysql-exporter
  ports:
  - name: mysql-exporter
    port: 9104
    protocol: TCP
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-exporter
  namespace: ingress-nginx
  labels:
    k8s-app: mysql-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: mysql-exporter
  template:
    metadata:
      labels:
        k8s-app: mysql-exporter
    spec:
      containers:
      - name: mysql-exporter
        image: prom/mysqld-exporter
        imagePullPolicy: IfNotPresent
        args: ["--collect.info_schema.processlist",
              "--collect.info_schema.innodb_metrics",
              "--collect.info_schema.tablestats",
              "--collect.info_schema.userstats",
              "--collect.engine_innodb_status",
              "--collect.slave_hosts"
              ]
        env:
        - name: DATA_SOURCE_NAME
          value: 'root:password@(mysql:3306)/mysql' # user:password@(hostname:3306)/
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 100m
            memory: 512Mi

3.Prometheus config修改获取数据

job名为mysql部分,是我添加的。

[root@master-1 ~]# kubectl edit cm prometheus-configuration-8hk4m6bf76 -n ingress-nginx
apiVersion: v1
data:
  prometheus.yaml: |
    global:
      scrape_interval: 10s
    scrape_configs:
    - job_name: 'ingress-nginx-endpoints'
      kubernetes_sd_configs:
      - role: pod
        namespaces:
          names:
          - ingress-nginx
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_container_port_number]
        action: keep
        regex: "10254"

    - job_name: 'mysql'
      static_configs:
      - targets: ['mysql-exporter:9104']
kind: ConfigMap
metadata:
  creationTimestamp: "2022-01-18T05:56:12Z"
  labels:
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: ingress-nginx
  name: prometheus-configuration-8hk4m6bf76
  namespace: ingress-nginx

删除Prometheus pod ,让配置生效
[root@master-1 ~]# kubectl delete pod prometheus-server-779c8d44cf-9m2lp -n ingress-nginx
pod "prometheus-server-779c8d44cf-9m2lp" deleted

访问Prometheus页面 http://192.168.5.21:30221/

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

看到上面3个截图,说明数据获取成功了。

Granfana 导入Mysql 监控图表 http://192.168.5.21:31414/ 用户名: admin 密码: admin
推荐图标ID:https://grafana.com/dashboards/7362

在这里插入图片描述


接下来,我们用sidecar方式来监控。

4.sidecar方式来监控

核心原理: 在pod中起一个mysql,一个mysql-export,并暴露3306,9104端口提供服务。

创建对象pv,pvc,deployment,service

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume-sidecar
  namespace: ingress-nginx
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data-sidecar"

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim-sidecar
  namespace: ingress-nginx
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

---
apiVersion: v1
kind: Service
metadata:
  name: mysql-sidecar
  namespace: ingress-nginx
spec:
  ports:
  - name: mysql
    port: 3306
  - name: prometheus
    port: 9104
  selector:
    app: mysql-sidecar

---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: mysql-sidecar
  namespace: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql-sidecar
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql-sidecar
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 100m
            memory: 512Mi
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage-sidecar
          mountPath: /var/lib/mysql

      - name: mysql-exporter
        image: prom/mysqld-exporter
        imagePullPolicy: IfNotPresent
        args: ["--collect.info_schema.processlist",
              "--collect.info_schema.innodb_metrics",
              "--collect.info_schema.tablestats",
              "--collect.info_schema.userstats",
              "--collect.engine_innodb_status",
              "--collect.slave_hosts"
              ]
        env:
        - name: DATA_SOURCE_NAME
          value: 'root:password@(localhost:3306)/mysql' # user:password@(hostname:3306)/
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 100m
            memory: 512Mi
        ports:
        - containerPort: 9104
          name: mysql-exporter

      volumes:
      - name: mysql-persistent-storage-sidecar
        persistentVolumeClaim:
          claimName: mysql-pv-claim-sidecar

检查状态

[root@master-1 ~]# kubectl get pod,svc
NAME                                            READY   STATUS      RESTARTS   AGE
pod/grafana-74d85fc5bf-2dsjx                    1/1     Running     0          23h
pod/ingress-nginx-admission-create--1-654zx     0/1     Completed   0          29h
pod/ingress-nginx-admission-patch--1-8xpsp      0/1     Completed   2          29h
pod/ingress-nginx-controller-6d6c58c986-xwwfc   1/1     Running     0          24h
pod/mysql-68579b78bb-7szbp                      1/1     Running     0          26m
pod/mysql-exporter-fccfc9646-wcdvq              1/1     Running     0          36m
pod/mysql-sidecar-646f6b474f-n6wdf              2/2     Running     0          13m
pod/prometheus-server-779c8d44cf-22f72          1/1     Running     0          34m

NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                      AGE
service/grafana                              NodePort       10.108.92.58     <none>        3000:31414/TCP                               23h
service/ingress-nginx-controller             LoadBalancer   10.96.194.255    <pending>     10254:30406/TCP,80:31361/TCP,443:32098/TCP   29h
service/ingress-nginx-controller-admission   ClusterIP      10.103.100.208   <none>        443/TCP                                      29h
service/mysql                                ClusterIP      None             <none>        3306/TCP                                     26m
service/mysql-exporter                       ClusterIP      10.106.183.8     <none>        9104/TCP                                     36m
service/mysql-sidecar                        ClusterIP      10.111.13.233    <none>        3306/TCP,9104/TCP                            13m
service/prometheus-server                    NodePort       10.99.70.216     <none>        9090:30221/TCP                               24h
[root@master-1 ~]#

5.Prometheus config修改获取数据

job名为mysql-sidecar部分,是我添加的。

[root@master-1 ~]# kubectl edit cm prometheus-configuration-8hk4m6bf76 -n ingress-nginx
apiVersion: v1
data:
  prometheus.yaml: |
    global:
      scrape_interval: 10s
    scrape_configs:
    - job_name: 'ingress-nginx-endpoints'
      kubernetes_sd_configs:
      - role: pod
        namespaces:
          names:
          - ingress-nginx
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_container_port_number]
        action: keep
        regex: "10254"

    - job_name: 'mysql'
      static_configs:
      - targets: ['mysql-exporter:9104']

    - job_name: 'mysql-sidecar'
      static_configs:
      - targets: ['mysql-sidecar:9104']

kind: ConfigMap
metadata:
  creationTimestamp: "2022-01-18T05:56:12Z"
  labels:
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: ingress-nginx
  name: prometheus-configuration-8hk4m6bf76
  namespace: ingress-nginx

删除Prometheus pod ,让配置生效
[root@master-1 ~]# kubectl delete pod prometheus-server-779c8d44cf-9m2lp -n ingress-nginx
pod "prometheus-server-779c8d44cf-9m2lp" deleted

查看prometheus 页面 http://192.168.5.21:30221

在这里插入图片描述

在这里插入图片描述

Granfana 导入Mysql 监控图表 http://192.168.5.21:31414/ 用户名: admin 密码: admin
推荐图标ID:https://grafana.com/dashboards/7362

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 如何使用prometheus监控mysql? 使用prometheus监控mysql需要安装一个名为mysqld_exporterexporter,该exporter可以在MySQL实例上运行并公开metrics。你可以在Prometheus配置文件中添加此exporter的配置,并使用PromQL查询语言查询MySQL指标,如查询数据库连接数、查询响应时间、查询缓存使用情况等。 2. 如何使用prometheus监控redis? 使用prometheus监控redis需要安装一个名为redis_exporterexporter,该exporter可以在Redis实例上运行并公开metrics。你可以在Prometheus配置文件中添加此exporter的配置,并使用PromQL查询语言查询Redis指标,如查询内存使用情况、查询命令执行次数、查询客户端连接数等。 3. 如何使用prometheus监控docker? 使用prometheus监控docker需要安装一个名为node_exporterexporter,该exporter可以在docker主机上运行并公开metrics。你可以在Prometheus配置文件中添加此exporter的配置,并使用PromQL查询语言查询docker主机指标,如查询CPU使用情况、查询内存使用情况、查询磁盘空间等。 4. 如何使用prometheus监控k8s集群的过程? 使用prometheus监控k8s集群需要安装一个名为kube-state-metrics的exporter,该exporter可以在k8s集群中运行并公开metrics。你可以在Prometheus配置文件中添加此exporter的配置,并使用PromQL查询语言查询k8s集群指标,如查询pod数量、查询节点状态、查询资源使用情况等。 5. 如何使用prometheus自动发现功能? prometheus自动发现功能可以通过配置文件中的文件SD(file_sd_config)或kubernetes SD(kubernetes_sd_config)进行配置。其中,文件SD允许你从文件中读取目标列表,而kubernetes SD允许你通过API服务器自动发现k8s集群中的目标。你可以在Prometheus配置文件中添加这些配置,并在Prometheus中启用自动发现功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮JasonLong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值