3. IDP 网络拓扑模型:典型IDP的微服务分层、命名空间隔离策略、南北向与东西向流量模型

内部开发者平台(IDP)的网络拓扑是实施精准网络策略的基础。理解微服务在 Kubernetes 中的分层结构、命名空间的隔离边界以及流量的走向,是 Kyverno 策略编写与故障排查的前提。本节将拆解典型 IDP 的三大网络支柱:微服务分层、命名空间隔离与流量模型。

3.1 微服务分层架构

一个成熟的 IDP 通常将微服务划分为三个逻辑层,每层承担不同的职责并暴露不同的网络接口。这种分层直接决定了网络策略的生效范围。

层级 职责 典型组件 网络暴露方式
入口层(Gateway) 流量接入、TLS 终止、路由分发、限流 Ingress Controller、API Gateway(Kong / APISIX)、Istio Ingress Gateway LoadBalancer Service / NodePort
业务层(Service) 核心业务逻辑、API 聚合、状态协调 BFF(Backend For Frontend)、用户服务、订单服务、工作流引擎 ClusterIP Service(仅集群内可达)
基础设施层(Infra) 数据持久化、消息传递、可观测性 PostgreSQL、Redis、Kafka、Prometheus、Grafana ClusterIP Service / Headless Service
排查提示: 当业务层 Pod 无法连接数据库时,首先检查基础设施层 Service 的端口名称是否与 Kyverno 策略中定义的端口匹配。端口名称不匹配是导致策略误拦截的常见原因。

3.2 命名空间隔离策略

IDP 使用命名空间作为租户隔离和职责边界。典型的命名空间布局遵循“按层 + 按团队”的双重维度,网络策略在此边界上实施“默认拒绝 + 显式允许”。

标准命名空间布局示例:
# 入口层
gateway-prod
gateway-staging

# 业务层(按团队)
team-alpha-prod
team-alpha-staging
team-beta-prod
team-beta-staging

# 基础设施层
infra-monitoring
infra-logging
infra-database

命名空间之间的隔离策略遵循以下原则:

  • 同层同团队: 默认允许(例如 team-alpha-prod 内的 Pod 可以互相通信)。
  • 跨层: 仅允许上层调用下层(Gateway → Service → Infra),禁止反向或横向跨层访问。
  • 跨团队: 严格禁止,除非通过显式的 NetworkPolicy 开放(例如共享的监控 Agent)。
  • 外部访问: 仅入口层命名空间可接收来自集群外部的流量。
常见故障点: 团队在 Staging 环境调试时,经常忘记为临时调试 Pod 添加 app.kubernetes.io/name: debug-tool 标签,导致 Kyverno 生成的 NetworkPolicy 无法匹配该 Pod,从而被默认拒绝规则拦截。务必确保调试 Pod 携带正确的标签。

3.3 南北向与东西向流量模型

理解流量模型是编写精准网络策略的核心。IDP 中的流量分为两大类:南北向流量(外部进入集群)和东西向流量(集群内部服务间调用)。

3.3.1 南北向流量模型

流量从互联网或外部系统进入集群,经过入口层处理后转发至业务层。此路径上需要严格控制入口来源和路径。

  • 入口点: LoadBalancer Service 或 Ingress 资源。
  • 策略关注点: 仅允许特定 CIDR(如公司出口 IP)访问入口层;入口层仅允许转发到业务层的特定端口。
  • 典型策略: 在 gateway-prod 命名空间应用 ipBlock 规则,拒绝所有非白名单来源。

3.3.2 东西向流量模型

流量在集群内部 Pod 之间流动,是微服务架构的主要通信模式。东西向流量必须遵循分层调用原则。

  • 调用链: Gateway → BFF → User Service → Database。
  • 策略关注点: 禁止业务层 Pod 直接访问基础设施层以外的命名空间;禁止业务层 Pod 发起对外部网络的出站连接。
  • 典型策略: 在 team-alpha-prod 命名空间设置 egress 规则,仅允许访问 infra-database 命名空间的 5432 端口。
IDP 南北向与东西向流量拓扑 外部用户 入口层 (Gateway) 业务层 (Service) 基础设施层 (Infra) 东西向流量(集群内) • 入口层 → 业务层(HTTP/gRPC) • 业务层 → 基础设施层(TCP) • 禁止反向调用 • 禁止跨团队直接访问 • 策略:仅允许特定端口/标签 南北向流量(外部) • 外部用户 → 入口层 • 策略:ipBlock + 端口限制 南北向 东西向 东西向

3.4 典型 IDP 网络策略矩阵

基于上述分层和流量模型,可以归纳出一张通用的网络策略矩阵。这张矩阵是 Kyverno 生成策略的蓝图。

源命名空间 目标命名空间 允许的协议/端口 策略类型
gateway-prod team-alpha-prod TCP 8080 (HTTP) Ingress
team-alpha-prod infra-database TCP 5432 (PostgreSQL) Egress
team-alpha-prod infra-monitoring TCP 4318 (OTLP) Egress
team-beta-prod infra-database TCP 5432 Egress
team-alpha-prod team-beta-prod 禁止 默认拒绝
故障排查技巧: 当东西向流量中断时,使用 kubectl describe networkpolicy -n <namespace> 查看策略的 podSelector 和 namespaceSelector 是否匹配目标 Pod。一个常见错误是 namespaceSelector 的标签与命名空间实际标签不一致(例如使用了 team: alpha 但命名空间标签是 team: alpha-prod)。
命名空间隔离与策略矩阵 入口层 (gateway-prod) 业务层 (team-alpha-prod) 业务层 (team-beta-prod) 基础设施层 (infra-database) 基础设施层 (infra-monitoring) 网络策略矩阵(允许规则) 1. gateway-prod → team-alpha-prod : TCP 8080 2. team-alpha-prod → infra-database : TCP 5432 3. team-alpha-prod → infra-monitoring : TCP 4318 4. team-beta-prod → infra-database : TCP 5432 5. team-alpha-prod → team-beta-prod : 禁止 6. 所有出站到外部网络 : 禁止(除 Gateway) 7. 默认规则 : 拒绝所有未显式允许的流量 策略生效顺序:默认拒绝 → 显式允许

3.5 流量模型对 Kyverno 策略的影响

理解上述拓扑后,可以总结出 Kyverno 在生成 NetworkPolicy 时的几个关键映射关系:

  • 南北向策略: 通常作用于 Ingress 规则,使用 ipBlock 限制外部来源,使用 namespaceSelector 限制内部目标。
  • 东西向策略: 通常作用于 Egress 规则,使用 namespaceSelector + podSelector 的组合来精确控制服务间调用。
  • 分层隔离: 通过 namespaceSelector.matchLabels 中的层级标签(如 layer: service)来实现批量策略生成。
  • 故障排查切入点: 当流量被拦截时,优先检查目标 Pod 的标签是否与策略中的 podSelector 匹配,以及目标命名空间是否包含策略所需的标签。
Kyverno 策略生成示例(东西向 Egress):
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: restrict-egress-to-infra
spec:
  rules:
  - name: allow-team-alpha-to-database
    match:
      resources:
        kinds:
        - Namespace
        selector:
          matchLabels:
            team: alpha
            layer: service
    generate:
      kind: NetworkPolicy
      name: allow-egress-to-database
      namespace: "{{request.object.metadata.name}}"
      data:
        spec:
          podSelector: {}
          policyTypes:
          - Egress
          egress:
          - to:
            - namespaceSelector:
                matchLabels:
                  layer: infra
              podSelector:
                matchLabels:
                  app: postgres
            ports:
            - protocol: TCP
              port: 5432

通过将 IDP 的网络拓扑模型固化为上述矩阵和策略模板,Kyverno 可以自动为每个新创建的命名空间生成符合隔离要求的 NetworkPolicy,大幅减少人工配置错误,并为后续的故障排查提供清晰的策略基线。