Consul 安装配置
部署 node exporter
在linux主机上部署 node-exporter 服务信息,服务地址及端口为 node-exporter 默认提供指标数据的地址,执行deploy-agent.sh
脚本:
#!/bin/bash
docker run -d -p 9100:9100 --name node-exporter \
--restart="always" \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
prom/node-exporter \
--path.procfs=/host/proc \
--path.rootfs=/rootfs \
--path.sysfs=/host/sys \
--collector.filesystem.ignored-mount-points='^/(sys|proc|dev|host|etc)($$|/)'
sh deploy-agent.sh
# 查看服务
docker ps |grep node
API 注册服务到 Consul
接下来,我们要注册服务到 Consul 中,可以通过其提供的 API 标准接口来添加。那么先注册一个上面主机 node-exporter 服务信息,执行如下命令:
curl -X PUT -d '{"id": "node-exporter","name": "nfs-server","address": "10.x.x.x","port": 9100,"tags": ["devops"],"checks": [{"http": "http://10.x.x.x:9100/metrics", "interval": "5s"}]}' http://consul.devops-ci.transsion.com/v1/agent/service/register
执行完毕后,刷新一下 Consul Web 控制台页面,可以看到成功注册到 Consul 中。
提一下,如果要注销掉某个服务,可以通过如下 API 命令操作,例如注销上边添加的 node-exporter 实例/instance:
curl -X PUT http://consul.test.com/v1/agent/service/deregister/node-exporter
说明:当 Consul 的一个 service 如上例中nfs-server
下的所有instance
都删除完后,那么这个server也会自动被删除。
更多 Consul API 详见Consul官网
配置 Prometheus 实现自动服务发现
现在Consul
服务已经启动完毕,并成功注册了一个服务,接下来,我们需要配置Prometheus
来使用Consul
自动服务发现,目的就是能够将上边添加的服务自动发现到 Prometheus 的Targets
中,更新prometheus-additional.yaml
配置文件,增加如下内容:
...
- job_name: 'consul-endpoints'
consul_sd_configs:
- server: 'consul-server.middle.svc.cluster.local:8500' # 跨命名空间访问
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*devops-ci.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- action: replace
source_labels: [__address__]
regex: (.*):(.*)
replacement: $1
target_label: instance
然后更新 Secret 对象和热更新prometheus:
# 删除secret
kubectl delete secrets additional-configs -n monitoring
# 创建secret
kubectl create secret generic additional-configs --from-file=prometheus-additional.yaml -n monitoring
# 获取一个prometheus pod的ip
kubectl get pod -n monitoring -o wide |grep prometheus-k8s
# 热更新prometheus
curl -X POST http://{prometheus-pod-ip}:9090/-/reload
隔一小会儿,可以前往 Prometheus 的 Dashboard 中查看配置是否生效:
现在我们往consul put一条信息:
cat > consul-0.json << EOF
{
"ID": "test-01",
"Name": "consul-prometheus",
"Tags": [
"devops-ci"
],
"Address": "10.x.x.x",
"Port": 9100,
"Meta": {
"app": "consul",
"team": "ci",
"project": "devops"
},
"EnableTagOverride": false,
"Check": {
"HTTP": "http://10.x.x.x:9100/metrics",
"Interval": "10s"
},
"Weights": {
"Passing": 10,
"Warning": 1
}
}
EOF
上面 json 文件简单说明下:
"ID": "test-01", # instance名字
"Name": "consul-prometheus", # service名字
"Tags": [
"devops-ci" # consul自动发现标签
],
"Address": "10.x.x.x", # instance地址
"Port": 9100, # node exporter监听端口
"Meta": { # 自定义标签
"app": "consul",
"team": "ci",
"project": "devops"
},
往 Consul 里注册以上信息:
curl --request PUT --data @consul-0.json http://consul.test.com/v1/agent/service/register?replace-existing-checks=1
正常就可以看到 targets 页面下面有consul-endpoints
这个监控任务了:
如果我们切换到 targets 页面下面却并没有发现对应的监控任务,查看 Prometheus 的 Pod 日志:
kubectl logs -f prometheus-k8s-0 prometheus -n monitoring
relabel_configs 简单说明
详细relabel_configs
配置及说明可以参考relabel_config 官网说明,这里我简单列举一下里面每个relabel_action
的作用:
relabel_action | 作用 |
---|---|
replace | 根据 regex 的配置匹配 source_labels 标签的值(注意:多个 source_label 的值会按照 separator 进行拼接),并且将匹配到的值写入到 target_label 当中,如果有多个匹配组,则可以使用 {2} 确定写入的内容。如果没匹配到任何内容则不对 target_label 进行重新, 默认为 replace |
keep | 丢弃 source_labels 的值中没有匹配到 regex 正则表达式内容的 Target 实例 |
drop | 丢弃 source_labels 的值中匹配到 regex 正则表达式内容的 Target 实例 |
hashmod | 将 target_label 设置为关联的 source_label 的哈希模块 |
labelmap | 根据 regex 去匹配 Target 实例所有标签的名称(注意是名称),并且将捕获到的内容作为为新的标签名称,regex 匹配到标签的的值作为新标签的值 |
labeldrop | 对 Target 标签进行过滤,会移除匹配过滤条件的所有标签 |
labelkeep | 对 Target 标签进行过滤,会移除不匹配过滤条件的所有标签 |