resource

杂记

公司有生产、测试、开发等不同的环境以及不同的集群,用户请求(分为公网,内网用户)是通过什么路径到达后端应用的。

公网

① Client
   │
   │ HTTPS
   ▼
② DNS
   │
   │ 找到 Public SLB IP
   ▼
③ Public SLB
   │
   │ 查看 Path
   │
   │ /api/v1/app/*
   ▼
④ APP Gateway Pool
   │
   │ 选择 APP Gateway 实例
   ▼
⑤ APP Gateway
   │
   │  鉴权 / 限流 / Header处理
   │
   internal LB
   │ /order/*
   ▼
   ingress
   | /order/* api 路由
   ▼
  Order Service 入口
   │
   │
   ▼
  Order Pod

client 发送请求 ,做 DNS 解析到一个公网 IP (Public SLB IP),假设为 203.0.113.10 ,

GET https://api.xxx.com/api/v1/app/user/info

SLB 解密出明文 HTTP 报文后进行解析,根据 Host 和 Path,将请求发往不同的集群,例如:

Host                    Path              env
─────────────────────────────────────────────────────────
api.xxx.com             /api/v1/app/*    生产 APP Gateway
api.xxx.com             /api/v1/h5/*     生产 H5 Gateway
api.xxx.com             /api/v1/open/*   生产 Open Gateway

test-api.xxx.com        /api/v1/app/*    测试 APP Gateway
test-api.xxx.com        /api/v1/h5/*     测试 H5 Gateway
test-api.xxx.com        /api/v1/open/*   测试 Open Gateway

当前 GET https://api.xxx.com/api/v1/app/user/info 根据上述规则发往生产环境集群 APP Gateway 。

APP Gateway 结构:

APP Gateway
      │
      ├── APP-GW-1
      ├── APP-GW-2
      ├── APP-GW-3
      └── APP-GW-4

根据负载均衡算法选择其中一个网关, APP-GW-x 网关负责 API 路由 、鉴权 、限流 、traceId等,可以直接讲请求转发到相应的 Service

                    APP Gateway
                         │
         ┌───────────────┼────────────────┐
         ↓               ↓                ↓
    /user/*          /order/*         /product/*
         ↓               ↓                ↓
    User Service    Order Service    Product Service

也可能这里网关不负责 API 路由,做剩下的鉴权等操作,然后转发请求到 internal LB , 做负载均衡转发到不同的 ingress ,由 ingress 做 API 路由分发到不同的 Service。不管是哪种方式,请求总归会转发到 Service ,根据 Service 中维护的 EndpointSlice 记录,讲请求转发到内部 pod。

                         APP Gateway
                             │
                             | 转发请求到 Internal LB
                             |
                             ▼
                    ┌─────────────────┐
                    │  Internal LB    │
                    │ 10.10.20.100    │
                    └────────┬────────┘
                             │
                    负载均衡选择
                             │
             ┌───────────────┼───────────────┐
             ↓               ↓               ↓
          Ingress-1       Ingress-2       Ingress-3
          Controller      Controller      Controller
             │               │               │
             └───────────────┼───────────────┘
                             │
                             │ API 路由
                             ▼
                    ┌─────────────────┐
                    │     Service     │
                    └───────┬─────────┘
                            │
             ┌──────────────┼──────────────┐
             ↓              ↓              ↓
          Service          Service       Service
            User           Order         Product
             │               │              │
             ▼               ▼              ▼
          User Pod        Order Pod      Product Pod

具体网络拓扑

VPC 网段 10.1.0.0/16 | K8s Pod 网段 10.11.0.0/16 | K8s Service 网段 10.111.0.0/16

设施名称 内网 IP 示例 所在环境/载体类型 备注
APP-GW-1 10.1.10.5 ECS 云服务器 不在 K8s 中,直接挂载 VPC 内网网卡
APP-GW-2 10.1.10.6 ECS 云服务器 不在 K8s 中,直接挂载 VPC 内网网卡
Internal LB 10.1.20.100 云厂商内网 SLB 产品 K8s Ingress 的流量入口
Ingress-1 Controller 10.1.30.11 (Node IP)
10.11.1.5 (Pod IP)
K8s 集群 (Worker Node) 通常采用 HostNetwork 模式直接复用宿主机 IP,或通过 NodePort 暴露
Ingress-2 Controller 10.1.30.12 (Node IP)
10.11.1.6 (Pod IP)
K8s 集群 (Worker Node) 部署在另一个 Worker Node 节点上保证高可用
User Service 10.111.1.10 K8s 虚拟ip (ClusterIP) 仅在 K8s 集群内部有效,无法从外部 ping 通
Order Service 10.111.1.20 K8s 虚拟ip (ClusterIP) 同上
User Pod 1 10.11.2.50 K8s Pod ip 网段 (10.11.0.0/16) 容器网络插件分配的 IP,通过 CNI 与 Node 通信
Order Pod 1 10.11.3.100 K8s Pod ip 网段 (10.11.0.0/16) 同上

也可以通过调用云厂商的 API,将 IP 显式地注册到网卡上,将 K8s 的 Pod IP 铺开到 VPC 路由表中( 这样的扁平化网络感觉更好管理 ),铺开的只有 Pod IP,Service clusterIp ,k8s DNS 服务器IP,依旧是逻辑 IP,仅存在于 iptables 规则中。此时 10.11.1.5 也是 VPC 内可寻址的一个 IP。

内网

办公网络(如 192.168.x.x)与云上 VPC(10.1.0.0/16)默认是物理隔离的。企业必须通过 物理专线 (Direct Connect) 或 IPsec VPN 加密隧道 将两端路由器打通。输入内网域名(如 admin.internal.com),该请求由办公网内部的 DNS 服务器将其解析为云上 Internal LB)的私有 IP,在上述的拓扑中为 10.1.20.100。 为了安全与业务隔离,内网访问通常会拥有一套独立于公网的网关或 Ingress 设施:

① Office Client (办公网电脑)
   │ 请求 admin.internal.com
   ▼
② 企业本地路由器 -> 专线 / VPN 加密隧道
   │ 路由转发直达 VPC 内网网段 (10.1.x.x)
   ▼
③ Internal LB (云内网负载均衡, 10.1.20.100)
   │
   ▼
④ Internal Ingress 内网专属 Ingress Controller
   │ API 路由分发 (如 /admin/*)
   ▼
⑤ Admin Service (后台服务的 ClusterIP)
   │
   ▼
⑥ Admin Pod (后台管理业务容器)