Consul

Consul 服务发现与数据一致性 Consul 提供服务注册、健康检查、DNS/HTTP 发现、KV 和服务网格能力。Server 使用 Raft 维护集群状态,Client Agent 接收本机服务注册并参加 gossip;Client 数量不能代替 Server quorum。 生产通常部署

Consul

服务发现与数据一致性

Consul 提供服务注册、健康检查、DNS/HTTP 发现、KV 和服务网格能力。Server 使用 Raft 维护集群状态,Client Agent 接收本机服务注册并参加 gossip;Client 数量不能代替 Server quorum。

生产通常部署 3 或 5 个 Server。3 个 Server 可容忍 1 个故障,5 个可容忍 2 个。Leader 切换需要多数派可用,跨高延迟区域部署投票成员会影响写入延迟。KV 适合小型配置,不作为通用数据库或 Secret 保管系统。

单节点容器实验

docker volume create consul-data
docker run -d --name consul \
  -p 127.0.0.1:8500:8500 \
  -v consul-data:/consul/data \
  hashicorp/consul:1.20.6 agent \
  -server -bootstrap-expect=1 -ui \
  -client=0.0.0.0 -data-dir=/consul/data
docker exec consul consul members
docker exec consul consul operator raft list-peers
curl -fsS http://127.0.0.1:8500/v1/status/leader

此例绑定宿主机回环地址,只有一个 Server,未配置 ACL/TLS,适合本机学习。镜像标签用于复现实验,生产选择经过审核且受支持的补丁版本。8500 为 HTTP API/UI;DNS 常用 8600,Server RPC 为 8300,LAN gossip 为 8301 TCP/UDP,跨数据中心还有额外端口要求。

三 Server 配置

每台机器安装同一版本并使用独立数据目录。以下为第一台 /etc/consul.d/server.hcl,另两台分别调整名称及本机地址:

datacenter = "dc1"
node_name = "consul-1"
data_dir = "/data/consul"
server = true
bootstrap_expect = 3
bind_addr = "10.0.0.11"
advertise_addr = "10.0.0.11"
client_addr = "127.0.0.1 10.0.0.11"
retry_join = ["10.0.0.11", "10.0.0.12", "10.0.0.13"]
ui_config {
  enabled = true
}
acl {
  enabled = true
  default_policy = "deny"
  enable_token_persistence = true
}
sudo install -d -o consul -g consul -m 0700 /data/consul
consul validate /etc/consul.d
sudo -u consul consul agent -config-dir=/etc/consul.d

创建系统服务时以 consul 专用用户运行上述命令,设置自动重启和数据目录权限。不要使用单节点 -bootstrap 形成生产集群。ACL 开启后需按官方引导流程初始化一次,并给每个 Agent 配置自己的最小权限 Token;未授权的命令返回 403 属于预期。

上述 HCL 是集群基础配置;在业务接入前,还需为 gossip 配置一致的加密密钥,并启用下节的 TLS。先验证 ACL/TLS 再允许非本机访问。

服务注册与健康检查

使用本机 Agent 注册服务,10.0.0.21:9100 是实际可达的 node_exporter 地址。保存为 node-exporter.json:

{
  "ID": "node-exporter-21",
  "Name": "node-exporter",
  "Address": "10.0.0.21",
  "Port": 9100,
  "Tags": ["prometheus"],
  "Check": {
    "HTTP": "http://10.0.0.21:9100/metrics",
    "Interval": "30s",
    "Timeout": "5s"
  }
}

单节点实验可直接执行;开启 ACL/TLS 后配置 CONSUL_HTTP_TOKEN、CONSUL_HTTP_ADDR、CA 和客户端证书,再执行等效 CLI 请求,不要将真实 Token 写入历史或文档:

curl -fsS -X PUT --data-binary @node-exporter.json \
  http://127.0.0.1:8500/v1/agent/service/register
curl -fsS 'http://127.0.0.1:8500/v1/health/service/node-exporter?passing=true'
curl -fsS -X PUT \
  http://127.0.0.1:8500/v1/agent/service/deregister/node-exporter-21

注册、查询和注销需要相应权限。服务名用于逻辑分组,ID 在 Agent 上标识实例;向错误 Agent 注销不会删除另一个 Agent 管理的实例。健康检查由负责该服务的 Agent 发起,必须验证该 Agent 到目标的网络路径。持久服务宜通过 Agent 配置文件声明,再 consul validate 和 consul reload。

Prometheus 服务发现

为 Prometheus 创建只读服务与节点发现权限,Token 放在只允许运行用户读取的文件中。以下针对已启用 HTTPS 的 Consul:

scrape_configs:
  - job_name: consul-node-exporter
    consul_sd_configs:
      - server: consul.example.com:8501
        scheme: https
        services: [node-exporter]
        token_file: /etc/prometheus/secrets/consul-token
        tls_config:
          ca_file: /etc/prometheus/certs/consul-ca.pem
    relabel_configs:
      - source_labels: [__meta_consul_health]
        regex: passing
        action: keep
      - source_labels: [__meta_consul_service]
        target_label: service
      - source_labels: [__meta_consul_node]
        target_label: node

Consul 服务发现与 exporter 抓取是两条链路。对 Consul 的 TLS/Token 配置不会自动保护 node_exporter 的 /metrics;exporter 若启用 TLS/认证,还要在 job 层配置对应参数。

promtool check config /etc/prometheus/prometheus.yml

对照 Prometheus Service Discovery、Targets 和实际指标确认,避免只看 Consul UI。配置文件发现可作为替代,JSON 必须是目标列表:

[
  {"targets": ["10.0.0.21:9100"], "labels": {"node": "node-21"}}
]
scrape_configs:
  - job_name: file-node-exporter
    file_sd_configs:
      - files: ["/etc/prometheus/file_sd/*.json"]

ACL、TLS 与备份

  • ACL 默认 deny,按 Agent、服务注册、发现和运维分别发放策略;引导管理 Token 离线保存,不能用于日常采集。
  • Gossip 加密保护成员通信,TLS 保护 RPC/API,两者不能互相替代。配置 CA、节点证书、服务端名称校验和证书轮换,启用 HTTPS 后关闭不需要的明文 HTTP 监听。
  • DNS 发现与 HTTP API 的访问控制方式不同,按实际网络边界限制 DNS 查询与 API 来源。
  • 只允许管理网访问 UI/API;限制服务检查定义权限,避免开放任意脚本检查给普通注册用户。

使用有 snapshot 权限的凭据执行:

umask 077
consul snapshot save /backup/consul.snap
consul snapshot inspect /backup/consul.snap

快照包含敏感状态,保存到独立故障域并加密。consul snapshot restore 会覆盖集群状态,先在隔离环境验证,再按灾难恢复流程操作。Agent 的本地配置、证书和启动参数也要单独备份。

排障与监控

现象 检查方向
members 正常但无 Leader operator raft list-peers、Server 数量、8300 连通性、磁盘和 quorum
服务注册成功但发现不到 目标 Agent、datacenter、ACL、服务名和健康状态过滤
UI 有节点但 Prometheus 无 target 发现 Token 权限、服务名、TLS、relabel 与 Agent 返回地址
健康检查失败 Agent 到服务的网络、检查 URL、超时、认证和证书
403 / permission denied Token 过期或策略不足,避免直接换成管理 Token

监控 Leader、Raft commit 延迟、磁盘、gossip 健康、服务数量和检查失败比例。升级先读目标版本说明,逐 Server 操作并保持 quorum,随后升级 Client Agent。

评论