10 KiB
10 KiB
🏗️ 基础设施管理项目
这是一个现代化的多云基础设施管理平台,专注于 OpenTofu、Ansible 和 Nomad + Podman 的集成管理。
🎯 项目特性
- 🌩️ 多云支持: Oracle Cloud, 华为云, Google Cloud, AWS, DigitalOcean
- 🏗️ 基础设施即代码: 使用 OpenTofu 管理云资源
- ⚙️ 配置管理: 使用 Ansible 自动化配置和部署
- 🐳 容器编排: Nomad 集群管理和 Podman 容器运行时
- 🔄 CI/CD: Gitea Actions 自动化流水线
- 📊 监控: Prometheus + Grafana 监控体系
- 🔐 安全: 多层安全防护和合规性
📁 项目结构
mgmt/
├── .gitea/workflows/ # CI/CD 工作流
├── tofu/ # OpenTofu 基础设施代码
│ ├── environments/ # 环境配置 (dev/staging/prod)
│ ├── modules/ # 可复用模块
│ ├── providers/ # 云服务商配置
│ └── shared/ # 共享配置
├── configuration/ # Ansible 配置管理
│ ├── inventories/ # 主机清单
│ ├── playbooks/ # 剧本
│ ├── templates/ # 模板文件
│ └── group_vars/ # 组变量
├── jobs/ # Nomad 作业定义
│ ├── consul/ # Consul 集群配置
│ └── podman/ # Podman 相关作业
├── configs/ # 配置文件
│ ├── nomad-master.hcl # Nomad 主节点配置
│ └── nomad-ash3c.hcl # Nomad 客户端配置
├── docs/ # 文档
├── security/ # 安全配置
│ ├── certificates/ # 证书文件
│ └── policies/ # 安全策略
├── tools/ # 工具和实用程序
├── playbooks/ # 核心Ansible剧本
└── Makefile # 项目管理命令
注意: 项目已从 Docker Swarm 迁移到 Nomad + Podman,原有的 swarm 目录已不再使用。所有中间过程脚本和测试文件已清理,保留核心配置文件以符合GitOps原则。
🔄 GitOps 原则
本项目遵循 GitOps 工作流,确保基础设施状态与 Git 仓库中的代码保持一致:
- 声明式配置: 所有基础设施和应用程序配置都以声明式方式存储在 Git 中
- 版本控制和审计: 所有变更都通过 Git 提交,提供完整的变更历史和审计跟踪
- 自动化同步: 通过 CI/CD 流水线自动将 Git 中的变更应用到实际环境
- 状态收敛: 系统会持续监控实际状态,并自动修复任何与期望状态的偏差
GitOps 工作流程
- 声明期望状态: 在 Git 中定义基础设施和应用程序的期望状态
- 提交变更: 通过 Git 提交来应用变更
- 自动同步: CI/CD 系统检测到变更并自动应用到环境
- 状态验证: 系统验证实际状态与期望状态一致
- 监控和告警: 持续监控状态并在出现偏差时发出告警
这种工作流确保了环境的一致性、可重复性和可靠性,同时提供了完整的变更历史和回滚能力。
🚀 快速开始
1. 环境准备
# 克隆项目
git clone <repository-url>
cd mgmt
# 检查环境状态
./mgmt.sh status
# 快速部署(适用于开发环境)
./mgmt.sh deploy
2. 配置云服务商
# 复制配置模板
cp tofu/environments/dev/terraform.tfvars.example tofu/environments/dev/terraform.tfvars
# 编辑配置文件,填入你的云服务商凭据
vim tofu/environments/dev/terraform.tfvars
3. 初始化基础设施
# 初始化 OpenTofu
./mgmt.sh tofu init
# 查看执行计划
./mgmt.sh tofu plan
# 应用基础设施变更
cd tofu/environments/dev && tofu apply
4. 部署 Nomad 服务
# 部署 Consul 集群
nomad run /root/mgmt/jobs/consul/consul-cluster.nomad
# 查看 Nomad 任务
nomad job status
# 查看节点状态
nomad node status
⚠️ 重要提示:网络访问注意事项
Tailscale 网络访问:
- 本项目中的 Nomad 和 Consul 服务通过 Tailscale 网络进行访问
- 访问 Nomad (端口 4646) 和 Consul (端口 8500) 时,必须使用 Tailscale 分配的 IP 地址
- 错误示例:
http://127.0.0.1:4646或http://localhost:8500(无法连接) - 正确示例:
http://100.x.x.x:4646或http://100.x.x.x:8500(使用 Tailscale IP)
获取 Tailscale IP:
# 查看当前节点的 Tailscale IP
tailscale ip -4
# 查看所有 Tailscale 网络中的节点
tailscale status
常见问题:
- 如果遇到 "connection refused" 错误,请确认是否使用了正确的 Tailscale IP
- 确保 Tailscale 服务已启动并正常运行
- 检查网络策略是否允许通过 Tailscale 接口访问相关端口
🔄 Nomad 集群领导者轮换与访问策略
Nomad 集群领导者机制:
- Nomad 使用 Raft 协议实现分布式一致性,集群中只有一个领导者节点
- 领导者节点负责处理所有写入操作和协调集群状态
- 当领导者节点故障时,集群会自动选举新的领导者
领导者轮换时的访问策略:
- 动态发现领导者:
# 查询当前领导者节点
curl -s http://<任意Nomad服务器IP>:4646/v1/status/leader
# 返回结果示例: "100.90.159.68:4647"
# 使用返回的领导者地址进行API调用
curl -s http://100.90.159.68:4646/v1/nodes
-
负载均衡方案:
- DNS 负载均衡:使用 Consul DNS 服务,通过
nomad.service.consul解析到当前领导者 - 代理层负载均衡:在 Nginx/HAProxy 配置中添加健康检查,自动路由到活跃的领导者节点
- 客户端重试机制:在客户端代码中实现重试逻辑,当连接失败时尝试其他服务器节点
- DNS 负载均衡:使用 Consul DNS 服务,通过
-
推荐访问模式:
# 使用领导者发现脚本
#!/bin/bash
# 获取任意一个Nomad服务器IP
SERVER_IP="100.116.158.95"
# 查询当前领导者
LEADER=$(curl -s http://${SERVER_IP}:4646/v1/status/leader | sed 's/"//g')
# 使用领导者地址执行命令
nomad node status -address=http://${LEADER}
- 高可用性配置:
- 将所有 Nomad 服务器节点添加到客户端配置中
- 客户端会自动连接到可用的服务器节点
- 对于写入操作,客户端会自动重定向到领导者节点
注意事项:
- Nomad 集群领导者轮换是自动进行的,通常不需要人工干预
- 在领导者选举期间,集群可能会短暂无法处理写入操作
- 建议在应用程序中实现适当的重试逻辑,以处理领导者切换期间的临时故障
🛠️ 常用命令
| 命令 | 描述 |
|---|---|
make status |
显示项目状态总览 |
make deploy |
快速部署所有服务 |
make cleanup |
清理所有部署的服务 |
cd tofu/environments/dev && tofu <cmd> |
OpenTofu 管理命令 |
nomad job status |
查看 Nomad 任务状态 |
nomad node status |
查看 Nomad 节点状态 |
podman ps |
查看运行中的容器 |
ansible-playbook playbooks/configure-nomad-clients.yml |
配置 Nomad 客户端 |
🌩️ 支持的云服务商
Oracle Cloud Infrastructure (OCI)
- ✅ 计算实例
- ✅ 网络配置 (VCN, 子网, 安全组)
- ✅ 存储 (块存储, 对象存储)
- ✅ 负载均衡器
华为云
- ✅ 弹性云服务器 (ECS)
- ✅ 虚拟私有云 (VPC)
- ✅ 弹性负载均衡 (ELB)
- ✅ 云硬盘 (EVS)
Google Cloud Platform
- ✅ Compute Engine
- ✅ VPC 网络
- ✅ Cloud Load Balancing
- ✅ Persistent Disk
Amazon Web Services
- ✅ EC2 实例
- ✅ VPC 网络
- ✅ Application Load Balancer
- ✅ EBS 存储
DigitalOcean
- ✅ Droplets
- ✅ VPC 网络
- ✅ Load Balancers
- ✅ Block Storage
🔄 CI/CD 流程
基础设施部署流程
- 代码提交 → 触发 Gitea Actions
- OpenTofu Plan → 生成执行计划
- 人工审核 → 确认变更
- OpenTofu Apply → 应用基础设施变更
- Ansible 部署 → 配置和部署应用
应用部署流程
- 应用代码更新 → 构建容器镜像
- 镜像推送 → 推送到镜像仓库
- Nomad Job 更新 → 更新任务定义
- Nomad 部署 → 滚动更新服务
- 健康检查 → 验证部署状态
📊 监控和可观测性
监控组件
- Prometheus: 指标收集和存储
- Grafana: 可视化仪表板
- AlertManager: 告警管理
- Node Exporter: 系统指标导出
日志管理
- ELK Stack: Elasticsearch + Logstash + Kibana
- Fluentd: 日志收集和转发
- 结构化日志: JSON 格式标准化
🔐 安全最佳实践
基础设施安全
- 网络隔离: VPC, 安全组, 防火墙
- 访问控制: IAM 角色和策略
- 数据加密: 传输和静态加密
- 密钥管理: 云服务商密钥管理服务
应用安全
- 容器安全: 镜像扫描, 最小权限
- 网络安全: 服务网格, TLS 终止
- 秘密管理: Docker Secrets, Ansible Vault
- 安全审计: 日志监控和审计
🧪 测试策略
基础设施测试
- 语法检查: OpenTofu validate
- 安全扫描: Checkov, tfsec
- 合规检查: OPA (Open Policy Agent)
应用测试
- 单元测试: 应用代码测试
- 集成测试: 服务间集成测试
- 端到端测试: 完整流程测试
📚 文档
🤝 贡献指南
- Fork 项目
- 创建特性分支 (
git checkout -b feature/amazing-feature) - 提交变更 (
git commit -m 'Add amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 创建 Pull Request
📄 许可证
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
🆘 支持
如果你遇到问题或有疑问:
🎉 致谢
感谢所有为这个项目做出贡献的开发者和社区成员!