基于Argo CD的多租户网络拓扑项目部署与性能优化 - 第4节

4.1 Kubernetes 网络模型核心原则

Kubernetes 网络模型定义了集群内所有组件(Pod、节点、Service)之间通信的基础规则。其核心原则可概括为“三无”模型:

  • Pod 间无需 NAT 直接通信:每个 Pod 拥有独立的 IP 地址,集群内任意 Pod 可以直接通过该 IP 访问另一个 Pod,无需地址转换。
  • 节点与 Pod 间无需 NAT 直接通信:节点上的 Agent(如 kubelet)可以直接通过 Pod IP 访问该节点上的 Pod。
  • Pod 内部容器共享网络栈:同一 Pod 内的多个容器共享同一个网络命名空间(IP 地址、端口、网络栈),通过 localhost 通信。

这一模型简化了应用从传统部署到容器化部署的迁移,使得 Pod 在网络上被视为“虚拟机”或“物理机”的等价物。

设计哲学:Kubernetes 网络模型不强制绑定任何特定的网络实现,而是通过 CNI(Container Network Interface)插件机制,允许用户根据基础设施需求选择最合适的网络方案。

4.2 CNI(Container Network Interface)原理

CNI 是 Kubernetes 与网络插件之间的标准接口协议。它定义了一组规范,用于配置和清理容器网络。Kubelet 在创建 Pod 时,会调用 CNI 插件完成网络接口的创建、IP 地址分配以及路由规则配置。

4.2.1 CNI 工作流程

  1. Pod 调度:Kubelet 检测到新 Pod 被调度到本节点。
  2. 创建网络命名空间:Kubelet 为 Pod 创建独立的网络命名空间。
  3. 调用 CNI 插件:Kubelet 根据配置(cni.conf)调用对应的 CNI 可执行文件。
  4. 分配 IP 地址:CNI 插件从 IP 地址管理(IPAM)模块获取一个可用 IP。
  5. 配置网络接口:CNI 插件在 Pod 网络命名空间中创建 veth 对,并将一端连接到宿主机网桥或底层网络。
  6. 返回结果:CNI 插件将接口信息、IP 地址、DNS 配置等返回给 Kubelet。

4.2.2 主流 CNI 插件对比

插件名称 网络模式 数据面 多租户隔离 性能特点
Calico 纯三层(BGP) Linux 路由 / eBPF 支持(NetworkPolicy) 高吞吐,低延迟,大规模集群
Flannel Overlay(VXLAN) 内核封包 基础 简单易用,性能损耗约 10-15%
Cilium eBPF 原生 eBPF 程序 高级(L3-L7 策略) 极低延迟,可观测性强
Weave Net Overlay(VXLAN / fastdp) 用户态 / 内核 支持 加密通信,跨云友好

4.3 Pod 网络与 Service 网络

Kubernetes 集群中存在两个独立的网络地址空间:Pod 网络和Service 网络。理解两者的区别与交互是网络拓扑设计的基础。

4.3.1 Pod 网络

  • 地址范围:由 CNI 插件分配的私有 IP 段(如 10.244.0.0/16)。
  • 生命周期:Pod 重启或重建时,IP 地址会变化。
  • 通信范围:集群内所有 Pod 之间可以直接路由。
  • 实现方式:依赖 CNI 插件在节点间建立路由或 Overlay 隧道。

4.3.2 Service 网络

  • 地址范围:独立的虚拟 IP 段(如 10.96.0.0/12),仅在集群内部可达。
  • 稳定性:Service IP 是虚拟的,不会随后端 Pod 变化而改变。
  • 负载均衡:kube-proxy 通过 iptables、IPVS 或 eBPF 将 Service IP 的请求转发到后端 Pod。
  • 服务发现:CoreDNS 将 Service 名称解析为 Service IP。
关键区别:Pod 网络是“真实”的 L3 网络,数据包直接到达 Pod 网卡;Service 网络是“虚拟”的 L4 负载均衡抽象层,数据包经过 DNAT 规则转发后才到达 Pod。
Kubernetes 网络模型:Pod 网络与 Service 网络交互 Pod 网络 (10.244.0.0/16) Pod A 10.244.1.2 Pod B 10.244.2.3 Pod C 10.244.1.5 Pod D 10.244.3.1 CNI 插件:Calico / Flannel / Cilium 节点间路由 / Overlay 隧道 Pod IP 动态分配,生命周期短 kube-proxy DNAT 转发 Service 网络 (10.96.0.0/12) Service: my-app ClusterIP: 10.96.1.10 Service: db ClusterIP: 10.96.2.20 Service: cache ClusterIP: 10.96.3.30 CoreDNS 解析:my-app → 10.96.1.10

4.4 Ingress 与 Gateway API

当需要将集群内部的服务暴露到集群外部时,Kubernetes 提供了多种抽象层。Ingress 是传统的 L7 入口网关资源,而 Gateway API 是新一代的、更灵活、更具表达力的入口管理标准。

4.4.1 Ingress 核心概念

  • Ingress Controller:实际处理流量的反向代理(如 Nginx、Traefik、HAProxy),运行在集群中。
  • Ingress 资源:定义路由规则的 YAML 对象,包括域名、路径、后端 Service 及端口。
  • TLS 终止:Ingress 可以配置 SSL 证书,在入口处解密 HTTPS 流量。
  • 虚拟主机路由:基于 Host 头部将不同域名路由到不同 Service。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-tenant-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - tenant-a.example.com
    secretName: tenant-a-tls
  rules:
  - host: tenant-a.example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: tenant-a-api
            port:
              number: 8080
  - host: tenant-b.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tenant-b-web
            port:
              number: 80

4.4.2 Gateway API 核心概念

Gateway API 将入口配置拆分为三个独立角色,更适合多团队、多租户场景:

资源类型 角色 职责
Gateway 基础设施管理员 定义监听端口、TLS 配置、网关类型(如负载均衡器)
HTTPRoute 应用开发者 定义路由规则(域名、路径匹配、后端转发、重试、超时)
ReferenceGrant 安全管理员 控制跨命名空间的资源引用权限
迁移建议:对于新建的多租户项目,建议优先采用 Gateway API。它原生支持“策略附加”(Policy Attachment)机制,可以更精细地控制每个租户的流量治理、速率限制和安全策略,避免 Ingress 中大量使用 annotation 导致的配置混乱。

4.5 网络策略(NetworkPolicy)原理

NetworkPolicy 是 Kubernetes 原生的网络安全控制机制,用于定义 Pod 组之间的通信规则。它工作在 L3/L4 层,通过标签选择器(Label Selector)来指定策略的生效范围。

4.5.1 策略模型

  • Pod 选择器:通过 podSelector 指定策略应用于哪些 Pod。
  • 入站规则(Ingress):定义允许访问目标 Pod 的源(IP 段、命名空间、Pod 标签)。
  • 出站规则(Egress):定义目标 Pod 允许访问的外部目标。
  • 策略类型:Ingress、Egress 或两者兼有。
  • 默认拒绝:一旦在命名空间中应用了任何 NetworkPolicy,未显式允许的流量将被拒绝。

4.5.2 多租户隔离示例

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: tenant-isolation
  namespace: tenant-a
spec:
  podSelector:
    matchLabels:
      tenant: a
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          tenant: a
    - podSelector:
        matchLabels:
          app: api-gateway
    ports:
    - protocol: TCP
      port: 8080
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          tenant: a
    ports:
    - protocol: TCP
      port: 5432
多租户最佳实践:结合 CNI 插件(如 Calico 或 Cilium)的全局网络策略(GlobalNetworkPolicy),可以在集群层面强制实施租户隔离基线,防止租户 A 的 Pod 意外访问租户 B 的资源。同时,利用 Cilium 的 L7 策略,可以进一步控制 HTTP 方法、API 路径等应用层访问。
NetworkPolicy 多租户隔离拓扑 Namespace: tenant-a API Pod app: api-gateway DB Pod tenant: a Worker Pod tenant: a NetworkPolicy Ingress + Egress Namespace: tenant-b Web Pod tenant: b Cache Pod tenant: b NetworkPolicy 默认拒绝 ✗ 跨租户访问被拒绝 ✓ 同租户内允许

4.6 本章小结

Kubernetes 网络模型通过 CNI 插件实现灵活的 Pod 网络,通过 Service 网络提供稳定的服务发现与负载均衡,通过 Ingress / Gateway API 管理南北向流量,并通过 NetworkPolicy 实现细粒度的安全隔离。在多租户场景下,理解这些组件的协同工作方式,是设计高可用、高性能、安全隔离的网络拓扑的基础。