网络原理
Kubernetes 网络是集群内部通信的核心机制,它确保了 Pod、Service、Node 之间能够高效、可靠地通信。K8s 网络模型定义了四个基本要求:
- 所有 Pod 都可以在不使用 NAT 的情况下直接通信
- 所有 Node 都可以在不使用 NAT 的情况下与所有 Pod 通信
- Pod 看到的 IP 地址与其它 Pod 看到的该 Pod 的 IP 地址相同
- 每个 Pod 的 IP 都是唯一的,不会与其他 Pod 冲突
网络通信模型
graph TB
subgraph "K8s 集群"
subgraph "Master"
APIS[API Server]
end
subgraph "Node 1"
P1[Pod 1]
P2[Pod 2]
K1[kubelet]
C1[Container Runtime]
PRC1[Pod 网络容器]
end
subgraph "Node 2"
P3[Pod 3]
P4[Pod 4]
K2[kubelet]
C2[Container Runtime]
PRC2[Pod 网络容器]
end
subgraph "网络插件"
NP[CNI 网络插件]
end
subgraph "物理网络"
LB[负载均衡器]
EXTERNAL[外部网络]
end
end
P1 <--> PRC1
P2 <--> PRC1
P3 <--> PRC2
P4 <--> PRC2
PRC1 <--> NP
PRC2 <--> NP
P1 <--> P3
P2 <--> P4
APIS <--> P1
APIS <--> P4
NP <--> LB
LB <--> EXTERNAL
四种网络通信场景
容器到容器
同一个 Pod 内的容器通过 localhost 通信,共享网络命名空间
Pod 到 Pod
不同 Node 上的 Pod 通过底层网络插件实现通信
Pod 到 Service
通过 kube-proxy 和 iptables/iptables 规则实现负载均衡
外部到 Service
通过 NodePort、LoadBalancer 或 Ingress 暴露服务到外部
CNI (Container Network Interface) 插件
| 插件 | 特点 | 适用场景 |
|---|---|---|
| Flannel | 简单易用,支持 VXLAN、UDP 等多种后端 | 中小型集群,简单网络需求 |
| Calico | 基于 BGP 的纯三层网络,支持网络策略 | 对安全和性能要求高的场景 |
| Weave | 自愈能力强,支持网络加密 | 需要网络加密的场景 |
| Cilium | 基于 eBPF,性能优异,支持 L7 策略 | 对性能和安全要求极高的场景 |
Service 网络实现原理
graph LR
subgraph "Client Pod"
C[客户端请求]
end
C --> S[Service Virtual IP]
subgraph "kube-proxy (iptables 模式)"
IP[iptables 规则]
end
S --> IP
IP --> P1[Pod 1]
IP --> P2[Pod 2]
IP --> P3[Pod 3]
subgraph "Endpoints"
EP[Pod IP 列表]
end
EP -.-> IP
ClusterIP 服务通信
- 为 Service 分配集群内部虚拟 IP
- 通过 kube-proxy 实现负载均衡
- 仅集群内部可访问
NodePort 服务通信
- 在每个节点上开放端口
- 外部通过 NodeIP:NodePort 访问
- 实际流量仍路由到 ClusterIP
网络策略 (Network Policy)
graph TD
subgraph "Namespace A"
PA1[Pod A1]
PA2[Pod A2]
end
subgraph "Namespace B"
PB1[Pod B1]
PB2[Pod B2]
end
subgraph "Network Policy"
NP["策略: A1 可访问 B1"]
end
PA1 <--> PB1
PA2 -. "被阻止" .- PB2
PA1 -. "被阻止" .- PB2
PA2 -. "被阻止" .- PB1
NP --> PA1
NP --> PB1
| 策略类型 | 说明 | 配置示例 |
|---|---|---|
| 入口策略 | 控制哪些流量可以进入 Pod | spec.ingress |
| 出口策略 | 控制 Pod 可以访问哪些外部资源 | spec.egress |
| 选择器 | 定义策略适用的 Pod | spec.podSelector |
网络故障排查
# 检查 Pod 网络配置
kubectl exec -it <pod-name> -- ip addr show
# 测试 Pod 间连通性
kubectl exec -it <pod-name> -- ping <target-pod-ip>
# 查看 Service 规则
kubectl get endpoints <service-name>
# 检查 iptables 规则(Node 级别)
sudo iptables -L -t nat | grep KUBE
# 检查网络策略
kubectl get networkpolicy