Consul 安装配置

详见使用 Helm 部署 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 中。

Prometheus Operator 通过 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 中查看配置是否生效:

Prometheus Operator 通过 consul 实现自动服务发现

现在我们往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这个监控任务了:

Prometheus Operator 通过 consul 实现自动服务发现

如果我们切换到 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 标签进行过滤,会移除不匹配过滤条件的所有标签

对接Grafana

Prometheus Operator 通过 consul 实现自动服务发现

参考文档

Prometheus 通过 consul 实现自动服务发现

Prometheus Operator 自动发现