52·网络进阶

Pod 网络

kubernetesnetworkingpod

Pod 网络

学习目标

  1. 理解 Pod 内部容器如何共享网络命名空间
  2. 掌握 Pod 网络的实现原理
  3. 了解 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...

继续学习

完成本课后,建议继续学习下一课「Service 网络」 以巩固所学知识。