# Consul 集群故障排除指南

## 问题诊断

### 发现的问题
1. **DNS 解析失败**：服务间无法通过服务名相互发现
2. **网络连通性问题**：`ash3c` 节点网络配置异常
3. **跨节点通信失败**：`no route to host` 错误
4. **集群无法形成**：持续的 "No cluster leader" 错误

### 根本原因
- 网络配置问题
- 防火墙或网络策略可能阻止了 Consul 集群通信端口

## 解决方案

### 当前部署方案（使用 Nomad + Podman）
目前集群已从 Docker Swarm 迁移到 Nomad + Podman，使用 `consul-cluster-nomad.nomad` 文件部署 Consul 集群。

## 网络诊断步骤

### 1. 检查节点状态
```bash
nomad node status
```

### 2. 检查网络连通性
```bash
# 在 master 节点上测试到 ash3c 的连通性
ping <ash3c-ip>
telnet <ash3c-ip> 8301
```

### 3. 检查防火墙设置
```bash
# 确保以下端口开放
# 8300: Consul server RPC
# 8301: Consul Serf LAN
# 8302: Consul Serf WAN
# 8500: Consul HTTP API
# 8600: Consul DNS
```

### 4. 检查 Podman 网络
```bash
podman network ls
podman network inspect <network-name>
```

## 推荐的修复流程

### 立即解决方案（单节点）
1. 部署单节点 Consul 以恢复服务
2. 验证基本功能正常

### 长期解决方案（集群）
1. 修复 `ash3c` 节点的网络配置
2. 确保节点间网络连通性
3. 配置防火墙规则
4. 重新部署集群配置

## 验证步骤

### 单节点验证
```bash
# 检查服务状态
docker service ls | grep consul

# 检查日志
docker service logs consul_consul

# 访问 Web UI
curl http://localhost:8500/v1/status/leader
```

### 集群验证
```bash
# 检查集群成员
docker exec <consul-container> consul members

# 检查领导者
docker exec <consul-container> consul operator raft list-peers
```

## 常见问题

### Q: 为什么服务发现不工作？
A: 在之前的 Docker Swarm 架构中，overlay 网络在某些配置下可能存在 DNS 解析问题。当前的 Nomad + Podman 架构已解决了这些问题。

### Q: 如何选择合适的网络方案？
A: 
- 开发/测试环境：使用单节点或 overlay 网络
- 生产环境：推荐使用 macvlan 或主机网络以获得更好的性能和可靠性

### Q: 集群恢复后数据会丢失吗？
A: 如果使用了持久化卷，数据不会丢失。但建议在修复前备份重要数据。

## 监控和维护

### 健康检查
```bash
# 定期检查集群状态
consul members
consul operator raft list-peers
```

### 日志监控
```bash
# 监控关键错误
docker service logs consul_consul | grep -E "(ERROR|WARN)"
```

### 性能监控
- 监控 Consul 的 HTTP API 响应时间
- 检查集群同步延迟
- 监控网络连接数

## 联系支持

如果问题持续存在，请提供以下信息：
1. Docker 版本和 Swarm 配置
2. 网络拓扑图
3. 完整的服务日志
4. 节点间网络测试结果