2. Kubernetes 网络模型精讲:Pod网络、Service网络、Ingress网络、CNI插件原理
Kubernetes 网络模型是 Serverless 集群的通信基石。本章深入剖析 Pod 网络、Service 网络、Ingress 网络三层模型,并详解 Calico 与 Flannel 两种主流 CNI 插件的实现原理与性能差异。
2.1 Kubernetes 网络模型核心原则
Kubernetes 对集群网络提出了四个必须满足的约束,所有 CNI 插件都必须遵循:
- Pod 间直接通信:任意 Pod 之间无需 NAT 即可通过 IP 地址直接通信。
- Node 与 Pod 直接通信:节点上的 kubelet 可以直接访问该节点上的 Pod。
- Pod 内容器共享网络:同一 Pod 内的所有容器共享同一个网络命名空间(IP 和端口)。
- 无端口映射:用户无需手动映射主机端口到容器端口。
2.2 Pod 网络:集群通信的最小单元
Pod 是 Kubernetes 中可调度的最小单元,每个 Pod 拥有一个独立的 IP 地址。Pod 网络的核心是 容器网络接口(CNI),它负责在 Pod 创建时分配 IP 并配置网络。
2.2.1 Pod 网络通信模型
Pod 网络通信分为三种场景:
| 通信场景 | 通信路径 | 是否经过 NAT |
|---|---|---|
| 同节点 Pod ↔ Pod | 通过节点上的网桥(如 cbr0)直接二层转发 | 否 |
| 跨节点 Pod ↔ Pod | 通过节点路由表或隧道(VXLAN/IPIP)转发 | 否(但可能封装) |
| Pod ↔ 集群外服务 | 通过节点 iptables 规则进行 SNAT | 是(源 IP 被替换为节点 IP) |
2.3 Service 网络:稳定的服务发现与负载均衡
Pod 的 IP 是动态变化的,Service 提供了一组稳定的虚拟 IP(ClusterIP)和 DNS 名称,用于访问一组 Pod。Service 网络的核心组件是 kube-proxy,它通过 iptables、IPVS 或 userspace 模式实现负载均衡。
2.3.1 Service 类型对比
| Service 类型 | 访问范围 | 典型用途 | 是否支持外部流量 |
|---|---|---|---|
| ClusterIP | 集群内部 | 内部微服务通信 | 否 |
| NodePort | 集群外部(通过节点端口) | 开发调试、简单对外暴露 | 是(通过节点 IP:Port) |
| LoadBalancer | 集群外部(通过云负载均衡器) | 生产环境对外暴露 | 是(自动分配 LB IP) |
| ExternalName | 集群内部(DNS CNAME) | 将外部服务映射为集群内服务 | 否(仅 DNS 映射) |
2.3.2 kube-proxy 模式对比
| 模式 | 实现方式 | 性能 | 适用场景 |
|---|---|---|---|
| iptables | 内核 Netfilter 规则链 | 中等(规则多时延迟增加) | 中小规模集群(< 5000 服务) |
| IPVS | 内核 LVS 模块,哈希表查找 | 高(O(1) 时间复杂度) | 大规模集群(> 5000 服务) |
| userspace | 用户态代理(已弃用) | 低 | 不推荐 |
2.4 Ingress 网络:集群入口的统一网关
Ingress 是 Kubernetes 的 API 对象,用于管理集群外部访问集群内服务的 HTTP/HTTPS 路由。Ingress 网络位于 Service 网络之上,提供七层负载均衡、SSL 终止、虚拟主机路由等功能。
2.4.1 Ingress 架构
Ingress 控制器(如 Nginx Ingress、Traefik、HAProxy)作为反向代理运行在集群中,监听 Ingress 资源的变化并动态更新路由规则。
# 一个典型的 Ingress 配置示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: serverless-app-ingress
spec:
ingressClassName: nginx
rules:
- host: api.serverless.example.com
http:
paths:
- path: /v1
pathType: Prefix
backend:
service:
name: api-v1-service
port:
number: 80
- path: /v2
pathType: Prefix
backend:
service:
name: api-v2-service
port:
number: 80
tls:
- hosts:
- api.serverless.example.com
secretName: tls-secret
2.4.2 Ingress 与 Service 的关系
- Ingress 不替代 Service:Ingress 负责七层路由,Service 负责四层负载均衡。
- 典型流量路径:客户端 → Ingress Controller → Service(ClusterIP)→ Pod。
- 性能优化:Ingress Controller 应使用 hostNetwork 模式或 LoadBalancer 类型 Service 暴露,避免二次转发。
2.5 CNI 插件原理:Calico 与 Flannel
CNI(Container Network Interface)是 Kubernetes 网络插件的标准接口。Calico 和 Flannel 是两种最主流的 CNI 插件,它们在网络模型、性能、安全策略方面有显著差异。
2.5.1 Flannel:简单高效的覆盖网络
Flannel 由 CoreOS 开发,采用 覆盖网络(Overlay Network) 模型,为每个节点分配一个子网,Pod 的 IP 从该子网中分配。Flannel 支持多种后端:
| 后端类型 | 封装方式 | 性能 | 适用场景 |
|---|---|---|---|
| VXLAN | UDP 封装(内核 VXLAN) | 中等(约 10% 性能损耗) | 大多数场景,跨网段通信 |
| host-gw | 直接路由(无封装) | 高(接近原生性能) | 节点二层可达的场景 |
| UDP | 用户态 UDP 封装 | 低 | 不推荐(已弃用) |
2.5.2 Calico:高性能的网络策略引擎
Calico 采用 纯三层路由模型,不使用隧道封装,通过 BGP(边界网关协议)在节点间分发路由。Calico 的核心优势在于其强大的 网络策略 能力。
| 特性 | Calico | Flannel |
|---|---|---|
| 网络模型 | 纯三层路由(BGP) | 覆盖网络(VXLAN/host-gw) |
| 封装开销 | 无(直接路由) | 有(VXLAN 约 50 字节头部) |
| 网络策略 | 支持(基于 iptables/eBPF) | 不支持 |
| 性能 | 高(接近原生) | 中等(VXLAN 模式) |
| 部署复杂度 | 中等(需 BGP 配置) | 低(一键部署) |
| 大规模集群 | 优秀(支持 1000+ 节点) | 良好(需注意 etcd 压力) |
2.5.3 Calico 与 Flannel 架构对比
2.6 CNI 插件选型建议
在 Serverless 集群中,CNI 插件的选择直接影响 Pod 启动速度、网络延迟和安全隔离能力。
| 场景 | 推荐 CNI | 理由 |
|---|---|---|
| 需要网络策略(多租户隔离) | Calico | 原生支持 NetworkPolicy,基于 iptables/eBPF 实现 |
| 追求极致性能(低延迟) | Calico(BGP 模式) | 无封装开销,接近原生网络性能 |
| 快速部署、简单运维 | Flannel(VXLAN) | 一键部署,无需 BGP 基础设施 |
| 大规模集群(> 500 节点) | Calico | BGP 路由收敛快,支持大规模路由表 |
| 混合云/多云环境 | Flannel(VXLAN) | 覆盖网络不受底层网络限制 |
2.7 网络性能优化要点
针对 Serverless 集群的网络性能优化,以下是最关键的实践:
- 使用 IPVS 模式:kube-proxy 使用 IPVS 替代 iptables,降低 Service 规则匹配延迟。
- 启用 eBPF:Calico 支持 eBPF 数据面,可替代 iptables,大幅提升网络策略性能。
- 调整 MTU:VXLAN 模式需将 MTU 设置为 1450(减去 50 字节头部),避免分片。
- 使用 hostNetwork:对延迟敏感的应用(如 Ingress Controller)使用 hostNetwork 模式。
- 优化 DNS:使用 NodeLocal DNSCache 减少 DNS 查询延迟。
2.8 本章小结
Kubernetes 网络模型由 Pod 网络、Service 网络、Ingress 网络三层构成,每层解决不同的通信问题。CNI 插件是实现 Pod 网络的关键组件,Calico 和 Flannel 分别代表了“高性能+策略”和“简单易用”两种设计哲学。在 Serverless 集群中,建议根据安全需求、性能要求和运维能力综合选择 CNI 插件,并针对性地进行网络优化。