Kube-prometheus添加自定义监控项

一、缘由

本文档题目也可叫做,kube-prometheus添加target

公司有个canal项目想接入prometheus进行监控告警,从canal官档介绍看到只需配置prometheus.yaml添加canal的job后重启服务,即可将canal接入prometheus监控。

官档介绍的是非容器部署的prometheus,鉴于我司有k8s环境,我就想将canal接入k8s集群的prometheus监控。

二、部署步骤(自建K8S的Prometheus)

1、Exporter介绍

一般来讲向Prometheus提供监控样本数据的程序都可以被称为一个Exporter,Exporter的一个实例称为Target。Prometheus通过轮询的方式定时从这些Target中获取监控数据样本,并且存储在数据库当中。

LdOyEF.png

1.1 Exporter按来源分类

  • 社区提供的:比如Node Exporter、MySQL Exporter、Nginx Exporter等

    范围 常用Exporter
    数据库 MySQL Exporter, Redis Exporter, MongoDB Exporter, MSSQL Exporter等
    硬件 Apcupsd Exporter,IoT Edison Exporter, IPMI Exporter, Node Exporter等
    消息队列 Beanstalkd Exporter, Kafka Exporter, NSQ Exporter, RabbitMQ Exporter等
    存储 Ceph Exporter, Gluster Exporter, HDFS Exporter, ScaleIO Exporter等
    HTTP服务 Apache Exporter, HAProxy Exporter, Nginx Exporter等
    API服务 AWS ECS Exporter, Docker Cloud Exporter, Docker Hub Exporter, GitHub Exporter等
    日志 Fluentd Exporter, Grok Exporter等
    监控系统 Collectd Exporter, Graphite Exporter, InfluxDB Exporter, Nagios Exporter, SNMP Exporter等
    其它 Blockbox Exporter, JIRA Exporter, Jenkins Exporter, Confluence Exporter等
  • 用户自定义的:用户还可以基于Prometheus提供的Client Library创建自己的Exporter程序。目前Promthues社区官方提供了对以下编程语言的支持:Go、Java/Scala、Python、Ruby。同时还有第三方实现的如:Bash、C++、Common Lisp、Erlang,、Haskeel、Lua、Node.js、PHP、Rust等。

1.2 Exporter按运行方式分类

  • 独立使用的

    以我们已经使用过的Node Exporter为例,由于操作系统本身并不直接支持Prometheus,同时用户也无法通过直接从操作系统层面上提供对Prometheus的支持。因此,用户只能通过独立运行一个程序的方式,通过操作系统提供的相关接口,将系统的运行状态数据转换为可供Prometheus读取的监控数据。 除了Node Exporter以外,比如MySQL Exporter、Redis Exporter等都是通过这种方式实现的。 这些Exporter程序扮演了一个中间代理人的角色。

  • 集成到应用中的

    为了能够更好的监控系统的内部运行状态,有些开源项目如Kubernetes,ETCD等直接在代码中使用了Prometheus的Client Library,提供了对Prometheus的直接支持。这种方式打破的监控的界限,让应用程序可以直接将内部的运行状态暴露给Prometheus,适合于一些需要更多自定义监控指标需求的项目。

     **我要纳入监控的cannal项目,就属于集成到应用中的,直接访问http://ip:port即可拿到监控数据,不要部署代理Exporter程序。**
    

2、部署Prometheus

2.1 下载

git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus

2.2 部署

# Create the namespace and CRDs, and then wait for them to be available before creating the remaining resources
kubectl apply --server-side -f manifests/setup
until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
kubectl apply -f manifests/

部署成功后,结果如下(如果部署失败,可手动想办法更换镜像地址):

root@k8s-master001:~# kubectl get pods -n monitoring
NAME                                  READY   STATUS    RESTARTS   AGE
alertmanager-main-0                   2/2     Running   0          3d1h
alertmanager-main-1                   2/2     Running   0          3d1h
alertmanager-main-2                   2/2     Running   0          3d1h
blackbox-exporter-5cb5d7479d-cqxrd    3/3     Running   0          3d1h
grafana-789bc4b4b8-wjk4j              1/1     Running   0          3d1h
kube-state-metrics-79f478884f-w6mqw   3/3     Running   0          3d1h
node-exporter-cl42r                   2/2     Running   0          3d1h
node-exporter-f8n6n                   2/2     Running   0          3d1h
node-exporter-m4xqr                   2/2     Running   0          3d1h
prometheus-adapter-7bf7ff5b67-gph5t   1/1     Running   0          3d1h
prometheus-adapter-7bf7ff5b67-pppq2   1/1     Running   0          3d1h
prometheus-k8s-0                      2/2     Running   0          3d1h
prometheus-k8s-1                      2/2     Running   0          3d1h
prometheus-operator-b998f8597-k75bm   2/2     Running   0          3d1h

将Prometheus映射出去,可以在局域网(公网)访问:

#!/bin/bash
nohup kubectl --namespace monitoring port-forward --address 0.0.0.0 svc/prometheus-k8s 9090:9090 &

之后可以通过 http://内网IP:9090 访问Prometheus的dashboard。

2.3 删除(根据需求)

kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup

3、添加target并应用到集群

3.1 增加target

编写需要增加的target添加到prometheus-additional.yaml 文件里面,不存在就新建。

cat >> ./kube-prometheus/manifests/prometheus-additional.yaml  << EOF
- job_name: 'canal'
  scrape_interval: 15s
  scrape_timeout: 15s
  static_configs:
  - targets: ['10.31.4.225:11112']
EOF

注释:根据实际情况,修改job_name和targets变量即可。

3.2 创建新的secret并应用到prometheus

cd ./kube-prometheus/manifests/
# 创建secret
kubectl create secret generic additional-scrape-configs -n monitoring --from-file=prometheus-additional.yaml --dry-run=client -o yaml > additional-scrape-configs.yaml
# 应用到prometheus
kubectl apply -f additional-scrape-configs.yaml -n monitoring

3.3 将target应用到集群

这一步类似于修改正常部署模式下的prometheus.yaml配置文件。

vim kube-prometheus/manifests/prometheus-prometheus.yaml
  additionalScrapeConfigs:
    name: additional-configs
    key: prometheus-additional.yaml

具体添加位置如下:

L0NIDe.png

应用变更到K8S生效:

kubectl apply -f kube-prometheus/manifests/prometheus-prometheus.yaml -n monitoring

4、验证

稍等片刻,查看prometheus的target列表即可,或者prometheus–> Status–>Configuration 中可以搜到job_name为canal的配置信息。

L0Urxf.png

同时,我们上一步添加的Secret可以通过K8s集群查看到。

以上的修改和添加,在Prometheus Operator项目的example/additional-scrape-configs中有一样的例子可供参考。

三、部署步骤(阿里云Prometheus)

1、部署

需要监控部署在K8s集群之外的业务数据,如Redis连接数。操作步骤如下:

  1. 在阿里云Prometheus监控服务控制台页面,选择相应地区的Prometheus实例。

  2. 在设置页面,单击Prometheus设置页签。

  3. 在Prometheus.yaml中输入以下内容,然后单击保存。

    global:
      scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
      evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
    scrape_configs:
      - job_name: 'canal'
        static_configs:
        - targets: ['10.31.4.225:11112']
    

2、验证

在阿里云Prometheus监控服务页面,选择某个地区对应的实例后,选择客户端接入后,即可看到我们自定义接入的target。

L0wFPA.png

四、持久化数据存储

4.1 根据需要调整持久化存储策略

  • grafana和prometheus的数据都需要做持久存储。

  • grafana持久持久存储是因为可能安装些第三方的插件。

  • prometheus的持久存储,自不必多说,那是肯定需要的。

我们部署在云上,持久化存储这块,可以很方便的使用他们提供的服务(NFS、OSS、aliyun-disk都可以)

五、参考


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com

×

喜欢就点赞,疼爱就打赏