mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
1298 字
6 分钟
Kubernetes网络完全实战指南:从零理解Overlay与Underlay网络

引言:为什么需要理解Kubernetes网络?#

想象一下这个场景:你刚刚在Kubernetes集群上部署了你的第一个微服务,从集群内部访问一切正常。但当你想从办公室的电脑直接访问这个服务进行调试时,却发现根本无法连接。这就是典型的“网络孤岛”问题。

本文将一步步带你理解Kubernetes网络的两种核心模式——Overlay和Underlay,并通过大量实际操作,让你不仅能理解概念,还能亲手搭建、观察和调试这些网络。

第一章:环境搭建与基础准备#

1.1 完整的实验环境搭建#

在开始之前,我们需要一个实验环境。如果你没有现成的Kubernetes集群,可以基于kind搭建测试集群快速创建一个:

配置文件:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
apiServerAddress: "10.10.151.201"
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 6443
hostPort: 6443
listenAddress: "10.10.151.201"
protocol: tcp
- role: control-plane
- role: control-plane
- role: worker
extraPortMappings:
- containerPort: 80
hostPort: 7080
listenAddress: "0.0.0.0"
protocol: tcp
- containerPort: 443
hostPort: 7443
listenAddress: "0.0.0.0"
protocol: tcp
- role: worker
extraPortMappings:
- containerPort: 80
hostPort: 8080
listenAddress: "0.0.0.0"
protocol: tcp
- containerPort: 443
hostPort: 8443
listenAddress: "0.0.0.0"
protocol: tcp
- role: worker
extraPortMappings:
- containerPort: 80
hostPort: 9080
listenAddress: "0.0.0.0"
protocol: tcp
- containerPort: 443
hostPort: 9443
listenAddress: "0.0.0.0"
protocol: tcp

创建高可用集群命令:

sudo kind create cluster --config=huari.yaml --name huari-test --image kindest/node:v1.34.0 --retain; sudo kind export logs --name huari-test

切换kubectl上下文:

sudo kubectl cluster-info --context kind-huari-test

查看信息:

# 查看集群节点
sudo kubectl get nodes
# 查看集群全部的pod
sudo kubectl get pods -A -owide

删除集群:

sudo kind delete cluster --name huari-test

1.2 Pod网络基础实验#

Kubernetes对网络有两个核心要求,理解这两个要求是理解后续所有内容的基础:

  1. 每个Pod都有独立IP:每个Pod都拥有一个集群内唯一的IP地址
  2. Pod间直接通信:任何Pod都可以直接与任何其他Pod通信,无需NAT

让我们创建第一个Pod并观察其网络配置:

# 1、创建一个测试Pod
kubectl run network-test-pod \
--image=busybox:latest \
--restart=Never \
--labels=app=network-test \
--command -- sh -c "while true; do sleep 3600; done" \
--requests='memory=64Mi,cpu=50m' \
--limits='memory=128Mi,cpu=100m'
# 2、等待Pod就绪
kubectl wait --for=condition=ready pod/network-test-pod --timeout=60s
# 3、查看Pod详细信息
kubectl get pod network-test-pod -o wide
# 4、Pod内部网络配置
kubectl exec network-test-pod -- ip addr show
kubectl exec network-test-pod -- cat /etc/resolv.conf
kubectl exec network-test-pod -- route -n
# 5、Pod网络命名空间信息
kubectl exec network-test-pod -- ls -la /proc/self/ns/
# 6、创建Service并测试连通性
kubectl expose pod network-test-pod --name=test-service --port=80 --target-port=80
# 7、测试网络连通性-获取信息
echo "Service IP: $(kubectl get service test-service -o jsonpath='{.spec.clusterIP}')"
echo "Pod IP: $(kubectl get pod network-test-pod -o jsonpath='{.status.podIP}')"
# 8、测试网络连通性-pod内部测试
kubectl exec network-test-pod -- sh -c "echo '测试DNS解析...' && nslookup kubernetes.default"
kubectl exec network-test-pod -- ping -c 2 8.8.8.8

第二章:网络命名空间与veth pair深度解析#

2.1 手动创建网络命名空间#

找一台linux机器,通过下面一系列命令手动操作网络,理解网络命名空间的工作原理。

# 1. 创建两个网络命名空间
sudo ip netns add ns1
sudo ip netns add ns2
# 查看所有网络命名空间
sudo ip netns list
# 2. 在每个命名空间中查看网络配置
sudo ip netns exec ns1 ip addr show
sudo ip netns exec ns2 ip addr show
# 3. 创建veth pair连接两个命名空间
sudo ip link add veth-ns1 type veth peer name veth-ns2
# 将veth设备移动到对应的命名空间
sudo ip link set veth-ns1 netns ns1
sudo ip link set veth-ns2 netns ns2
# 4. 配置IP地址并启用接口
sudo ip netns exec ns1 ip addr add 10.1.1.1/24 dev veth-ns1
sudo ip netns exec ns2 ip addr add 10.1.1.2/24 dev veth-ns2
sudo ip netns exec ns1 ip link set veth-ns1 up
sudo ip netns exec ns2 ip link set veth-ns2 up
# 5. 配置回环接口
sudo ip netns exec ns1 ip link set lo up
sudo ip netns exec ns2 ip link set lo up
# 6. 测试连通性
sudo ip netns exec ns1 ping -c 2 10.1.1.2
# 7. 查看路由表
sudo ip netns exec ns1 route -n
sudo ip netns exec ns2 route -n
# 8. 清理实验环境
sudo ip netns del ns1
sudo ip netns del ns2

2.2 可视化:Pod创建过程网络变化#

flowchart TD A[用户创建Pod YAML] --> B[kubectl apply -f pod.yaml] B --> C[API Server接收请求] C --> D[Scheduler分配节点] D --> E{Kubelet创建Pod} E --> F[创建网络命名空间] F --> G[调用CNI插件] G --> H[创建veth pair] H --> I[一端放入Pod网络命名空间<br>命名为eth0] I --> J[另一端留在主机网络空间<br>命名为caliXXXXXX] J --> K[为eth0分配IP地址] K --> L[配置Pod路由表] L --> M[配置主机路由表] M --> N[更新iptables规则] N --> O[配置cgroups网络限制] O --> P[Pod网络就绪] P --> Q[容器进程启动] subgraph "节点主机" R[主机网络空间] S[Pod网络空间] end J -.->|veth pair| I R --> S style A fill:#e1f5e1 style P fill:#fff3e0 style Q fill:#e8f5e8

2.3 实际操作:查看真实Pod的veth连接#

# 1、创建测试Pod
kubectl run network-test-pod \
--image=busybox:latest \
--restart=Never \
--labels=app=network-test \
--command -- sh -c "while true; do sleep 3600; done" \
--requests='memory=64Mi,cpu=50m' \
--limits='memory=128Mi,cpu=100m'
# 2、等待Pod就绪
kubectl wait --for=condition=ready pod/network-test-pod --timeout=60s
# 3、获取Pod所在节点
echo "pod 运行在节点: $(kubectl get pod network-test-pod -o jsonpath='{.spec.nodeName}')"
# 4、进入节点容器检查
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Kubernetes网络完全实战指南:从零理解Overlay与Underlay网络
https://hua-ri.cn/posts/kubernetes网络完全实战指南从零理解overlay与underlay网络/
作者
花日
发布于
2026-02-25
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时