Kubernetes Networking Model & CNI

Kubernetes Networking Model & CNI

💡 原文中文,约4000字,阅读约需10分钟。
📝

内容提要

Kubernetes采用“IP-per-Pod”网络模型:每个Pod拥有独立IP,内部容器共享该IP并通过localhost通信,任意Pod间可直接通信且无需NAT。实现需解决容器间、Pod间、Pod与Service及集群内外通信问题,并通过CIDR划分地址。CNI标准化插件接口,负责为Pod创建网卡、分配IP。网络类型分为Overlay、Route、Underlay;插件分为IPAM、Meta、Main三类。主流实现有Flannel、Calico、Cilium,各有性能与功能差异。

🔎

延伸解读

Pod 内端口冲突的根源

文章指出,Pod 内所有容器共享同一个 IP 地址,容器间通过 localhost 加端口通信。这意味着同一 Pod 内的容器不能监听相同端口,否则会发生冲突。这一设计简化了容器间通信,但也要求开发者在同一 Pod 内部署多个容器时,必须提前规划端口分配,避免因端口重复导致启动失败。

CNI 标准化解决适配碎片化

容器网络方案不断涌现,若每种方案都需与容器运行时单独适配,会产生大量重复工作。CNI 通过定义统一接口,让网络插件只需实现接口即可接入 Kubernetes,为 Pod 创建网卡、分配 IP。这种标准化降低了生态碎片化,使不同网络方案能在同一套机制下共存,也方便用户根据需求更换插件。

网络类型选择取决于底层环境

文章对比了 Overlay、Route 和 Underlay 三种网络类型。Overlay 对底层网络无特殊要求,但封包拆包带来性能开销;Route 直接配置路由规则,性能更高但依赖底层网络;Underlay 直接使用底层网络,性能最高但同样依赖基础设施。选择时需权衡性能与底层网络的可控性,而非单纯追求高性能。

主流 CNI 插件的定位差异

Flannel 简单易用,支持 Overlay 和 Route 模式,但仅控制主机间流量,性能低于 Calico 和 Cilium。Calico 基于 BGP 实现纯三层 Route 网络,支持网络策略和 kube-proxy 替换。Cilium 利用 eBPF 在内核处理数据,性能最高,支持两种网络模式,且 CNI 反而是其最不重要的功能。选型时应结合集群资源与运维限制,而非仅看性能指标。

❓

Q&A

Kubernetes 的网络模型具体是什么?

Kubernetes 采用“IP-per-Pod”网络模型:每个 Pod 拥有独立 IP;Pod 内所有容器共享该 IP,容器间通过 localhost 加端口通信;任意两个 Pod 可直接通信且无需 NAT;每个 Node 上的代理可与该 Node 上所有 Pod 直接通信;集群中所有 Pod 处于同一 IP 网段。

Kubernetes 要实现其网络模型需要解决哪些通信问题?

需要解决四个方面:1) 每个 Pod 内所有容器直接通信(通过 Pause 容器实现);2) Pod 与 Pod 通信(通过 CNI 插件,所有 Pod 处于无 NAT 的扁平地址空间);3) Pod 与 Service 通信(通过 Cluster IP 和 kube-proxy 编写流量重定向规则);4) 集群外部到内部的通信(通常通过外部 LoadBalancer 实现)。

CNI 在 Kubernetes 中起什么作用?为什么需要 CNI?

CNI(容器网络接口)定义了一系列协议接口,用于管理网络插件,实现为 Pod 创建虚拟网卡、分配 IP 地址等功能,从而支撑“IP-per-Pod”网络模型。需要 CNI 是因为容器网络方案不断涌现,标准化接口可以避免为每种新方案重复适配已有容器,只要插件实现 CNI 接口即可兼容。

CNI 的网络类型有哪些?各自优缺点是什么?

CNI 网络类型分为 Overlay、Route、Underlay。Overlay 构建在真实网络之上的虚拟网络,对网络环境无特殊要求但封包拆包有额外开销、性能较低;Route 基于路由规则,无封包拆包开销、性能较高但依赖底层网络;Underlay 直接使用底层网络技术,Pod 与宿主机同网络,性能很高但依赖底层网络和基础设施。

CNI 插件按功能可以分为哪几类?

CNI 插件分为三类:IPAM(负责为 Pod 分配 IP,支持 DHCP、host-local、static 等方式);Meta(社区维护的内置插件,不能独立使用,需调用其他插件,如 tuning、portmap、bandwidth、firewall);Main(负责创建具体网络设备,如 bridge、ipvlan、loopback、macvlan、ptp、vlan、host-device、dummy)。

Flannel、Calico 和 Cilium 这三个 CNI 插件有什么区别?

Flannel 简单易用且流行,通过 VXLAN 实现 Overlay 或 Host-Gateway 实现 Route,仅控制主机间流量,性能低于 Calico 和 Cilium。Calico 是基于 BGP 的纯三层方案,实现 Route 模式,支持网络策略、kube-proxy 替换等,性能较好。Cilium 使用 Linux eBPF 在内核操作网络数据,性能最高,支持 Overlay 和 Route,可实现流量过滤、kube-proxy 替换等,CNI 反而是其最不重要的功能。

🏷️

标签

➡️

继续阅读