Files
slide/decks/xinfra/slides.md
T

18 KiB
Raw Blame History

theme, title, author, infoLine, transition, mdc, drawings
theme title author infoLine transition mdc drawings
frankfurt XINFRA 平台架构 实训小组 true slide-left true
persist
false

XINFRA 平台架构

统一基础设施管理平台 · 总体架构设计
实训小组

layout: default

目录

一、名词概述

  • 组内约定
  • 通用术语

二、架构图

  • 平台分层架构
  • 部署架构
  • 监控告警链路
  • 安全认证流程

三、架构描述

  • 技术选型
  • 数据库设计
  • 安全机制
  • 运维模型与风险

section: 名词概述 layout: center

一、名词概述

平台核心概念与通用术语

layout: default

组内约定

主系统

XINFRA 平台自身的统管层,负责子系统无法覆盖的能力:

  • 统一门户(SSO 跳转入口)
  • 资源大盘、运维终端
  • 登录审计与运维操作审计
  • 资源指标面板

子系统

XINFRA 纳管的专项平台(独立 WebUI + API):

  • Wayne — 多集群容器管理
  • CloudDM — 数据库管理与 SQL 审核
  • CacheCloud — Redis 缓存管理
  • Apollo — 配置中心
  • Grafana — 监控可视化
  • qpass — 统一告警与值班通知

工具层

纳管的 CLI / IaC 工具,无常驻 WebUI:

  • Ansible Playbook — 自动化部署与基础设施即代码

监控告警层

聚合异构告警源,统一去重、收敛、分级:

  • Nightingale(夜莺) — 告警聚合引擎
  • VictoriaMetrics — 容器/业务指标存储
  • Zabbix — 物理机硬件监控

通用术语(一)

术语 说明
APIKey Wayne 对外 API 认证密钥,CI/CD 自动化场景使用,最小权限
RBAC 基于角色的访问控制,用户与角色关联实现权限隔离
RKE2 Rancher K8s 发行版,CIS 安全加固,支持离线安装
Calico BGP 纯路由模式无隧道开销,每集群独立 AS 号,跨机房扁平网络
Ceph RBD 分布式块存储,供给 K8s PV 给有状态服务
Nightingale 夜莺,统一告警聚合引擎,去重收敛分级后推送
Apollo 携程开源配置中心,多机房部署、灰度、回滚、审计
术语 说明
Consul 各机房服务注册发现,XINFRA 只读聚合展示
CD 持续部署,自动化服务上线流水线
WAF Web 应用防火墙,防护 SQL 注入、XSS、CSRF
SLA 服务等级协议,定义可用性承诺指标
IaC 基础设施即代码,通过 Ansible 实现自动化管理
SINA CMDB 公司内部 CMDB,物理机与虚机资产数据基础来源
SSO 单点登录,主系统通过 LDAP 统一认证后跳转子系统

section: 架构图 layout: center

二、架构图

平台分层 · 部署 · 监控 · 安全

平台分层架构 — 总体分层

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

四层模型:用户层 → 主系统层 → 子系统层 → 基础设施层,主系统是统一入口,子系统各司其职。


平台分层架构 — 主系统功能

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

主系统不替代子系统,只自建子系统无法覆盖的能力:全局视图、运维兜底、审计、资源台账。


平台分层架构 — 子系统集成

graph LR
    Portal["XINFRA 主系统"]

    subgraph 子系统
        Wayne["Wayne<br/>多集群容器管理"]
        CloudDM["CloudDM<br/>SQL 审核"]
        CacheCloud["CacheCloud<br/>Redis 管理"]
        Apollo["Apollo<br/>配置中心"]
        Grafana["Grafana<br/>监控可视化"]
        QPass["qpass<br/>告警通知"]
    end

    Portal -.->|SSO 跳转| Wayne & CloudDM & CacheCloud & Apollo & Grafana & QPass

    Wayne -->|Client-Go| RKE2["RKE2 集群"]
    CloudDM -->|SQL 审核| MySQL[("MySQL")]
    CacheCloud -->|Agent| Redis[("Redis")]
    Apollo -->|ConfigService| RKE2

子系统各自独立部署和授权,主系统只做 SSO 跳转入口,各子系统自行维护操作审计。


平台分层架构 — 基础设施层

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

RKE2 是计算底座,Calico BGP 构建跨机房扁平网络,Ceph RBD 提供持久化存储,Ansible 贯穿自动化运维。


部署架构

graph TB
    subgraph "RKE2 集群(任一机房)"
        subgraph "xinfra 命名空间"
            FE["Nginx<br/>前端静态文件 + 反向代理"]
            BE["Go API Server<br/>Deployment × 2"]
            WS["WebSocket Gateway<br/>任务日志实时推送"]
        end

        subgraph "监控命名空间"
            VM[("VictoriaMetrics")]
            Grafana["Grafana"]
            NE["Nightingale"]
        end

        subgraph "子系统命名空间"
            Wayne["Wayne"]
            CloudDM["CloudDM"]
            CacheCloud["CacheCloud"]
            Apollo["Apollo"]
        end
    end

    LB["SLB / NodePort"] --> FE
    FE -->|/api/*| BE
    FE -->|WebSocket| WS
    BE --> MySQL[("MySQL 8.0 主从")]
    BE --> Redis[("Redis 会话缓存")]
    BE -->|SSH/Ansible| Nodes["业务节点池"]
    WS --> BE

    style FE fill:#e0f2fe,stroke:#0284c7
    style BE fill:#e0f2fe,stroke:#0284c7
    style WS fill:#e0f2fe,stroke:#0284c7

监控告警数据流

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 -.->|Webhook| Nightingale
    Nightingale --> QPass
    Zabbix -->|Zabbix API| Main["XINFRA 主系统<br/>资源状态看板"]

Zabbix 硬件监控分两条链路:告警事件通过 Webhook 推送至夜莺统一聚合;可观测数据(IPMI/温度/电源/风扇等)由主系统直接调用 Zabbix API 采集展示。


基础服务交付流程

sequenceDiagram
    actor User as 业务人员
    participant Portal as XINFRA 服务目录
    participant Ansible as Ansible Playbook
    participant Infra as RKE2 / 主机
    participant Sub as 子系统注册

    User->>Portal: 选择服务卡片,填写业务线、规格
    Portal->>Portal: 实时预览 playbook 参数(YAML)
    User->>Portal: 确认部署
    Portal->>Ansible: 提交 playbook 任务
    Ansible->>Infra: 内核初始化 · containerd · 加入集群
    Ansible-->>Portal: 任务状态 → WebSocket 实时日志
    Portal->>Sub: 自动注册(CloudDM / CacheCloud)
    Portal-->>User: 部署完成,跳转任务中心

用户通过服务卡片填参 → Ansible 自动化部署 → 完成后自动注册到对应子系统,全程日志实时查看。


多租户隔离模型(Phase 2+)

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

双重隔离:节点层通过 business-line=xxx 标签 + Taint 确保 Pod 调度隔离;命名空间层通过 ResourceQuota / LimitRange 限制资源用量上限。 Phase 1 仅做基础设施准备(节点标签预留),多租户功能为 Phase 2+。


安全认证流程

sequenceDiagram
    actor User as 用户
    participant Main as XINFRA 主系统
    participant LDAP as 企业 LDAP
    participant Sub as 子系统

    User->>Main: 访问主系统
    Main->>LDAP: SAML 认证请求
    LDAP-->>Main: SAML Response(用户身份 + LDAP 组信息)
    Main->>Main: 签发 JWT Token(含角色 + 业务线)
    Main-->>User: 登录成功,返回 Token

    User->>Main: 点击子系统卡片
    Main->>Sub: OAuth 2.0 Authorization Code
    Sub->>Main: 验证 Token,创建子系统会话
    Main-->>User: 跳转至子系统(免登录)

外部 LDAP 通过 SAML 集成统一认证;子系统 SSO 通过 OAuth 2.0 对接,实现单点登录免跳转。


section: 架构描述 layout: center

三、架构描述

技术选型 · 数据库设计 · 安全机制 · 运维模型

layout: default

技术选型

层级 选型
前端框架 Vue 3 + Element Plus
后端框架 Go + Gin
前后端通信 REST/JSON,URL 路径版本
主系统数据库 MySQL 8.0
缓存 Redis
前端部署 Nginx
主系统部署 K8s Deployment
层级 选型
SSO 协议 OAuth 2.0 + SAML
告警数据源 Nightingale + Zabbix API
Ansible 调度 SSH 直接执行
实时推送 原生 WebSocket
接口文档 Swagger/OpenAPI
界面语言 纯中文
测试策略 后端单元 + 集成测试

选型依据

选型 理由 备选淘汰原因
Vue 3 + Element Plus 七牛内部技术栈统一,团队有 Vue 2 迁移经验 React + Ant Design — 学习成本更高
Go + Gin Wayne/CloudDM 同生态,可复用 Client-Go、GORM Java Spring Boot — 部署资源占用更大
MySQL 8.0 运维团队已有经验和工具链,CloudDM 原生支持 PostgreSQL — 团队运维经验不足

API 设计规范

规范项 约定
路由命名 RESTful 风格,资源名复数
版本管理 URL 路径版本 /api/v1/...
分页 ?page=1&pageSize=20,响应含 total
排序 ?sort=created_at&order=desc
筛选 ?status=running&businessLine=kodo
规范项 约定
错误码 HTTP 状态码 + 业务错误码
认证 Bearer Token(JWT),OAuth 2.0 获取
响应格式 { "code": 0, "data": {...} }
接口文档 Swagger/OpenAPI 3.0

路由示例

GET  /api/v1/clusters              # 集群列表
GET  /api/v1/clusters/:id/nodes    # 集群节点
POST /api/v1/tasks                 # 创建任务
GET  /api/v1/audit-logs?page=1&pageSize=20

数据库 ER 设计(核心表)

erDiagram
    USERS ||--o{ AUDIT_LOGS : "产生"
    USERS ||--o{ TASKS : "执行"
    USERS ||--o{ API_KEYS : "拥有"

    USERS {
        bigint id PK
        varchar username UK "LDAP 用户名"
        varchar role "管理员/操作员/访客"
        varchar business_line "所属业务线"
    }

    AUDIT_LOGS {
        bigint id PK
        bigint user_id FK
        varchar action "login/terminal/playbook"
        varchar ip "来源 IP"
    }

    TASKS {
        bigint id PK
        varchar task_type "ansible/wayne-deploy"
        varchar status "pending/running/success/failed"
        bigint user_id FK
    }

    API_KEYS {
        bigint id PK
        varchar key_hash UK "密钥哈希"
        varchar scope "授权范围"
        datetime expires_at
    }

    CLUSTERS {
        bigint id PK
        varchar name UK "集群名称"
        varchar datacenter "所在机房"
        varchar status "健康状态"
    }

    NODES {
        bigint id PK
        bigint cluster_id FK
        varchar hostname "主机名"
        varchar business_line "业务线标签"
    }

    RESOURCES {
        bigint id PK
        varchar hostname UK "主机名"
        varchar source "cmdb/alicloud/aws/las"
        varchar lifecycle "production/idle/retired"
    }

安全机制

认证与授权

层面 机制
身份认证 SAML + OAuth 2.0
访问控制 RBAC + 业务线维度
传输安全 HTTPS + TLS 1.2+
数据加密 AES-256,敏感字段加密存储
APIKey 管理 SHA-256 哈希存储,scope 粒度授权

审计与隔离

层面 机制
审计留痕 登录/运维/API 全程记录,不可篡改
网络隔离 BGP + 防火墙,管理面与数据面分离
凭证管理 禁止默认凭证,Vault / K8s Secret
Ansible/SSH 仅管理员可见,普通用户菜单不包含

RBAC 二维模型:权限维度(角色能力)× 业务线维度(资源范围),遵循最小权限原则。 所有跨层操作全程审计留痕。


运维分层模型

故障层级 处理方 工具链 权限要求
应用发布异常 子系统自愈 Wayne 一键回滚 项目成员
中间件故障 子系统自恢复 CacheCloud / CloudDM 内置能力 子系统运维角色
配置变更异常 Apollo 回滚 Apollo 版本回滚 + 灰度发布 配置管理员
基础设施故障 主系统管理员 Ansible Playbook / SSH 终端 仅主系统管理员
机房级故障 主系统管理员 Ansible + 大内网链路切换 仅主系统管理员

故障按层级自愈,跨层操作需主系统管理员权限。Ansible / SSH 终端等基础设施级操作仅对管理员角色可见,所有跨层操作全程审计留痕。


风险与约束

风险 缓解措施
RKE2 版本升级不兼容 测试环境验证,灰度发布
Wayne 开源维护不确定 内部 Fork,保持核心可维护
七机房网络链路故障 网络冗余 + BGP 自动切换
SQL 审核规则误判 白名单机制 + 规则持续调优
Redis 大 Key / 热 Key CacheCloud 诊断 + 应用侧治理
风险 缓解措施
Apollo 多机房配置一致性 本地缓存降级 + 灰度发布
Consul 跨机房同步延迟 30 秒轮询 + 健康状态标注
云平台 API 限流 增量同步 + 重试 + 状态告警
AWX 未引入,Ansible 直调 自建任务队列 + WebSocket 日志
Go/Gin 开发人力 复用 Wayne/CloudDM 生态降低学习成本

layout: center

总结

🏗 四层架构

用户层 → 主系统层
→ 子系统层 → 基础设施层

🔐 统一安全

LDAP SAML 认证
RBAC + 业务线隔离
全程审计留痕

🚀 自动化运维

Ansible IaC 交付
WebSocket 实时日志
故障分层自愈

XINFRA — 统一基础设施管理平台