consul服务发现

1,013 阅读5分钟
  • 基于go语言开发, 轻量级, 用于实现分布式系统的服务发现与配置
  • consul内置有KV存储, 服务注册/发现, 健康检查, HTTP+DNS API, Web UI等多种功能

consul:192.168.113.174
nginx:192.168.113.174
反向代理服务器:
192.168.113.175:8080
192.168.113.176:8080

1、consul 与consul-template安装: 安装非常容易,到官方www.consul.io/downloads.h…下载相关包,解压之后放到/usr/local/bin/ 目录下即可。

wget https://releases.hashicorp.com/consul-template/0.23.0/consul-template_0.23.0_linux_amd64.zip
cp consul-template /usr/local/bin

服务器准备

192.168.113.174       server
192.168.113.175       agent
192.168.113.176       agent
192.168.113.177       agent

2、启动consul server master:

[root@master src]# consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul  -bind 0.0.0.0 -client 0.0.0.0 -ui &
参数说明:
-server:集群启动为service
-bootstrap-expect:期待加入service节点的数量
-data-dir:数据目录
-node:节点名称,集群中每个节点名称需唯一
-bind:指定一个consul运行时的监听地址
-ui:启动时启动ui
  • 然后我们打开一下web:192.168.113.174:8500界面,即可看到相关的服务注册信息:

slave

[root@slave confd_data]# consul agent -data-dir /tmp/consul -node=web1 -bind=192.168.113.175 -config-dir=/confd_data/ &

[root@slave confd_data]# ls
server.json
[root@slave confd_data]# cat server.json 
{
  "service": {
    "name": "web",
    "tags": ["dev"],
    "address": "192.168.113.175",
    "port": 80,
    "checks": [
      {
        "http": "http://192.168.113.175/health/",
        "interval": "10s"
      }
    ]
  }
}

服务注册
[root@slave ~]# consul join 192.168.113.174
Successfully joined cluster by contacting 1 nodes.

♥用docker-consul服务注册

docker pull consul
docker run --restart=always --name consul -d -p 8500:8500 consul

#服务注册:
- 把注册服务的id,name,address,port,tags,check_url发送给consul的接口。
- check_url为consul要去访问服务的接口,从这个接口可以拿到服务数据。
- interval设置定时访问时间间隔。
root@home:/opt/consul# curl -X PUT -d '{"id": "node-exporter","name": "node-exporter-192.168.191.128","address": "192.168.191.128","port": 9100,"tags": ["linux"],"checks": [{"http": "http://192.168.191.128:9100/metrics", "interval": "5s"}]}' http://192.168.191.128:8500/v1/agent/service/register 
root@home:/opt/consul# curl -X PUT -d '{"id": "docker-exporter","name": "docker-exporter-192.168.191.128","address": "192.168.191.128","port": 8080,"tags": ["devops"],"checks": [{"http": "http://192.168.191.128:8080/metrics", "interval": "5s"}]}' http://192.168.191.128:8500/v1/agent/service/register

#服务注销:
- 直接访问访问地址+deregister+注册的服务id
curl -X PUT http://10.10.2.99:8500/v1/agent/service/deregister/node-exporter 

配置prometheus自动发现

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'consul'
    consul_sd_configs:
      - server: '10.10.2.99:8500'

遇到的问题:

1、会发现 Prometheus 同时加载出来了默认服务 consul,这个是不需要的。

2、如果需要自定义一些标签,例如 team、group、project 等关键分组信息,方便后边 alertmanager 进行告警规则匹配,该如何处理呢?

3、所有 Consul 中注册的 Service 都会默认加载到 Prometheus 下配置的 consul_prometheus 组,如果有多种类型的 exporter,如何在 Prometheus 中配置分配给指定类型的组,方便直观的区别它们?

relabeling

  • 在Prometheus所有的Target实例中,都包含一些默认的Metadata标签信息。可以通过Prometheus UI的Targets页面中查看这些实例的Metadata标签的内容,在第一讲的时候我们也讲过标签的替换
__address__:当前Target实例的访问地址<host>:<port>
__scheme__:采集目标服务访问地址的HTTP SchemeHTTP或者HTTPS
__metrics_path__:采集目标服务访问地址的访问路径
__param_<name>:采集任务目标服务的中包含的请求参数
  • Relabeling最基本的应用场景就是基于Target实例中包含的metadata标签,动态的添加或者覆盖标签。例如,通过Consul动态发现的服务实例还会包含以下Metadata标签信息:
__meta_consul_address:consul地址
__meta_consul_dc:consul中服务所在的数据中心
__meta_consulmetadata:服务的metadata
__meta_consul_node:服务所在consul节点的信息
__meta_consul_service_address:服务访问地址
__meta_consul_service_id:服务ID
__meta_consul_service_port:服务端口
__meta_consul_service:服务名称
__meta_consul_tags:服务包含的标签信息
  • Relabeling 应用与解决问题
action
replace: 根据 regex 的配置匹配 source_labels 标签的值
         (注意:多个 source_label 的值会按照 separator 进行拼接),
并且将匹配到的值写入到 target_label 当中,如果有多个匹配组,则可以使用 ${1}, ${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 标签进行过滤,会移除不匹配过滤条件的所有标签

问题1:过滤不用的标签(consul自带的)

修改Prometheus配置文件:

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'consul'
    consul_sd_configs:
      - server: '10.10.2.99:8500'
    relabel_configs:
    - source_labels: [__meta_consul_tags]
      regex: (.*linux.*|.*devops.*)
      action: keep   ##对没有匹配到的表达式进行抛弃

测试访问:http://192.168.191.128:9090/service-discovery

  • 我们可以配置 relabel_configs 来实现标签过滤,只加载符合规则的服务。以上边为例,可以通过过滤 __meta_consul_tags 标签为 linux,devops 的服务,relabel_config 向 Consul 注册服务的时候,只加载匹配 regex 表达式的标签的服务到自己的配置文件。

问题2:consul注册自定义标签

  • 要实现给服务添加自定义标签,我们还得做一下修改,就是在注册服务时,将自定义标签信息添加到 Meta Data 数据中,具体可以参考这里(Consul Service - Agent HTTP API) 官网说明,下边来演示一下如何操作。
#修改prometheus的consul配置
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'consul'
    consul_sd_configs:
      - server: '192.168.191.128:8500'
    relabel_configs:
    - source_labels: [__meta_consul_tags]
      regex: (.*linux.*|.*devops.*)
      action: keep 
    - regex: __meta_consul_service_metadata_(.+)   #添加meta的重新匹配
      action: labelmap   #

curl -X PUT -d '{"id": "node-exporter","name": "node-exporter-192.168.191.128","address": "192.168.191.128","port": 9100,"tags": ["linux"],"Meta":{"app":"linux"},"checks": [{"http": "http://192.168.191.128:9100/metrics", "interval": "5s"}]}' http://192.168.191.128:8500/v1/agent/service/register

1、curl将app:linux标签注册到了consul 2、consul生成内置标签__meta_consul_service_metadata_app 3、prometheus的regex匹配从consul获取到的标签 4、使用action动作将生成新标签app:linux

    - regex: __meta_consul_service_metadata_(.+)   #添加meta的重新匹配
      action: labelmap   #

问题3:在服务发现前提下如何把这些服务区分出来

  • 这个需求是,我们直接通过标签匹配的方式把服务区分出来,下面我直接修改配置文件,通过tag来区分。

  • 写了2个consul_sd_configs;并且consul_sd_config用了不同job_name区分

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'node-exporter'
    consul_sd_configs:
      - server: '192.168.191.128:8500'
    relabel_configs:
    - source_labels: [__meta_consul_tags]
      regex: .*linux.*
      action: keep 
    - regex: __meta_consul_service_metadata_(.+)
      action: labelmap
  - job_name: 'docker-exporter'
    consul_sd_configs:
      - server: '192.168.191.128:8500'
    relabel_configs:
    - source_labels: [__meta_consul_tags]
      regex: .*devops.*
      action: keep
    - regex: __meta_consul_service_metadata_(.+)
      action: labelmap

参考博客

Consul + Nginx实现自动扩容平台