基于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 工作流程
- Pod 调度:Kubelet 检测到新 Pod 被调度到本节点。
- 创建网络命名空间:Kubelet 为 Pod 创建独立的网络命名空间。
- 调用 CNI 插件:Kubelet 根据配置(
cni.conf)调用对应的 CNI 可执行文件。 - 分配 IP 地址:CNI 插件从 IP 地址管理(IPAM)模块获取一个可用 IP。
- 配置网络接口:CNI 插件在 Pod 网络命名空间中创建 veth 对,并将一端连接到宿主机网桥或底层网络。
- 返回结果: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。
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 路径等应用层访问。
4.6 本章小结
Kubernetes 网络模型通过 CNI 插件实现灵活的 Pod 网络,通过 Service 网络提供稳定的服务发现与负载均衡,通过 Ingress / Gateway API 管理南北向流量,并通过 NetworkPolicy 实现细粒度的安全隔离。在多租户场景下,理解这些组件的协同工作方式,是设计高可用、高性能、安全隔离的网络拓扑的基础。