Consul 操作命令汇总 - Prometheus服务注册

发布于:2025-08-31 ⋅ 阅读:(26) ⋅ 点赞:(0)

Consul 提供了两种主要的操作方式:命令行工具(CLI)HTTP API,它们功能相似但适用场景不同。下面详细解析两者的使用方式、核心功能及区别:

一、Consul 命令行工具(CLI)

Consul 命令行工具是与 Consul 交互的主要方式,适合手动操作、脚本自动化等场景。

核心命令分类
  1. 服务与节点管理

    • consul catalog nodes:列出所有节点
    • consul catalog services:列出所有服务
    • consul service register <配置文件>:注册服务(配置文件为 JSON/HCL 格式)
    • consul service deregister <服务ID>:注销服务
  2. KV 存储操作

    • consul kv get <键>:获取键值
    • consul kv put <键> <值>:设置键值
    • consul kv delete <键>:删除键
    • consul kv get -recurse:递归列出所有键值
  3. 健康检查

    • consul health checks <服务名>:查看服务的健康检查
    • consul health service -passing <服务名>:只查看健康的服务实例
  4. 集群管理

    • consul members:查看集群成员
    • consul operator raft list-peers:查看 Raft 集群领导者信息
    • consul join <节点IP>:加入集群
  5. ACL 权限管理

    • consul acl token create:创建 ACL Token
    • consul acl policy create -name <名称> -rules <规则文件>:创建权限策略
命令行使用特点
  • 便捷性:无需手动构造 HTTP 请求,适合终端直接操作。
  • 参数统一:所有命令支持 -token(指定 ACL Token)、-datacenter(指定数据中心)等通用参数。
  • 版本差异:部分命令(如 consul catalog service)在旧版本中可能不存在,需用 consul health service 替代。

二、Consul HTTP API

Consul 所有功能均通过 HTTP API 暴露,适合程序(如 Java、Python 等)与 Consul 集成。默认端口为 8500,基础路径为 http://<consul地址>:8500/v1/

核心 API 分类
  1. 服务与节点 API

    • 列出所有服务:GET /v1/catalog/services
    • 查看特定服务:GET /v1/catalog/service/<服务名>
    • 注册服务:PUT /v1/agent/service/register(请求体为 JSON 配置)
    • 注销服务:PUT /v1/agent/service/deregister/<服务ID>
  2. KV 存储 API

    • 获取键值:GET /v1/kv/<键>
    • 设置键值:PUT /v1/kv/<键>(请求体为值)
    • 删除键:DELETE /v1/kv/<键>
    • 递归列出键:GET /v1/kv/?recurse
  3. 健康检查 API

    • 查看服务健康状态:GET /v1/health/service/<服务名>
    • 只看健康实例:GET /v1/health/service/<服务名>?passing
  4. 集群管理 API

    • 查看集群成员:GET /v1/agent/members
    • 查看 Raft 状态:GET /v1/operator/raft/configuration
API 使用特点
  • 通用性:不受语言限制,任何能发 HTTP 请求的程序都可调用。
  • 灵活性:支持更复杂的查询参数(如过滤、递归等)。
  • 认证方式:通过请求头 X-Consul-Token: <token> 传递 ACL 权限。

三、命令行与 API 的对应关系

功能场景 命令行示例 API 示例
查看服务实例 consul health service kafka GET /v1/health/service/kafka
获取 KV 键值 consul kv get config/db/port GET /v1/kv/config/db/port
注册服务 consul service register service.json PUT /v1/agent/service/register(带JSON体)
查看集群成员 consul members GET /v1/agent/members

四、选择建议

  • 手动操作/脚本:优先用命令行(如 consul kv getconsul catalog services),简单直接。
  • 程序集成:必须用 HTTP API(如 Java 代码通过 HttpClient 调用)。
  • 跨版本兼容:API 兼容性更好(命令行可能随版本增删子命令)。

五、示例:查询 Kafka 服务(带认证)

命令行方式
# 查看 Kafka 服务健康实例(带 ACL Token)
consul health service kafka -token=c5d69a-5f19-469b-0543-eecc66
API 方式
# 用 curl 调用 API(带 Token 头)
curl http://127.0.0.1:8500/v1/health/service/kafka \
  -H "X-Consul-Token: c5d69a-5f19-469b-0543-eecc66"

通过以上两种方式,均可获取 Kafka 服务的实例列表、IP、端口及健康状态等信息。

要在 Consul 中配置 Prometheus 服务发现,需要完成两个核心步骤:在 Consul 中注册服务配置 Prometheus 从 Consul 发现目标。以下是详细操作流程:

一、在 Consul 中注册服务

首先需要将你的业务服务注册到 Consul(可以是 API 服务、数据库等需要被 Prometheus 监控的目标)。注册方式有两种:

1. 通过配置文件注册(推荐)

创建一个服务配置文件(如 prometheus-targets.json.hcl),定义服务信息:

{
  "service": {
    "name": "api-service",  // 服务名称(Prometheus 会根据此名称发现)
    "id": "api-service-1",  // 服务唯一ID(同一服务多个实例需不同)
    "address": "192.168.1.100",  // 服务IP地址
    "port": 8080,  // 服务端口(Prometheus 采集指标的端口)
    "tags": ["metrics-path=/metrics"],  // 可选:指定指标路径(默认/metrics)
    "check": {  // 健康检查(可选,确保服务可用)
      "http": "http://192.168.1.100:8080/health",
      "interval": "10s"
    }
  }
}

通过 Consul 命令注册:

consul services register prometheus-targets.json
2. 通过 API 注册

直接发送 HTTP 请求注册服务:

curl -X PUT http://127.0.0.1:8500/v1/agent/service/register \
  -H "Content-Type: application/json" \
  -d '{
    "Name": "db-service",
    "Address": "192.168.1.101",
    "Port": 9090,
    "Tags": ["metrics-path=/prometheus"]
  }'

二、配置 Prometheus 从 Consul 发现服务

修改 Prometheus 配置文件(prometheus.yml),添加 Consul 服务发现规则:

scrape_configs:
  # 配置一个基于 Consul 的采集任务
  - job_name: 'consul-services'  # 任务名称(自定义)
    
    # 启用 Consul 服务发现
    consul_sd_configs:
      - server: '127.0.0.1:8500'  # Consul 服务器地址(如果有 ACL,需添加 token)
        # 若 Consul 启用 ACL,添加以下配置
        # token: 'your-consul-acl-token'
        services: []  # 空数组表示发现所有服务,也可指定特定服务如 ["api-service"]
    
    # 过滤规则(可选,只采集需要的服务)
    relabel_configs:
      # 1. 只保留标签中包含 "metrics-path" 的服务
      - source_labels: [__meta_consul_service_tag]
        regex: .*metrics-path=.*
        action: keep
      
      # 2. 从服务标签中提取 metrics 路径(如标签 "metrics-path=/custom")
      - source_labels: [__meta_consul_service_tag]
        regex: .*metrics-path=([^;]+)
        target_label: __metrics_path__
        replacement: $1
      
      # 3. 给采集的指标添加服务名称标签
      - source_labels: [__meta_consul_service]
        target_label: service_name

三、核心配置说明

  1. consul_sd_configs:定义 Consul 连接信息

    • server:Consul 代理地址(默认 127.0.0.1:8500
    • services:指定要发现的服务名称(空数组表示所有服务)
    • token:Consul ACL Token(若启用了权限控制)
  2. relabel_configs:数据重标签(处理服务元数据)

    • __meta_consul_service:Consul 服务名称
    • __meta_consul_address:服务IP地址
    • __meta_consul_port:服务端口
    • __meta_consul_service_tag:服务标签(可用于传递指标路径等信息)

四、验证配置

  1. 重启 Prometheus 使配置生效:

    systemctl restart prometheus
    
  2. 访问 Prometheus UI(默认 http://localhost:9090),在 Status → Targets 中查看是否成功发现服务。

五、示例:只发现特定服务

如果只想让 Prometheus 发现 api-servicedb-service,修改配置:

consul_sd_configs:
  - server: '127.0.0.1:8500'
    services: ["api-service", "db-service"]  # 只发现这两个服务

通过以上步骤,Prometheus 会自动从 Consul 同步服务列表,并根据服务的 IP、端口和标签动态调整采集目标,实现服务的自动发现和监控。