一、缘由
本文档题目也可叫做,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中获取监控数据样本,并且存储在数据库当中。
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
具体添加位置如下:
应用变更到K8S生效:
kubectl apply -f kube-prometheus/manifests/prometheus-prometheus.yaml -n monitoring
4、验证
稍等片刻,查看prometheus的target列表即可,或者prometheus–> Status–>Configuration 中可以搜到job_name为canal的配置信息。
同时,我们上一步添加的Secret可以通过K8s集群查看到。
以上的修改和添加,在Prometheus Operator项目的example/additional-scrape-configs中有一样的例子可供参考。
三、部署步骤(阿里云Prometheus)
1、部署
需要监控部署在K8s集群之外的业务数据,如Redis连接数。操作步骤如下:
- 在阿里云Prometheus监控服务控制台页面,选择相应地区的Prometheus实例。 
- 在设置页面,单击Prometheus设置页签。 
- 在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。
四、持久化数据存储
4.1 根据需要调整持久化存储策略
- grafana和prometheus的数据都需要做持久存储。 
- grafana持久持久存储是因为可能安装些第三方的插件。 
- prometheus的持久存储,自不必多说,那是肯定需要的。 
我们部署在云上,持久化存储这块,可以很方便的使用他们提供的服务(NFS、OSS、aliyun-disk都可以)
五、参考
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com




 
            