1. 程式人生 > >Prometheus的服務發現之Consul介紹篇一

Prometheus的服務發現之Consul介紹篇一

一、引言

Prometheus是一套開源的系統監控報警框架,此前對Prometheus有過介紹Prometheus的介紹與實踐,Prometheus會去各個監控節點Pull資料。現在存在一個問題,如何讓Prometheus去新增的監控節點Pull資料。

二、Prometheus的服務發現機制

本博主對Prometheus的服務發現機制親自進行驗證的方式有兩種,一種是基於檔案的服務發現;一種是基於Consul的服務發現。

2.1基於檔案的服務發現

基於檔案的服務發現有三步:
1.在一個Json檔案中定義被監控的主機列表資訊;
2.在Prometheus的配置檔案中關聯這個Json檔案,以及對這個檔案的掃描週期;
3.如果有新增的監控節點,將監控節點的主機列表資訊寫入到Json檔案中,Prometheus通過週期掃描就會發現新增的節點。
關於檔案的服務發現的具體配置可以參考

基於檔案的服務發現

2.2 基於Consul的服務發現

基於的Consul服務發現可以分為兩步:
1.在Prometheus的配置中關聯上Consul服務發現。
2.新增的節點向Consul進行註冊,Prometheus便可新增上新增的服務。
關於Prometheus的服務發現的兩種機制的細節本部落格不做深入研究,下面將只會從Consul的安裝、Prometheus的配置,新增服務的註冊和解註冊。

三、Consul服務發現的安裝配置流程

3.1 Consul的安裝

docker pull consul  //用docker拉取最新的映象
docker run --name consul -d -p 8500:8500 consul  //最簡單的docker run命令,將consul映象執行在docker容器中,並將容器埠8500對映到主機埠8500

3.2 在Prometheus的yml配置檔案中關聯Consul
Prometheus的配置參考檔案如下:

- job_name: 'consul-prometheus'
    consul_sd_configs:
    #consul 地址
      - server: 'xx.xx.xx.xx:8500'
        services: []
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*prometheus-target.*
        action: keep

relabel_configs在上述配置中起過濾作用:表示只有consul的service的tag為prometheus-target時才會被動態發現。
3.3 服務註冊到Consul
服務註冊到Consul需要編寫一個Json檔案或者Json資訊,可以參考如下:

{
  "ID": "userServiceId", //服務id
  "Name": "userService", //服務名
  "Tags": [              //服務的tag,自定義,可以根據這個tag來區分同一個服務名的服務
    "primary",
    "v1"
  ],
  "Address": "127.0.0.1",//服務註冊到consul的IP,服務發現,發現的就是這個IP
  "Port": 8000,          //服務註冊consul的PORT,發現的就是這個PORT
  "EnableTagOverride": false,
  "Check": {             //健康檢查部分
    "DeregisterCriticalServiceAfter": "90m",
    "HTTP": "http://www.baidu.com", //指定健康檢查的URL,呼叫後只要返回20X,consul都認為是健康的
    "Interval": "10s"   //健康檢查間隔時間,每隔10s,呼叫一次上面的URL
  }
}

備註:在註冊Consul的過程中,服務ID要求唯一,服務名可以相同,Tag用於對服務的資訊進行標註。
直接使用上述Json進行註冊

curl http://10.240.185.2:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '
{
  "ID": "userServiceId", //服務id
  "Name": "userService", //服務名
  "Tags": [              //服務的tag,自定義,可以根據這個tag來區分同一個服務名的服務
    "primary",
    "v1"
  ],
  "Address": "127.0.0.1",//服務註冊到consul的IP,服務發現,發現的就是這個IP
  "Port": 8000,          //服務註冊consul的PORT,發現的就是這個PORT
  "EnableTagOverride": false,
  "Check": {             //健康檢查部分
    "DeregisterCriticalServiceAfter": "90m",
    "HTTP": "http://www.baidu.com", //指定健康檢查的URL,呼叫後只要返回20X,consul都認為是健康的
    "Interval": "10s"   //健康檢查間隔時間,每隔10s,呼叫一次上面的URL
  }
}'

將上述的資訊儲存成regitor.json檔案後進行註冊:

curl --request PUT --data @regitor.json http://localhost:8500/v1/agent/service/register

3.4 註冊服務的查詢
服務成功註冊到Consul之後可以在Consul檢視到所有註冊的服務,也可以選擇通過命令列進行查詢註冊的服務的結果狀態,參考如下:

curl http://10.240.185.2:8500/v1/catalog/service/userService1  //userService1為查詢的服務名
[
    {
        "ID": "7894fedb-9d68-0aa5-2f81-4dfb36ff575c",
        "Node": "55d85741eea1",
        "Address": "127.0.0.1",
        "Datacenter": "dc1",
        "TaggedAddresses": {
            "lan": "127.0.0.1",
            "wan": "127.0.0.1"
        },
        "NodeMeta": {
            "consul-network-segment": ""
        },
        "ServiceKind": "",
        "ServiceID": "userServiceId1",
        "ServiceName": "userService1",
        "ServiceTags": [
            "primary",
            "v1"
        ],
        "ServiceAddress": "10.240.185.4",
        "ServiceWeights": {
            "Passing": 1,
            "Warning": 1
        },
        "ServiceMeta": {},
        "ServicePort": 9105,
        "ServiceEnableTagOverride": false,
        "ServiceProxyDestination": "",
        "ServiceProxy": {},
        "ServiceConnect": {},
        "CreateIndex": 419,
        "ModifyIndex": 419
    }
]

3.5 服務解註冊
在服務成功註冊Consul之後,如果希望將服務從Consul解綁下來,可以考慮使用Consul的解綁命令,參考如下:

curl --request PUT http://localhost:8500/v1/agent/service/deregister/userService1 //為刪除的服務名

另外Consul提供的其它操作API,可以參考Consul文件中列舉的API介面。

四、參考

1.Consul文件
2.Consul手冊
3.Prometheus 通過consul動態修改Targets接入
4.CentOS7下利用docker搭建prometheus+grafana+consul監控環境