Prometheus的数据指标是通过一个公开的 HTTP(S) 数据接口获取到的,我们不需要单独安装监控的 agent,只需要暴露一个 metrics 接口,Prometheus 就会定期去拉取数据
对于一些普通的 HTTP 服务,我们完全可以直接重用这个服务,添加一个/metrics接口暴露给 Prometheus
现在很多服务从一开始就内置了一个/metrics接口,比如 Kubernetes 的各个组件、istio 服务网格都直接提供了数据指标接口。
有一些服务即使没有原生集成该接口,也完全可以使用一些 exporter 来获取到指标数据,比如 mysqld_exporter、node_exporter,这些 exporter 就有点类似于传统监控服务中的 agent,作为服务存在,用来收集目标服务的指标数据然后直接暴露给 Prometheus。
prometheus监控traefik:
Traefik 本身内置了一个/metrics的接口,但是需要我们在参数中配置开启:
在traefik.toml 新增
[metrics]
[metrics.prometheus]
entryPoint = "traefik"
buckets = [0.1, 0.3, 1.2, 5.0]
然后更新 ConfigMap 和 Pod 资源对象即可,Traefik Pod 运行后,我们可以看到我们的服务 IP:
更新configmap:(kubectl replace)
kubectl create configmap traefik-conf --from-file=traefik.toml -o yaml --dry-run |kubectl replace -f -
注意:如果还是出不来,直接删掉之前的configmap 和pod !!
[root@k8s-master traefik]# kubectl get svc -A|grep traefik
kube-system traefik-ingress-service NodePort 10.1.19.60 <none> 80:32724/TCP,8080:30731/TCP 6m44s
然后我们可以使用curl检查是否开启了 Prometheus 指标数据接口,或者通过 NodePort 访问也可以:
[root@k8s-master traefik]# curl 10.1.19.60:8080/metrics
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 1.6692e-05
go_gc_duration_seconds{quantile="0.25"} 5.8474e-05
go_gc_duration_seconds{quantile="0.5"} 7.9383e-05
go_gc_duration_seconds{quantile="0.75"} 0.000160204
go_gc_duration_seconds{quantile="1"} 0.001010786
go_gc_duration_seconds_sum 0.00266626
go_gc_duration_seconds_count 11
从这里可以看到 Traefik 的监控数据接口已经开启成功了,然后我们就可以将这个/metrics接口配置到prometheus.yml中去了,直接加到默认的prometheus这个 job 下面:(prome-cm.yaml)
[root@k8s-master src]# vim prometheus-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: kube-ops
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_timeout: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: "traefik"
static_configs:
- targets: ['traefik-ingress-service.kube-system.svc.cluster.local:8080']
由于我们这里 Traefik 对应的 servicename 是traefik-ingress-service,并且在 kube-system 这个 namespace 下面,所以我们这里的targets的路径配置则需要使用FQDN的形式:traefik-ingress-service.kube-system.svc.cluster.local,当然如果你的 Traefik 和 Prometheus 都部署在同一个命名空间的话,则直接填 servicename:serviceport即可。然后我们重新更新这个 ConfigMap 资源对象:
$ kubectl delete -f prome-cm.yaml
configmap "prometheus-config" deleted
$ kubectl create -f prome-cm.yaml
configmap "prometheus-config" created
现在 Prometheus 的配置文件内容已经更改了,隔一会儿被挂载到 Pod 中的 prometheus.yml 文件也会更新,由于我们之前的 Prometheus 启动参数中添加了–web.enable-lifecycle参数,所以现在我们只需要执行一个 reload 命令即可让配置生效:
[root@k8s-master src]# kubectl get svc -n kube-ops
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus NodePort 10.1.192.190 <none> 9090:30672/TCP 208d
[root@k8s-master src]# curl -X POST "http://10.1.192.190:9090/-/reload"
由于 ConfigMap 通过 Volume 的形式挂载到 Pod 中去的热更新需要一定的间隔时间才会生效,所以需要稍微等一小会儿。
reload 这个 url 是一个 POST 请求,所以这里我们通过 service 的 CLUSTER-IP:PORT 就可以访问到这个重载的接口,这个时候我们再去看 Prometheus 的 Dashboard 中查看采集的目标数据: