Pod 网络
学习目标
- 理解 Pod 内部容器如何共享网络命名空间
- 掌握 Pod 网络的实现原理
- 了解 Pod 间通信的机制
核心概念
一句话解释
Pod 内的所有容器共享同一个网络命名空间,它们可以通过 localhost 直接通信,共享同一个 IP 地址和端口空间。
Pod 内部网络
Pod 网络架构:
┌─────────────────────────────────────────┐
│ Pod │
│ ┌─────────────────────────────────────┐│
│ │ 共享网络命名空间 ││
│ │ ┌─────────────┐ ┌─────────────┐ ││
│ │ │ Container 1 │ │ Container 2 │ ││
│ │ │ Port 80 │ │ Port 3306 │ ││
│ │ └─────────────┘ └─────────────┘ ││
│ │ ↑ ↑ ││
│ │ └───────┬───────┘ ││
│ │ ↓ ││
│ │ ┌─────────────┐ ││
│ │ │ eth0 │ ││
│ │ │ 10.1.1.5 │ ││
│ │ └─────────────┘ ││
│ └─────────────────────────────────────┘│
└─────────────────────────────────────────┘
容器 1 可以通过 localhost:3306 访问容器 2
容器 2 可以通过 localhost:80 访问容器 1
共享的网络资源
| 资源 | 说明 | 用途 |
|---|---|---|
| IP 地址 | Pod 有一个唯一的 IP | 外部访问入口 |
| 端口空间 | 所有容器共享 | 容器间通过 localhost 通信 |
| 网络接口 | 共享 eth0 | 统一的网络出口 |
| 主机名 | 共享 hostname | 通过 hostname 互相发现 |
Pod 网络实现
Linux 网络命名空间实现:
Node:
┌─────────────────────────────────────────────────────┐
│ root network namespace │
│ ┌─────────────────────────────────────────────────┐│
│ │ veth pair ││
│ │ ┌─────────────────────────────────────────────┐││
│ │ │ Pod network namespace │││
│ │ │ ┌─────────────────────────────────────────┐│││
│ │ │ │ eth0 (Pod IP) ││││
│ │ │ └─────────────────────────────────────────┘│││
│ │ └─────────────────────────────────────────────┘││
│ └─────────────────────────────────────────────────┘│
│ ↓ │
│ ┌──────────────┐ │
│ │ cbr0 │ (网桥) │
│ └──────────────┘ │
└─────────────────────────────────────────────────────┘
容器间通信示例
# 典型的 Sidecar 模式:主容器 + 辅助容器
apiVersion: v1
kind: Pod
metadata:
name: web-with-logger
spec:
containers:
- name: web
image: nginx
ports:
- containerPort: 80
- name: logger
image: busybox
command: ["sh", "-c", "tail -f /var/log/nginx/access.log"]
volumeMounts:
- name: logs
mountPath: /var/log/nginx
volumes:
- name: logs
emptyDir: {}
两个容器的通信方式:
┌─────────────────────────────────────────┐
│ Pod │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ web │ │ logger │ │
│ │ Port 80 │ │ 监听日志 │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ │ 共享 Volume │ │
│ └──────────────────┘ │
│ │
│ web 可以通过 localhost:80 被访问 │
│ logger 可以通过 localhost 访问 web │
└─────────────────────────────────────────┘
Pod 间通信
同一节点上的 Pod 间通信:
Node:
┌─────────────────────────────────────────────────────┐
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Pod A │ │ Pod B │ │
│ │ 10.1.1.2 │ │ 10.1.1.3 │ │
│ └────┬─────┘ └────┬─────┘ │
│ │ │ │
│ │ veth pair │ veth pair │
│ │ │ │
│ └───────────┬─────────────┘ │
│ ↓ │
│ ┌──────────────┐ │
│ │ cbr0 │ │
│ └──────────────┘ │
│ │
│ Pod A → Pod B:通过网桥直接通信 │
└─────────────────────────────────────────────────────┘
不同节点上的 Pod 间通信:
Node 1 Node 2
┌──────────────┐ ┌──────────────┐
│ Pod A │ │ Pod B │
│ 10.1.1.2 │ │ 10.1.2.3 │
└──────┬───────┘ └───────┬──────┘
│ │
│ 封装/路由 │
│ (VXLAN/BGP) │
└─────────────────────────┘
实践练习
练习 1:查看 Pod 网络配置
# 创建包含多个容器的 Pod
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: multi-container
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- name: busybox
image: busybox
command: ["sleep", "3600"]
EOF
# 查看 Pod IP
kubectl get pod multi-container -o wide
# 从 busybox 容器访问 nginx
kubectl exec multi-container -c busybox -- wget -qO- http://localhost
练习 2:查看网络命名空间
# 查看 Pod 的网络命名空间
kubectl exec multi-container -c nginx -- cat /etc/resolv.conf
kubectl exec multi-container -c nginx -- ip addr
# 两个容器共享相同的网络配置
kubectl exec multi-container -c busybox -- 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
# 查看网络路径
kubectl exec pod-a -- traceroute $POD_B_IP
常见误解
1. Pod 内的容器共享文件系统
错误理解:Pod 内容器默认共享文件系统
正确理解:默认不共享,需要通过 Volume 实现共享
容器 1 和容器 2 有独立的文件系统
需要 emptyDir 等 Volume 才能共享文件
2. Pod IP 是固定的
错误理解:Pod 的 IP 永远不变
正确理解:Pod 重建后 IP 会变化
Pod 删除重建 → 新的 IP
所以需要 Service 来提供稳定的访问入口
小结
| 要点 | 说明 |
|---|---|
| 网络共享 | Pod 内容器共享网络命名空间 |
| 通信方式 | 容器间通过 localhost 通信 |
| IP 地址 | 每个 Pod 有唯一 IP |
| 跨节点通信 | 通过 CNI 插件实现(VXLAN/BGP) |
| 最佳实践 | 使用 Service 而非直接访问 Pod IP |
练习编辑器
bash
Loading...