mgmt/docs/CONSUL_SERVICE_REGISTRATION.md

171 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)
- 避免网络延迟导致的误报
## 持久化方案
### 方案 ANomad 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
```
### 方案 CConsul 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