4.0 KiB
4.0 KiB
Consul 服务注册解决方案
问题背景
在跨太平洋的 Nomad + Consul 集群中,遇到以下问题:
- RFC1918 地址问题 - Nomad 自动注册使用私有 IP,跨网络无法访问
- Consul Leader 轮换 - 服务只注册到单个节点,leader 变更时服务丢失
- 服务 Flapping - 健康检查失败导致服务频繁注册/注销
解决方案
1. 多节点冗余注册
核心思路:向所有 Consul 节点同时注册服务,避免 leader 轮换影响
Consul 集群节点:
master.tailnet-68f9.ts.net:8500(韩国,通常是 leader)warden.tailnet-68f9.ts.net:8500(北京,优先节点)ash3c.tailnet-68f9.ts.net:8500(美国,备用节点)
注册脚本:scripts/register-traefik-to-all-consul.sh
#!/bin/bash
# 向所有三个 Consul 节点注册 Traefik 服务
CONSUL_NODES=(
"master.tailnet-68f9.ts.net:8500"
"warden.tailnet-68f9.ts.net:8500"
"ash3c.tailnet-68f9.ts.net:8500"
)
TRAEFIK_IP="100.97.62.111" # Tailscale IP,非 RFC1918
ALLOC_ID=$(nomad job allocs traefik-consul-lb | head -2 | tail -1 | awk '{print $1}')
# 注册到所有节点...
2. 使用 Tailscale 地址
关键配置:
- 服务地址:
100.97.62.111(Tailscale IP) - 避免 RFC1918 私有地址 (
192.168.x.x) - 跨网络可访问
3. 宽松健康检查
跨太平洋网络优化:
- Interval:
30s(而非默认 10s) - Timeout:
15s(而非默认 5s) - 避免网络延迟导致的误报
持久化方案
方案 A:Nomad Job 集成 (推荐)
在 Traefik job 中添加 lifecycle hooks:
task "consul-registrar" {
driver = "exec"
lifecycle {
hook = "poststart"
sidecar = false
}
config {
command = "/local/register-services.sh"
}
}
方案 B:定时任务
# 添加到 crontab
*/5 * * * * /root/mgmt/scripts/register-traefik-to-all-consul.sh
方案 C:Consul Template 监控
使用 consul-template 监控 Traefik 状态并自动注册。
部署步骤
-
部署简化版 Traefik:
nomad job run components/traefik/jobs/traefik.nomad -
执行多节点注册:
./scripts/register-traefik-to-all-consul.sh -
验证注册状态:
# 检查所有节点 for node in master warden ash3c; do echo "=== $node ===" curl -s http://$node.tailnet-68f9.ts.net:8500/v1/catalog/services | jq 'keys[]' | grep -E "(consul-lb|traefik)" done
故障排除
问题:北京 warden 节点服务缺失
可能原因:
- Consul 集群同步延迟
- 网络分区或连接问题
- 健康检查失败
排查命令:
# 检查 Consul 集群状态
curl -s http://warden.tailnet-68f9.ts.net:8500/v1/status/peers
# 检查本地服务
curl -s http://warden.tailnet-68f9.ts.net:8500/v1/agent/services
# 检查健康检查
curl -s http://warden.tailnet-68f9.ts.net:8500/v1/agent/checks
解决方法:
# 强制重新注册到 warden
curl -X PUT http://warden.tailnet-68f9.ts.net:8500/v1/agent/service/register -d '{
"ID": "traefik-consul-lb-manual",
"Name": "consul-lb",
"Address": "100.97.62.111",
"Port": 80,
"Tags": ["consul", "loadbalancer", "traefik", "manual"]
}'
监控和维护
健康检查监控
# 检查所有节点的服务健康状态
./scripts/check-consul-health.sh
定期验证
# 每日验证脚本
./scripts/daily-consul-verification.sh
最佳实践
- 地理优化 - 优先使用地理位置最近的 Consul 节点
- 冗余注册 - 始终注册到所有节点,避免单点故障
- 使用 Tailscale - 避免 RFC1918 地址,确保跨网络访问
- 宽松检查 - 跨洋网络使用宽松的健康检查参数
- 文档记录 - 所有配置变更都要有文档记录
访问方式
- Consul UI:
https://hcp1.tailnet-68f9.ts.net/ - Traefik Dashboard:
https://hcp1.tailnet-68f9.ts.net:8080/
创建时间: 2025-10-02
最后更新: 2025-10-02
维护者: Infrastructure Team