Skip to content

Kubernetes 网络模型

核心网络要求

Kubernetes 网络模型有三条基本规则:

  1. Pod 间通信:所有 Pod 可以直接通信,无需 NAT
  2. Node 到 Pod:节点可以直接访问任意 Pod,无需 NAT
  3. 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 插件对比

插件实现方式网络策略性能适用场景
FlannelVXLAN/host-gw不支持简单场景
CalicoBGP/VXLAN支持生产环境
CiliumeBPF支持(L7)极高高性能/安全
WeaveVXLAN支持多云
CanalFlannel+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/24

DNS 解析

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.2
bash
# 测试 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

本站内容由 褚成志 整理编写,仅供学习参考