Kubernetes网络模型与CNI插件详解
// 目录 · contents
前言
网络是Kubernetes中最复杂的子系统之一。Kubernetes定义了一套简洁而强大的网络模型,而具体实现则委托给CNI插件。本文将从Pod网络、Service网络、Ingress到CNI插件逐层剖析。
Kubernetes网络模型基本原则
Kubernetes网络模型建立在三个基本原则之上:
- 每个Pod拥有独立的IP地址
- 所有Pod之间可以直接通信,无需NAT
- 节点上的Agent(如kubelet)可以与该节点上的所有Pod通信
graph TB
subgraph Cluster["Kubernetes Cluster"]
subgraph Node1["Node 1"]
P1["Pod A<br>10.244.1.2"]
P2["Pod B<br>10.244.1.3"]
end
subgraph Node2["Node 2"]
P3["Pod C<br>10.244.2.2"]
P4["Pod D<br>10.244.2.3"]
end
SVC["Service<br>10.96.0.100"]
end
External["External Client"] --> SVC
P1 <-->|"直接路由<br>无NAT"| P3
P2 <-->|"直接路由<br>无NAT"| P4
SVC --> P1
SVC --> P3
Pod网络
Pod内部网络
同一Pod内的容器共享Network
Namespace,因此可以通过localhost互相通信。这是通过pause容器(又称infra容器)实现的。
graph TB
subgraph Pod["Pod (10.244.1.2)"]
Pause["pause容器<br>持有Network Namespace"]
App["应用容器<br>localhost:8080"]
Sidecar["Sidecar容器<br>localhost:9090"]
end
Pause -.-> |"共享网络命名空间"| App
Pause -.-> |"共享网络命名空间"| Sidecar
App <-.-> |"localhost通信"| Sidecar
1 | |
Pod间网络(同节点)
同一节点上的Pod通过虚拟网桥(如cbr0或cni0)直接通信:
graph TB
subgraph Node["Node 1"]
P1["Pod A<br>veth1 - 10.244.1.2"]
P2["Pod B<br>veth2 - 10.244.1.3"]
Bridge["cni0 / cbr0<br>10.244.1.1"]
ETH["eth0<br>192.168.1.10"]
end
P1 --> |veth pair| Bridge
P2 --> |veth pair| Bridge
Bridge --> ETH
style Bridge fill:#FF9800,color:#fff
1 | |
Pod间网络(跨节点)
跨节点的Pod通信需要CNI插件来实现,通常采用Overlay(封装)或Underlay(路由)方案:
graph TB
subgraph Node1["Node 1 (192.168.1.10)"]
PA["Pod A<br>10.244.1.2"]
BR1["cni0"]
ETH1["eth0"]
end
subgraph Node2["Node 2 (192.168.1.11)"]
PB["Pod B<br>10.244.2.2"]
BR2["cni0"]
ETH2["eth0"]
end
PA --> BR1
BR1 --> ETH1
ETH1 <-->|"VXLAN隧道<br>或BGP路由"| ETH2
ETH2 --> BR2
BR2 --> PB
Service网络
Service为一组Pod提供稳定的访问入口和负载均衡。
Service类型
graph LR
subgraph Types["Service类型"]
CIP["ClusterIP<br>集群内部访问"]
NP["NodePort<br>节点端口暴露"]
LB["LoadBalancer<br>云负载均衡"]
EI["ExternalName<br>CNAME映射"]
end
CIP --> |"默认"| Internal["集群内部流量"]
NP --> |"30000-32767"| NodeAccess["节点IP:端口"]
LB --> |"云厂商LB"| ExtLB["外部负载均衡"]
EI --> |"DNS CNAME"| ExtDNS["外部DNS"]
1 | |
Service发现机制
Kubernetes提供两种Service发现方式:
1. 环境变量:kubelet在创建Pod时注入Service信息
1 | |
2. DNS(推荐):CoreDNS为每个Service创建DNS记录
1 | |
EndpointSlice
Kubernetes 1.21+默认使用EndpointSlice替代Endpoints,提供更好的可扩展性:
1 | |
Ingress
Ingress提供HTTP/HTTPS层的路由规则,将外部请求路由到内部Service:
graph LR
Client["客户端"] --> LB["Load Balancer"]
LB --> IC["Ingress Controller"]
IC --> |"api.example.com"| SVC1["API Service"]
IC --> |"web.example.com"| SVC2["Web Service"]
IC --> |"*.example.com/admin"| SVC3["Admin Service"]
SVC1 --> P1["Pod"]
SVC1 --> P2["Pod"]
SVC2 --> P3["Pod"]
SVC3 --> P4["Pod"]
1 | |
Gateway API(Ingress的继任者)
Kubernetes Gateway API是新一代的入口流量管理标准,提供更丰富的功能:
1 | |
CNI插件详解
Calico
Calico使用BGP协议实现三层路由,支持高性能的无封装网络:
graph TB
subgraph Node1["Node 1"]
PA["Pod A<br>10.244.1.2"]
BIRD1["BIRD<br>BGP Agent"]
FW1["Felix<br>iptables/eBPF"]
end
subgraph Node2["Node 2"]
PB["Pod B<br>10.244.2.2"]
BIRD2["BIRD<br>BGP Agent"]
FW2["Felix<br>iptables/eBPF"]
end
BIRD1 <-->|"BGP Peering"| BIRD2
PA --> FW1 --> BIRD1
BIRD2 --> FW2 --> PB
1 | |
Flannel
Flannel是最简单的CNI插件,适合小型集群和学习环境:
1 | |
Cilium
Cilium基于eBPF技术,提供高性能网络和安全能力:
graph TB
subgraph CiliumArch["Cilium架构"]
Agent["Cilium Agent"]
Operator["Cilium Operator"]
Hubble["Hubble<br>可观测性"]
subgraph DataPlane["eBPF数据平面"]
TC["TC Hook<br>流量控制"]
XDP["XDP Hook<br>高速路径"]
Socket["Socket Hook<br>L7策略"]
end
end
Agent --> TC
Agent --> XDP
Agent --> Socket
Hubble --> Agent
Operator --> Agent
1 | |
CNI插件对比
| 特性 | Calico | Flannel | Cilium |
|---|---|---|---|
| 网络模式 | BGP/VXLAN/IPIP | VXLAN/Host-GW | eBPF/VXLAN |
| Network Policy | 完整支持 | 不支持 | L3-L7全支持 |
| 性能 | 高 | 中 | 很高 |
| 加密 | WireGuard | 不支持 | WireGuard/IPsec |
| 可观测性 | 基本 | 无 | Hubble |
| 复杂度 | 中 | 低 | 高 |
| 适用场景 | 大规模生产 | 学习/小集群 | 高性能/安全要求高 |
Network Policy
Network Policy是Kubernetes原生的网络安全策略,用于控制Pod间的流量:
1 | |
graph LR
subgraph Allowed["允许的流量"]
FE["Frontend Pod"] -->|":8080"| BE["Backend Pod"]
BE -->|":5432"| DB["Database Pod"]
end
subgraph Denied["拒绝的流量"]
FE -.->|"X"| DB
External["External"] -.->|"X"| BE
end
style Denied fill:#ffebee
style Allowed fill:#e8f5e9
故障排查
常见网络问题的排查方法:
1 | |
总结
Kubernetes网络模型通过分层抽象(Pod网络 -> Service网络 -> Ingress),将复杂的网络问题分解为可管理的层次。选择CNI插件时需要考虑集群规模、性能要求、安全需求和运维复杂度。对于生产环境,Calico和Cilium是最常见的选择,前者成熟稳定,后者基于eBPF技术代表了未来方向。