Kubernetes 网络模型
核心网络要求
Kubernetes 网络模型有三条基本规则:
- Pod 间通信:所有 Pod 可以直接通信,无需 NAT
- Node 到 Pod:节点可以直接访问任意 Pod,无需 NAT
- Pod 看到的 IP:Pod 看到自己的 IP 与其他 Pod 看到的一致(无 NAT)
网络层次
┌─────────────────────────────────────────────────────┐
│ 集群外部流量 │
│ LoadBalancer / NodePort │
└──────────────────────┬──────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────┐
│ Service 网络 │
│ ClusterIP: 10.96.0.0/12 │
│ kube-proxy 维护 iptables/ipvs 规则 │
└──────────────────────┬──────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────┐
│ Pod 网络 │
│ Pod CIDR: 10.244.0.0/16 │
│ CNI 插件负责实现(Calico/Cilium/Flannel) │
└──────────────────────┬──────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────┐
│ 节点网络 │
│ Node IP: 192.168.1.0/24 │
└─────────────────────────────────────────────────────┘Pod 网络实现原理
每个 Pod 有独立的网络命名空间,通过 veth pair 连接到节点网桥:
Pod A (10.244.1.2) Pod B (10.244.1.3)
│ │
eth0 eth0
│ veth pair │ veth pair
veth0 veth1
│ │
└──────────── cni0 ──────────┘
│ (Linux Bridge / eBPF)
│
Node eth0 (192.168.1.1)
│
跨节点路由(BGP/VXLAN/eBPF)
│
Node eth0 (192.168.1.2)
│
cni0 (10.244.2.1)
│
Pod C (10.244.2.2)CNI 插件对比
| 插件 | 实现方式 | 网络策略 | 性能 | 适用场景 |
|---|---|---|---|---|
| Flannel | VXLAN/host-gw | 不支持 | 中 | 简单场景 |
| Calico | BGP/VXLAN | 支持 | 高 | 生产环境 |
| Cilium | eBPF | 支持(L7) | 极高 | 高性能/安全 |
| Weave | VXLAN | 支持 | 中 | 多云 |
| Canal | Flannel+Calico | 支持 | 中 | 折中方案 |
IP 地址规划
yaml
# kubeadm 初始化时指定
kubeadm init \
--pod-network-cidr=10.244.0.0/16 \ # Pod 网络
--service-cidr=10.96.0.0/12 # Service 网络
# 节点 Pod CIDR 分配(每个节点 /24,支持 254 个 Pod)
# node1: 10.244.1.0/24
# node2: 10.244.2.0/24
# node3: 10.244.3.0/24DNS 解析
CoreDNS 提供集群内 DNS 服务:
# Service DNS 格式
<service-name>.<namespace>.svc.cluster.local
# Pod DNS 格式(需要 subdomain)
<pod-ip-dashes>.<namespace>.pod.cluster.local
# 示例
my-service.default.svc.cluster.local → 10.96.100.1
10-244-1-2.default.pod.cluster.local → 10.244.1.2bash
# 测试 DNS 解析
kubectl run dns-test --image=busybox --rm -it -- nslookup kubernetes.default
kubectl run dns-test --image=busybox --rm -it -- nslookup my-service.production网络排查工具
bash
# 查看 Pod 网络信息
kubectl exec my-pod -- ip addr
kubectl exec my-pod -- ip route
kubectl exec my-pod -- cat /etc/resolv.conf
# 测试 Pod 间连通性
kubectl exec pod-a -- ping 10.244.2.5
kubectl exec pod-a -- curl http://my-service:8080
# 抓包分析
kubectl exec my-pod -- tcpdump -i eth0 -n port 8080
# 查看 iptables 规则
iptables -t nat -L KUBE-SERVICES -n --line-numbers
iptables -t nat -L KUBE-SVC-XXXX -n
# 查看 ipvs 规则
ipvsadm -Ln