在Kubernetes环境中,从MySQL Exporter获取指标数据

首先

在Prometheus官方网站上,有许多Exporter可供选择,其中包括MySQL用的Exporter。本文将记录在Kubernetes环境(也就是ICP:IBM Cloud Private环境)中部署MySQL Exporter并获取指标的案例。虽然有关在Docker容器中或操作系统上部署Exporter的案例,但是在k8s环境中实现(比较明确的案例)尚未有所涉及,因此将详细介绍该实现方法。

构成图

MySQLExporterConfig.png

※ Prometheus直接访问的不是MySQL的Pod,而是Exporter的Pod。(起初误解了…)

组成

普罗米修斯:v2.3.1(使用IBM的图表:链接)
MySQL:使用最新的Docker镜像
ICP:v2.1.0.3

建立设置

请创建以下清单文件。
由于我们正在使用ICP环境,因此Docker镜像是使用ICP的私有注册表存储的(请根据需要进行适当调整)。

本次的MySQL部署,我们没有进行任何特殊的配置,只是为了验证Prometheus的Exporter。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mycluster.icp:8500/default/mysql:latest
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: root-password
        ports:
        - containerPort: 3306
          name: mysql

・MySQL的secret(密码:password)

apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
  namespace: default
type: Opaque
data:
  root-password: cGFzc3dvcmQ=

・适用于MySQL的服务

apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: default
spec:
  ports:
  - port: 3306
  selector:
    app: mysql

如果在MySQL Exporter的部署中添加以下两行注解和连接信息,Prometheus将通过scrape处理自动获取指标。
prometheus.io/scrape: “true”
prometheus.io/port: “9104”

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mysqld-exporter
spec:
  selector:
    matchLabels:
      app: mysqld-exporter
  replicas: 1
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9104"
      labels:
        app: mysqld-exporter
    spec:
      containers:
      - name: mysqld-exporter
        image: mycluster.icp:8500/default/prom/mysqld-exporter:latest
        env:
        - name: DATA_SOURCE_NAME
          valueFrom:
            secretKeyRef:
              name: mysql-ex-secret
              key: password
        ports:
        - containerPort: 9104

・为MySQL Exporter创建的秘钥(包括密码为password和端口号)。

apiVersion: v1
kind: Secret
metadata:
  name: mysql-ex-secret
  namespace: default
type: Opaque
data:
  password: cm9vdDpwYXNzd29yZEAobXlzcWw6MzMwNikv
# echo "cm9vdDpwYXNzd29yZEAobXlzcWw6MzMwNikv" | base64 -d
root:password@(mysql:3306)/

在进行编码时,请使用以下命令将”root:password@(mysql:3306)/”转换为base64:# echo -n “root:password@(mysql:3306)/” | base64。请确保不要忘记-n选项,否则会加入换行符。

只要完成剩下的部分,就可以了。

# kubectl create -f mysql-secret.yaml
# kubectl create -f mysql-deploymant.yaml
# kubectl create -f mysql-service.yaml
# kubectl create -f mysql-ex-secret.yaml
# kubectl create -f mysql-ex-deployment_a.yaml

确认制成的结果。

# kubectl get pod
NAME                                 READY     STATUS    RESTARTS   AGE
mysql-7cc9b5d75d-4qgtg               1/1       Running   0          10d
mysqld-exporter-7d875c99c0-p8rsx     1/1       Running   0          10d
#
# kubectl get svc
NAME           TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)           AGE
mysql          ClusterIP   10.0.0.6     <none>        3306/TCP          10d
#
# kubectl get secret
NAME                  TYPE                                  DATA      AGE
mysql-ex-secret       Opaque                                1         10d
mysql-secret          Opaque                                1         10d

好的。

在普罗米修斯中会显现如何?

首先是CLI。

出口商的IP确认。→ IP:10.1.123.176

# kubectl describe po mysqld-exporter-7d875c99c0-p8rsx
Name:           mysqld-exporter-7d875c99c0-p8rsx
Namespace:      default
(中略)
IP:             10.1.123.176
(後略)

使用Curl访问并确认是否获取到了名为mysql的度量数据。

# curl http://10.1.123.176:9104/metrics
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
(中略)
 HELP mysql_exporter_collector_duration_seconds Collector time duration.
# TYPE mysql_exporter_collector_duration_seconds gauge
mysql_exporter_collector_duration_seconds{collector="collect.global_status"} 0.004177075
mysql_exporter_collector_duration_seconds{collector="collect.global_variables"} 0.010698232
mysql_exporter_collector_duration_seconds{collector="collect.info_schema.tables"} 0.043587385
mysql_exporter_collector_duration_seconds{collector="collect.slave_status"} 0.04456449
mysql_exporter_collector_duration_seconds{collector="connection"} 0.001885118
# HELP mysql_exporter_last_scrape_error Whether the last scrape of metrics from MySQL resulted in an error (1 for error, 0 for success).
(後略)

顺利达成!

(参考)所获得的指标有2379行。

# curl http://10.1.123.176:9104/metrics | wc -l
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  177k  100  177k    0     0  3238k      0 --:--:-- --:--:-- --:--:-- 3220k
2379

即使是GUI,是的,可以获取!

MySQLExporterGetMetrics.png

总结

我对于Exporter的部署yaml文件的编写方式感到不清楚,但是只需在注释中填写必要的项以及在Env中记录MySQL的连接信息即可。

参考

Kubernetes引擎示例
导出器和集成
mysqld导出器

bannerAds