Files
Qiniu/xinfra/architecture.md

312 lines
13 KiB
Markdown
Raw Permalink 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.
---
tags: [xinfra, architecture, infra]
create time: 2026-07-13 16:00
---
# XINFRA 架构文档
## 概述
本文档描述 XINFRA 平台的总体架构设计、技术选型、分层模型和系统集成关系。
## 核心概念
### 组内约定
| 概念 | 定义 |
|------|------|
| 主系统 | XINFRA 平台自身的统管层,负责子系统无法覆盖的能力:统一门户(SSO 跳转入口)、资源大盘、登录审计与运维操作审计、资源指标面板、运维终端 |
| 子系统 | XINFRA 纳管的专项平台(有独立 WebUI 和 API 服务),各司其职:**Wayne**(多集群容器管理)、**CloudDM / open-cdm**(数据库管理与 SQL 审核)、**CacheCloud**(Redis 缓存管理)、**Apollo**(配置中心)、**Nightingale**(统一告警引擎) |
| 工具层 | 纳管的 CLI / IaC 工具,无常驻 WebUI,由运维人员通过命令行或脚本触发:**Ansible Playbook**(自动化部署与基础设施即代码) |
| 业务线租户 | 基于 LDAP 组织信息自动生成的多租户隔离单元,每个业务线拥有独立的命名空间、节点池和资源配额 |
### 通用术语
| 概念 | 定义 |
|------|------|
| APIKey | Wayne 平台对外提供的 API 认证密钥,用于 CI/CD 流水线等自动化场景的身份认证,遵循最小权限原则 |
| RBAC | 基于角色的访问控制(Role-Based Access Control),通过角色分配权限,用户与角色关联实现权限隔离 |
| RKE2 | Rancher 发行的 Kubernetes 发行版,已通过 CIS Benchmark 安全加固,支持离线 air-gap 安装,默认启用加密和审计 |
| Calico BGP | Calico 采用纯路由模式(BGP),无隧道开销,每个集群配置独立 AS 号,构建跨机房扁平大二层网络 |
| Ceph RBD | 分布式块存储,供给 K8s PV 给 MySQL、Redis 等有状态服务 |
| Nightingale | 夜莺,统一告警聚合引擎,支持接入 Zabbix、VictoriaMetrics 等异构告警源,负责去重、收敛、分级,推送至 qpass |
| Apollo | 携程开源配置中心,支持多机房 Cluster 部署、配置灰度、版本回滚和操作审计 |
| Consul | 各机房已有的服务注册发现系统,xinfra 通过 Catalog API 做只读聚合展示 |
| CD | 持续部署(Continuous Deployment),自动化服务上线的流水线;CI(持续集成)由团队已有 CI 系统负责 |
| WAF | Web 应用防火墙(Web Application Firewall),防护 SQL 注入、XSS、CSRF 等常见 Web 攻击 |
| SLA | 服务等级协议(Service Level Agreement),定义服务可用性的承诺指标 |
| IaC | 基础设施即代码(Infrastructure as Code),通过 Ansible Playbook 等工具实现基础设施自动化管理 |
| SINA CMDB | 公司内部 CMDB 系统,物理机与虚机资产数据的基础来源 |
| open-cdm | SQL 审核与变更平台,数据库上线统一审核 |
| qpass | 统一告警与值班通知平台 |
| SSO | 单点登录(Single Sign-On),主系统通过 LDAP 统一认证后跳转至各子系统 |
---
## 平台分层架构
### 总体分层
```mermaid
graph TB
User["用户层<br/>LDAP SSO 统一认证"] --> Main["主系统层<br/>统一门户 + 功能模块"]
Main --> Sub["子系统层<br/>独立部署,各自授权"]
Main --> Infra["基础设施层<br/>计算 · 网络 · 存储 · 自动化"]
Sub --> Infra
style User fill:#f3e8fd,stroke:#9333ea
style Main fill:#e0f2fe,stroke:#0284c7
style Sub fill:#e8f0fe,stroke:#4285f4
style Infra fill:#ecfdf5,stroke:#059669
```
---
### 主系统功能架构
```mermaid
graph TB
Portal["统一门户<br/>LDAP SSO 跳转入口"]
subgraph 全局视图
DashBoard["资源大盘<br/>集群拓扑 · 节点方格图"]
MonitorView["资源状态看板<br/>物理机/虚机/服务三层告警"]
end
subgraph 运维能力
TaskCenter["任务中心<br/>Ansible/Wayne 实时日志"]
OpsTerminal["运维终端<br/>Ansible / SSH<br/>仅管理员"]
end
subgraph 治理能力
AuditDash["审计面板<br/>登录记录 · 运维操作日志"]
CMDB["资源台账<br/>CMDB 多云同步"]
SvcDir["服务目录<br/>Consul 只读聚合"]
end
Portal --> DashBoard & MonitorView & TaskCenter & AuditDash & CMDB & SvcDir
SRE["SRE"] --> OpsTerminal
```
> [!tip] 主系统不替代子系统,只自建子系统无法覆盖的能力:全局视图、运维兜底、登录与运维审计、资源台账。
---
### 子系统集成关系
```mermaid
graph LR
Portal["XINFRA 主系统"]
subgraph 子系统
Wayne["Wayne<br/>多集群容器管理"]
CloudDM["open-cdm<br/>SQL 审核"]
CacheCloud["CacheCloud<br/>Redis 管理"]
Apollo["Apollo<br/>配置中心"]
end
Portal -.->|SSO 跳转| Wayne & CloudDM & CacheCloud & Apollo
Wayne -->|Client-Go| RKE2["RKE2 集群"]
CloudDM -->|SQL 审核| MySQL[("MySQL")]
CacheCloud -->|Agent| Redis[("Redis")]
Apollo -->|ConfigService| RKE2
```
> [!tip] 子系统各自独立部署和授权,主系统只做 SSO 跳转入口,各子系统自行维护操作审计。
---
### 基础设施层
```mermaid
graph TB
subgraph 计算
RKE2["RKE2 集群 × 7 机房<br/>CIS 安全加固"]
end
subgraph 网络
Calico["Calico BGP<br/>每集群独立 AS 号<br/>跨机房扁平互通"]
end
subgraph 存储
Ceph["Ceph RBD<br/>MySQL/Redis 有状态服务 PV"]
end
subgraph 自动化
Ansible["Ansible Playbook<br/>节点初始化 · 服务部署<br/>WebSocket 实时日志"]
end
RKE2 --> Calico
RKE2 --> Ceph
Ansible -->|SSH| RKE2
```
> [!tip] RKE2 是计算底座,Calico BGP 构建跨机房扁平网络,Ceph RBD 提供有状态服务的持久化存储,Ansible 贯穿自动化运维。
---
## 监控告警数据流
```mermaid
graph LR
subgraph 采集源
RKE2["RKE2 集群"]
Zabbix["Zabbix<br/>硬件监控"]
end
subgraph 指标存储
VM[("VictoriaMetrics<br/>容器/业务指标")]
end
subgraph 可视化
Grafana["Grafana 仪表盘"]
end
subgraph 告警链路
Nightingale["夜莺<br/>去重 · 收敛 · 分级"]
QPass["qpass<br/>企业 IM 推送"]
end
RKE2 -.->|Metrics| VM
VM --> Grafana
VM --> Nightingale
Zabbix --> Nightingale
Nightingale --> QPass
```
> [!tip] VictoriaMetrics 承载容器和业务指标,Zabbix 覆盖物理机硬件监控,夜莺作为统一告警聚合层,最终推送至 qpass 通知。
---
## 技术选型与架构决策
| 层级 | 选型 | 说明 |
|------|------|------|
| **前端框架** | Vue 3 + Element Plus | 企业级 UI 方案,与七牛内部技术栈一致 |
| **后端框架** | Go + Gin | 高性能 HTTP 框架,与 Wayne/Open-CDM 生态一致 |
| **前后端通信** | 混合模式 | 前端 REST/JSON,服务间 gRPC;API 版本管理采用 URL 路径版本 `/api/v1/...` |
| **主系统数据库** | MySQL 8.0 | 存储任务记录、审计日志、资源台账、用户会话等 |
| **缓存** | Redis | 分布式缓存和会话存储 |
| **前端部署** | Nginx | 托管前端静态文件 + 反向代理后端 API |
| **主系统部署** | K8s 内部署 | 以 Deployment 方式运行在 RKE2 集群内 |
| **SSO 协议** | SAML | 企业统一认证,主系统做 SSO 跳转入口 |
| **告警数据源** | 仅 Nightingale API | 主系统不直接对接 Zabbix/VictoriaMetrics,统一通过夜莺获取告警数据 |
| **Ansible 调度** | AWX | 通过 AWX API 提交 Playbook 任务,由 AWX 管理执行和日志 |
| **实时推送** | 原生 WebSocket | 任务日志实时推送,基于 gorilla/websocket 库 |
| **接口文档** | Swagger/OpenAPI | 后端生成 Swagger 文档供前端开发 |
| **界面语言** | 纯中文 | 不需要国际化 |
| **测试策略** | 后端测试为主 | 单元测试 + 集成测试 |
---
## 基础服务交付流程
```mermaid
sequenceDiagram
actor User as 业务人员
participant Portal as XINFRA 服务目录
participant Ansible as Ansible Playbook
participant Infra as RKE2 / 主机
participant Sub as 子系统注册
User->>Portal: 选择服务卡片(MySQL/Redis/...)<br/>填写业务线、规格、架构模式
Portal->>Portal: 实时预览 playbook 参数(YAML)
User->>Portal: 确认部署
Portal->>Ansible: 提交 playbook 任务
Ansible->>Infra: 内核初始化 · containerd · 加入集群
Ansible-->>Portal: 任务状态 → WebSocket 实时日志
Portal->>Sub: 自动注册(open-cdm / CacheCloud)
Portal-->>User: 部署完成,跳转任务中心
```
> [!tip] 用户通过服务卡片填参 → 后台 Ansible 自动化部署 → 部署完成后自动注册到对应子系统,全程任务日志可在任务中心实时查看。
---
## 多租户隔离模型
```mermaid
graph TB
LDAP["企业 LDAP"] -->|部门 DN| BL["业务线租户<br/>(Kodo / LAS / 灵矽 / ...)"]
BL --> NS["Kubernetes Namespace<br/>+ ResourceQuota + LimitRange"]
BL --> NP["物理节点池<br/>node-label + taint"]
NS -.->|Pod 只能调度到<br/>本业务线节点| NP
style LDAP fill:#f3e8fd,stroke:#9333ea
style BL fill:#e0f2fe,stroke:#0284c7
style NS fill:#ecfdf5,stroke:#059669
style NP fill:#fef3c7,stroke:#d97706
```
> [!tip] 双重隔离:**节点层**通过 `business-line=xxx` 标签 + Taint 确保 Pod 只调度到本业务线节点;**命名空间层**通过 ResourceQuota / LimitRange 限制资源用量上限。
---
## 系统集成关系
**关键集成点**:
| 源 | 目标 | 接口方式 | 说明 |
|----|------|---------|------|
| 企业 LDAP | 各子系统 + 主系统 | LDAP Bind / SSO | 统一身份认证,主系统做 SSO 跳转入口 |
| SINA CMDB | 资源台账 | REST API | 物理机/虚机基础数据来源 |
| 阿里云 / AWS / 七牛 LAS | 资源台账 | OpenAPI | 云上虚机增量同步 |
| Consul × 7 DC | 服务目录 | Catalog API | 只读聚合,不改变原有链路 |
| Nightingale | 资源状态看板 | API | 统一告警数据源 |
| Zabbix | Nightingale | 告警接入 | 硬件监控告警 |
| VictoriaMetrics | Nightingale | 告警接入 | 容器/业务指标告警 |
| GitLab CI | Wayne | REST API(APIKey 认证) | 自动触发部署 |
| GitLab CI | Harbor | Docker Push | 镜像推送 |
| Wayne | RKE2 | Client-Go(K8s API) | 容器编排操作 |
| CloudDM / open-cdm | MySQL / PG 等 | Sidecar SQL 代理 | SQL 审核执行 |
| CacheCloud | Redis | Agent | 实例生命周期管理 |
| Apollo | 各业务线 | Config Service API | 配置下发与灰度发布 |
| Ansible | 各主机 | SSH | 基础设施初始化部署 |
| 企业 LDAP | 主系统 | LDAP Bind | 登录事件记录至审计面板 |
| 各子系统 + 基础设施 | VictoriaMetrics | HTTP / Exporter | Metrics 采集 |
| VictoriaMetrics | Grafana | PromQL | 监控指标可视化(直接复用) |
| Nightingale | qpass | 告警推送 | 统一告警通知 |
---
## 风险与约束
| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| RKE2 版本升级可能引入不兼容变更 | 集群稳定性 | 先在测试环境验证,灰度发布 |
| Wayne 开源版本维护活跃度不确定 | 功能迭代受限 | 内部 Fork 并保持核心模块可维护 |
| 七机房网络链路故障 | 跨机房服务中断 | 网络冗余 + BGP 自动切换 + 告警监控 |
| SQL 审核规则误判 | 合法 SQL 被拦截 | 白名单机制 + 规则持续调优 |
| Redis 大 Key / 热 Key | 性能劣化 | CacheCloud 诊断工具 + 应用侧治理 |
| Apollo 多机房配置一致性 | 配置下发错误 | 本地缓存降级 + 灰度发布验证 |
| Consul 跨机房同步延迟 | 服务发现不一致 | 30 秒轮询 + 健康状态标注 |
| 云平台 API 限流/不可用 | 资源同步中断 | 增量同步 + 重试机制 + 状态告警 |
---
## 运维分层模型
> 故障按层级自愈,跨层操作需主系统管理员权限。
| 故障层级 | 处理方 | 工具链 | 权限要求 |
|---------|--------|--------|---------|
| 应用发布异常 | 子系统自愈 | Wayne 一键回滚 | 项目成员 |
| 中间件故障 | 子系统自恢复 | CacheCloud / CloudDM 内置运维能力 | 子系统运维角色 |
| 配置变更异常 | Apollo 回滚 | Apollo 版本回滚 + 灰度发布 | 配置管理员 |
| 基础设施故障 | 主系统管理员 | Ansible Playbook / SSH 终端 | 仅主系统管理员 |
| 机房级故障 | 主系统管理员 | Ansible + 大内网链路切换 | 仅主系统管理员 |
> [!warning] 安全约束
> Ansible / SSH 终端等基础设施级操作仅对主系统管理员角色可见,普通用户菜单中不包含此项。所有跨层操作全程审计留痕。
---
## 关联笔记
- [[requirements]]
- [[mvp-plan]]
- [[technical/xinfra-preview]]