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。
评论