# Consul 服务注册解决方案 ## 问题背景 在跨太平洋的 Nomad + Consul 集群中,遇到以下问题: 1. **RFC1918 地址问题** - Nomad 自动注册使用私有 IP,跨网络无法访问 2. **Consul Leader 轮换** - 服务只注册到单个节点,leader 变更时服务丢失 3. **服务 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` ```bash #!/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: ```hcl task "consul-registrar" { driver = "exec" lifecycle { hook = "poststart" sidecar = false } config { command = "/local/register-services.sh" } } ``` ### 方案 B:定时任务 ```bash # 添加到 crontab */5 * * * * /root/mgmt/scripts/register-traefik-to-all-consul.sh ``` ### 方案 C:Consul Template 监控 使用 consul-template 监控 Traefik 状态并自动注册。 ## 部署步骤 1. **部署简化版 Traefik**: ```bash nomad job run components/traefik/jobs/traefik.nomad ``` 2. **执行多节点注册**: ```bash ./scripts/register-traefik-to-all-consul.sh ``` 3. **验证注册状态**: ```bash # 检查所有节点 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 节点服务缺失 **可能原因:** 1. Consul 集群同步延迟 2. 网络分区或连接问题 3. 健康检查失败 **排查命令:** ```bash # 检查 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 ``` **解决方法:** ```bash # 强制重新注册到 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"] }' ``` ## 监控和维护 ### 健康检查监控 ```bash # 检查所有节点的服务健康状态 ./scripts/check-consul-health.sh ``` ### 定期验证 ```bash # 每日验证脚本 ./scripts/daily-consul-verification.sh ``` ## 最佳实践 1. **地理优化** - 优先使用地理位置最近的 Consul 节点 2. **冗余注册** - 始终注册到所有节点,避免单点故障 3. **使用 Tailscale** - 避免 RFC1918 地址,确保跨网络访问 4. **宽松检查** - 跨洋网络使用宽松的健康检查参数 5. **文档记录** - 所有配置变更都要有文档记录 ## 访问方式 - **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