1298 字
6 分钟
Kubernetes网络完全实战指南:从零理解Overlay与Underlay网络
引言:为什么需要理解Kubernetes网络?
想象一下这个场景:你刚刚在Kubernetes集群上部署了你的第一个微服务,从集群内部访问一切正常。但当你想从办公室的电脑直接访问这个服务进行调试时,却发现根本无法连接。这就是典型的“网络孤岛”问题。
本文将一步步带你理解Kubernetes网络的两种核心模式——Overlay和Underlay,并通过大量实际操作,让你不仅能理解概念,还能亲手搭建、观察和调试这些网络。
第一章:环境搭建与基础准备
1.1 完整的实验环境搭建
在开始之前,我们需要一个实验环境。如果你没有现成的Kubernetes集群,可以基于kind搭建测试集群快速创建一个:
配置文件:
kind: ClusterapiVersion: kind.x-k8s.io/v1alpha4networking: 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
# 查看集群全部的podsudo kubectl get pods -A -owide删除集群:
sudo kind delete cluster --name huari-test1.2 Pod网络基础实验
Kubernetes对网络有两个核心要求,理解这两个要求是理解后续所有内容的基础:
- 每个Pod都有独立IP:每个Pod都拥有一个集群内唯一的IP地址
- Pod间直接通信:任何Pod都可以直接与任何其他Pod通信,无需NAT
让我们创建第一个Pod并观察其网络配置:
# 1、创建一个测试Podkubectl 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 showkubectl exec network-test-pod -- cat /etc/resolv.confkubectl 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 ns1sudo ip netns add ns2
# 查看所有网络命名空间sudo ip netns list
# 2. 在每个命名空间中查看网络配置sudo ip netns exec ns1 ip addr showsudo 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 ns1sudo ip link set veth-ns2 netns ns2
# 4. 配置IP地址并启用接口sudo ip netns exec ns1 ip addr add 10.1.1.1/24 dev veth-ns1sudo 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 upsudo ip netns exec ns2 ip link set veth-ns2 up
# 5. 配置回环接口sudo ip netns exec ns1 ip link set lo upsudo 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 -nsudo ip netns exec ns2 route -n
# 8. 清理实验环境sudo ip netns del ns1sudo ip netns del ns22.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、创建测试Podkubectl 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网络/ 部分信息可能已经过时









