很多人学习 Kubernetes 网络时,一上来就接触:
- Pod
- Service
- Ingress
- CNI
- Flannel
- Calico
结果越学越乱。
真正的问题在于:
Kubernetes 网络并不是一个独立体系,而是建立在 Linux 网络之上的一层抽象。
如果不了解 Linux 网络,那么 Pod、Service、VXLAN 这些概念都会变成黑盒。
一、网络世界只有三个核心概念
整个网络可以抽象成三件事:
对应:
二、MAC 与 IP
MAC 地址
MAC 是二层地址。
作用是在同一个局域网内定位设备。
IP 地址
IP 是三层地址。
作用是跨网络定位设备。
三、交换机、ARP、路由器
交换机工作在二层,只看 MAC 地址,不看 IP、TCP、HTTP。
ARP 负责:
路由器工作在三层:
路由表示例:
含义:
四、NAT
私网地址不能直接在公网路由:
所以路由器会做 SNAT:
并通过 conntrack 记录连接映射,用于回包恢复。
五、Linux Network Namespace
Namespace 是 Linux 的隔离机制。
Network Namespace 隔离的是一整套网络栈:
所以容器不是虚拟机,而是:
六、veth Pair
Namespace 之间需要连接,Linux 提供了 veth pair。
它像一根虚拟网线:
七、Linux Bridge
Bridge 是软件交换机。
它和物理交换机一样:
八、Docker 网络
Docker 默认网络结构:
其中 docker0 是 Linux Bridge,同时被 Docker 配置了 IP:
所以 docker0 既是交换机,也是容器默认网关。
Docker 自己维护 IPAM:
容器 IP 通常由 Docker 分配:
九、Pod 是什么
Pod 不是容器。
一个 Pod 里可以有多个容器:
真正持有网络命名空间的是 pause container。
所以同一个 Pod 内多个容器共享:
十、Kubernetes 单节点网络
很多 CNI 会在 Node 上创建类似 docker0 的网桥,比如:
结构:
同节点 Pod 通信时:
这个过程本质是二层交换。
十一、CNI 是什么
Kubernetes 本身不直接实现网络。
它通过 CNI 插件处理 Pod 网络。
常见 CNI:
CNI 负责:
Pod IP 通常由 CNI 的 IPAM 模块分配,不是 Kubernetes 或 Linux 自动分配。
十二、跨节点 Pod 通信
假设:
PodA 访问 PodB:
问题是:
这就是 CNI 要解决的问题。
十三、VXLAN
VXLAN 是:
意思是:
原始 Pod 包:
经过 VXLAN 封装:
包结构:
中间物理网络只看到:
Node2 收到后解 VXLAN,再把原始 Pod 包送给 PodB。
十四、flannel.1 是什么
flannel.1 不是进程。
它是 Linux VXLAN 网络设备。
类似:
路由表里:
意思是:
然后 Linux 内核负责 VXLAN 封装。
flanneld 才是进程,它负责:
十五、Service 的本质
Service 提供稳定访问入口。
例如:
但这个 IP 通常不是某张真实网卡上的 IP。
Service 本质是:
十六、kube-proxy
kube-proxy 监听:
然后生成转发规则。
例如:
所以访问 Service 时,真实过程是:
十七、CoreDNS
Pod 内访问服务名:
解析过程:
十八、Ingress
Ingress 是规则,不是真正的网关进程。
真正处理流量的是 Ingress Controller,比如:
外部请求链路:
Ingress Controller 通常是七层反向代理,会解析:
十九、完整链路总结
Linux 网络基础:
容器网络基础:
Kubernetes 网络:
二十、最终结论
Kubernetes 网络不是凭空出现的新体系。
它本质是:
更具体地说:
理解 Kubernetes 网络,正确路径不是先背 Pod、Service、Ingress,而是先理解: