跳转至

架构设计方案 (Architecture Design)

本文档完整阐述了当前基础设施的“双区域混合网络拓扑 (Twin-Hub Hybrid Mesh)”。所有后续的新增部署、网络配置以及故障排查必须严格依据本方案的全景视图进行。


1. 架构总览 (Global Overview)

整个基础设施横跨两个异地的 Oracle Cloud 区域,底层通过安全的 Tailscale 组建虚拟专网 (VPN 隧道)。

  • 🇬🇧 欧洲中心 (London Swarm): 由部署在英国伦敦的 3 台节点构成的 Docker Swarm 高可用集群。作为算力池,承载重型数据库、主要对外的业务应用以及持续运算服务。
  • 🇰🇷 亚洲中心 (Chuncheon Standalone): 部署在韩国春川的 2 台独立服务器。承担着距离亚洲用户最近的网络出口职责(网关代理拦截),同时也作为全局管理节点存放监控面板和私有内部服务。

控制平面 (Control Plane) 采用单一入口哲学:春川的“主节点”上部署管理面板 (Portainer Server),通过 Tailscale 隧道,以“只读/受控指令”形式向分布在所有地点的 Agent 下发命令并纳管全局。


2. 网络平面设计 (Network Planes)

网络被划分为三个严格隔离的“平面”,这是兼顾安全性访问与服务内网可发现性的核心方案:

网络平面 类别驱动 解析对象与范围 定位与用途
底层平面 (Underlay) 物理网络 (Oracle VCN) 公网与单可用区内网互通 服务器之间的硬连线,处理 SSH (端口 22)直连和建立外网 VPN 打洞。完全受 Oracle 外部安全列表 (Security List) 防护。
隧道平面 (Mesh Overlay) tailscale0 (Host 模式) 跨国、跨区域服务 关键的基础设施平面。所有管理面板 (如 9001 端口)、跨区域的代理转发,全量且只能行进在此平面。这是零信任安全的基石。
应用平面 (Docker Net) Bridge / Swarm Overlay 单台节点内部 / 专属 Swarm 集群内 跑业务应用。例如 proxy-kr 网络服务春川自身容器互访,proxy-uk 网络支撑整个伦敦集群的动态解析。

[!TIP] 设计决策:为什么坚持 Tailscale 使用 Host 模式? 我们有意识地将 Tailscale 容器配置为 network_mode: host,强制它在宿主操作系统生成一个名称为 tailscale0 的网卡(而非默认的用户态代理)。 这样,Portainer Agent 能够直接把服务绑定到宿主机的 100.x.y.z 专属内网地址。因为防火墙默认 Drop 一切,这就从根本上杜绝了服务端口被公网扫描/攻击的可能,实现了“只允许内网互信机器管理”的设计目标。


3. 部署标准化与目录 (Topology Standards)

业务部署应当具备高度的一致性和可预测性,分为隔离的两大“配置层”:

3.1 固定的目录结构

  • /opt/infra/bootstrap/基建层 (Layer 0)。这里放置使一台“毛坯服务器”能独立工作并接入控制中心的基础组件。通常就是一个基础的 docker-compose.yml(包含 net-tailscaleops-portainer/agent 两个容器)。
  • /opt/infra/stacks/业务层 (Layer 1)。通过 Portainer 图形化界面或 Stack 统一部署的各类业务文件及其持数据久化的卷存放处。

3.2 节点的角色分类

A. 基础设施司令部 (Chuncheon-1 主节点)

  • Layer 0 职责: 运行组网的核心 (net-tailscale) + 全局指挥中心 (ops-portainer)。
  • 安全特征: 控制面板决不直接向公网裸奔。它的控制端强制映射并在 127.0.0.1,仅通过专门的区域网关 (Traefik) 的安全认证访问路由。

B. 集群算力节点与边界节点 (London 全系 / Chuncheon-2)

  • Layer 0 职责: 组网 (net-tailscale) + 被指挥端 (ops-portainer-agent)。
  • 安全特征: 所有的 Agent 监听本机 9001。这要求极高安全管控——宿主机的 OS 防火墙 (ufw) 以及 Oracle 的出口规则必须强拦截来自任何外网尝试连接 9001 端口的动作

4. 流量路由与转发逻辑 (Traffic Routing)

所有的 HTTPS 网关接入和域名转发都由各个区的 Traefik 集群承担。

4.1 场景一:区域内网业务访问(同区路由)

  1. 用户访问某个位于伦敦的纯净应用如 https://blog.u.120224.xyz
  2. 域名解析将流量送到伦敦 Swarm 负责外部接口的 Traefik (net-traefik-uk)。
  3. Traefik 依据内部 Docker Socket 解析到的标签 (Labels),智能将包在 proxy-uk 网络内转给后端的服务实例。

    核心优势:在区域内部的横向互访,应用容器完全不需要开放 (ports: ...) 给操作系统,这杜绝了旁路渗透。

4.2 场景二:跨区域穿透访问(网关跨城路由)

  1. 服务器资源在英国(某重度应用或因备份考虑留在 Swarm),但想要一个能从亚洲更低延迟触达的前置入口(例如:https://hub.i.120224.xyz)。
  2. 用户从浏览器发起的连接首先抵达亚洲春川主节点的 Traefik-KR
  3. 因为是跨城,内网容器并不互通。在英国的应用配置 ports: - "100.88.x.x:5000:5000",仅在它自己位于隧道的 Tailscale IP 暴露了特定的传输端口。
  4. 春川的网关获取这个请求,根据手动设置的动态路由指引,封装加密数据包发到特定的那个 http://100.88.x.x:5000 节点。

    核心优势:利用加密隧道打破物理孤岛。不论机器放在哪,都可以把流量交由前置的反向代理统一分配并加持认证墙。


5. 高可用性设计与底线 (HA Boundaries)

  1. 无单点故障(网络级): 网关 Traefik (UK) 在 Swarm 中以全局模式多路分发部署,任意单台服务器宕机,访问都不会中断。Tailscale 采用完全分布式的 P2P 连接构架。
  2. 有物理限制的有状态服务 (Stateful Apps): 有些服务不可避免地涉及重量级的本地 IO(例如 app-pcrdb 数据库集群)。
    • 架构让步:我们尚未有分布式 Ceph 存储池的支持,所以业务在 Swarm Compose 中采用了 constraints: [node.hostname == london3] 物理设备约束进行就地锚定。
    • 缓解策略:依托 Rclone 的热备份快照外加外网异地网盘进行弥补,以此降低机器暴毙造成的核心业务长时停顿风险(详见容灾体系指引文档)。

6. 主机名与设备命名约定

主机名统一采用:

<region>-<provider>-<role>-<index>

推荐缩写: - regioncnkruk - providerbceoci - roledevmainauxmgrworker - index:两位序号,如 01

示例: - cn-bce-dev-01 - kr-oci-main-01 - kr-oci-aux-01 - uk-oci-mgr-01 - uk-oci-worker-01

约定: - Linux hostname 按此规则设定 - Tailscale 设备名尽量与 hostname 保持一致 - 域名独立规划,不要求与 hostname 完全一致