Kubernetes 网络模型
学习目标
- 理解 Kubernetes 网络模型的基本原则
- 掌握 Pod 间、节点间、集群外通信的网络要求
- 了解 Kubernetes 网络模型与其他网络方案的区别
核心概念
一句话解释
Kubernetes 网络模型定义了 Pod、节点和外部服务之间通信的基本规则,核心原则是每个 Pod 都有一个唯一的 IP 地址。
网络模型三大原则
原则 1:每个 Pod 有一个唯一的 IP 地址
┌─────────────────────────────────────────┐
│ Node 1 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Pod A │ │ Pod B │ │ Pod C │ │
│ │ 10.1.1.2│ │ 10.1.1.3│ │ 10.1.1.4│ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────┘
原则 2:所有 Pod 可以不经过 NAT 直接通信
┌─────────────────────────────────────────────────────┐
│ Kubernetes 集群 │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ Node 1 │ │ Node 2 │ │
│ │ ┌─────┐ ┌─────┐ │ │ ┌─────┐ ┌─────┐ │ │
│ │ │Pod A│ │Pod B│ │ │ │Pod C│ │Pod D│ │ │
│ │ └──┬──┘ └──┬──┘ │ │ └──┬──┘ └──┬──┘ │ │
│ └─────┼────────┼──────┘ └─────┼────────┼──────┘ │
│ └────────┴────────────────┴────────┘ │
│ 直接通信,无需 NAT │
└─────────────────────────────────────────────────────┘
原则 3:节点上的 Agent 可以与该节点上所有 Pod 通信
┌─────────────────────────────────────────┐
│ Node │
│ ┌─────────────────────────────────────┐│
│ │ kubelet, kube-proxy ││
│ │ ↓ 直接通信 ││
│ │ ┌─────┐ ┌─────┐ ┌─────┐ ││
│ │ │Pod A│ │Pod B│ │Pod C│ ││
│ │ └─────┘ └─────┘ └─────┘ ││
│ └─────────────────────────────────────┘│
└─────────────────────────────────────────┘
网络通信场景
| 场景 | 说明 | 实现方式 |
|---|---|---|
| Pod-to-Pod | 同一节点 Pod 间通信 | 通过网桥直接通信 |
| Pod-to-Pod | 不同节点 Pod 间通信 | CNI 插件实现(如 VXLAN、BGP) |
| Pod-to-Service | Pod 访问 Service | kube-proxy + iptables/IPVS |
| External-to-Service | 外部访问 Service | NodePort / LoadBalancer / Ingress |
与 Docker 网络对比
| 方面 | Docker 默认网络 | Kubernetes 网络模型 |
|---|---|---|
| IP 分配 | 每个容器有自己的 IP | 每个 Pod 有唯一的 IP |
| 通信方式 | 需要端口映射 | 直接通信,无需 NAT |
| 跨节点 | 需要额外配置 | CNI 插件自动实现 |
| 服务发现 | 无 | 内置 Service + DNS |
网络模型实现
Kubernetes 网络模型是规范,不是实现
需要 CNI 插件来实现:
┌─────────────────────────────────────────────────────┐
│ Kubernetes │
│ ↓ │
│ CNI (容器网络接口) │
│ ┌───────────┼───────────┐ │
│ ↓ ↓ ↓ │
│ ┌───────┐ ┌────────┐ ┌────────┐ │
│ │ Calico│ │ Flannel│ │ Cilium│ │
│ └───────┘ └────────┘ └────────┘ │
└─────────────────────────────────────────────────────┘
实践练习
练习 1:理解网络模型
回答以下问题:
- Kubernetes 网络模型的三大原则是什么?
- 为什么 Kubernetes 要求 Pod 间可以直接通信而不经过 NAT?
- CNI 插件的作用是什么?
练习 2:查看 Pod 网络
# 创建测试 Pod
kubectl run test-pod --image=nginx --dry-run=client -o yaml > pod.yaml
kubectl apply -f pod.yaml
# 查看 Pod IP
kubectl get pod test-pod -o wide
# 进入 Pod 查看网络配置
kubectl exec -it test-pod -- ip addr
kubectl exec -it test-pod -- cat /etc/resolv.conf
练习 3:测试 Pod 间通信
# 创建两个 Pod
kubectl run pod-a --image=busybox --command -- sleep 3600
kubectl run pod-b --image=nginx
# 获取 Pod B 的 IP
POD_B_IP=$(kubectl get pod pod-b -o jsonpath='{.status.podIP}')
# 从 Pod A 访问 Pod B
kubectl exec pod-a -- wget -qO- http://$POD_B_IP
常见误解
1. Kubernetes 网络模型是具体的实现
错误理解:Kubernetes 自己实现了网络
正确理解:Kubernetes 定义了网络规范,由 CNI 插件实现
2. Pod IP 是稳定的
错误理解:Pod IP 永远不变
正确理解:Pod 重建后 IP 会变化,所以需要 Service
Pod 重启/重建 → IP 变化 → Service 提供稳定入口
小结
| 要点 | 说明 |
|---|---|
| 网络模型 | 定义 Pod、节点、外部通信规则 |
| 核心原则 | Pod 唯一 IP、无 NAT 直接通信 |
| 实现方式 | 通过 CNI 插件实现 |
| 通信场景 | Pod-to-Pod、Pod-to-Service、External-to-Service |
| 与 Docker 对比 | Kubernetes 网络更简单,无需端口映射 |
练习编辑器
bash
Loading...