37 K8S 之容器网络模型
Kubertnetes 集群上运行的所有 Pod 资源默认都会从同一平面网络得到一个 IP 地址,无论是否处于同一名称空间,各 Pod 彼此之间都可使用各自的地址直接通信,另一方面,Pod 网络的管理却非 Kubernetes 系统内置的功能,而是由第三方项目以 CNI 插件方式完成。
Network、IPC 和 UTS 名称空间隔离技术是容器能够使用独立网络栈的根本,而操作系统的网络设备虚拟化技术是打通各容器间通信并构建起多样化网络拓扑的至关重要因素,在 Linux 系统上,这类的虚拟化设备类型有 VETH、Bridge、VLAN、MAC VLAN、IP VLAN、VXLAN、MACTV 和 TAP/IPVTAP 等。这些网络虚拟化相关的技术是支撑容器与容器编排系统网络的基础。
在 Host 模式中,各容器共享宿主机的根网络名称空间,它们使用同一个接口设备和网络协议栈,因此,用户必须精心管理共享同一网络端口空间容器的应用与宿主机应用,以避免端口冲突。
Bridge 是指 Linux 内核支持的虚拟网桥设备,它模拟的是物理网桥设备,工作于数据链路层,根据习得的 MAC 地址表向设备端口转发数据帧。虚拟以太网接口设备对(veth pair)是连接虚拟网桥和容器的网络媒介:一端插入到容器的网络栈中,表现为通信接口(例如 eth0 等),另一端则于宿主机上关联虚拟网桥并被降级为当前网桥的“从设备”,失去调用网络协议栈处理数据包的资格,从而表现为桥设备的一个端口。
CNI 规范的网络插件是一个可执行程序文件,它们可由容器编排系统调用,负责向容器的网络名称空间插入一个网络接口并在宿主机上执行必要的任务以完成虚拟网络配置,因而通常被称为网络管理插件,即 NetPlugin。随后,NetPlugin 还需要借助 IPAM 插件为容器的网络接口分配 IP 地址,这意味着 CNI 允许将核心网络管理功能与 IP 地址分配等功能相分离,并通过插件组合的方式堆叠出一个完整的解决方案。简单来说,目前的 CNI 规范主要由 NetPlugin 和 IPAM 两个插件 API 组成。
网络插件也称 Main 插件,负责创建/删除网络以及向网络添加/删除容器,它专注于连通容器与容器之间以及容器与宿主机之间的通信,同容器相关的网络设备通常都由该类插件所创建,例如 Bridge、IP VLAN、MAC VLAN、loopback、PTP、VETH 以及 VLAN 等虚拟设备。
IPAM(IP Address Management),该类插件负责创建/删除地址池以及分配/回收容器的 IP 地址;目前,该类型插件的实现主要有 host-local 和 dhcp 两个,前一个基于预置的地址范围进行地址分配,而后一个通过 DHCP 协议获取地址。
NetPlugin 目前常用的实现方案有 Overlay 网络和 Underlay 网络两类。
Overlay 网络借助 VXLAN、UDP、IPIP 或 GRE 等隧道协议,通过隧道协议报文封装 Pod 间的通信报文(IP 报文或以太网帧)来构建虚拟网络。
Underlay 网络通常使用 direct routing(直接路由)技术在 Pod 的各子网间路由 Pod 的 IP 报文,或使用 Bridge、MAC VLAN 或 IP VLAN 等技术直接将容器暴露给外部网络。
IaaS 公有云环境中的 VPS 和云主机内部使用的已经是虚拟网卡,它们通常无法支持硬件交换功能,甚至是对 IP VLAN 或 MAC VLAN 等也多有限制,但云服务商通常会提供专有的 VPC 解决方案。
隧道转发的本质是将容器双方的通信报文分别封装成各自宿主机之间的报文,借助宿主机的网络“隧道”完成数据交换。这种虚拟网络的基本要求是各宿主机只需支持隧道协议即可,对于底层网络没有特殊要求。
为了确保 VXLAN 机制通信过程的正确性,涉及 VXLAN 通信的 IP 报文一律不能分片,这就要求物理网络的链路层实现中必须提供足够大的 MTU 值,或修改其 MTU 值以保证 VXLAN 报文的顺利传输。
VTEP(VXLAN Tunnel Endpoints),它工作于 VXLAN 网络的边缘,负责相关协议报文的封包和解包等操作,从作用来说相当于 VXLAN 隧道的出入口设备。
Underlay 网络就是传统 IT 基础设施网络,由交换机和路由器等设备组成,借助以太网协议、路由协议和 VLAN 协议等驱动,它还是 Overlay 网络的底层网络,为 Overlay 网络提供数据通信服务。容器网络中的 Underlay 网络是指借助驱动程序将宿主机的底层网络接口直接暴露给容器使用的一种网络构建技术,较为常见的解决方案有 MAC VLAN、IP VLAN 和直接路由等。
MAC VLAN 为每个容器使用一个唯一的 MAC 地址,这可能会导致具有安全策略以防止 MAC 欺骗的交换机出现问题,因为这类交换机的每个接口只允许连接一个 MAC 地址。
IP VLAN 类似于 MAC VLAN,它同样创建新的虚拟网络接口并为每个接口分配唯一的 IP 地址,不同之处在于,每个虚拟接口将共享使用物理接口的 MAC 地址,从而不再违反防止 MAC 欺骗的交换机的安全策略,且不要求在物理接口上启用混杂模式。
IP VLAN 有 L2 和 L3 两种模型,其中 IP VLAN L2 的工作模式类似于 MAC VLANBridge 模式,上层接口(物理接口)被用作网桥或交换机,负责为下层接口交换报文;而 IP VLAN L3 模式中,上层接口扮演路由器的角色,负责为各下层接口路由报文。
强依赖于 IPVLAN 的场景有如下几个:
Linux 主机连接到的外部交换机或路由器启用了防止 MAC 地址欺骗的安全策略;
虚拟接口的需求数量超出物理接口能够支撑的容量上限,并且将接口置于混杂模式会给性能带来较大的负面影响;
将虚拟接口放入不受信任的网络名称空间中可能会导致恶意的滥用。
直接路由模型放弃了跨主机容器在 L2 的连通性,而专注于通过路由协议提供容器在 L3 的通信方案。这种解决方案因为更易于集成到现在的数据中心的基础设施之上,便捷地连接容器和主机,并在报文过滤和隔离方面有着更好的扩展能力及更精细的控制模型,因而成为容器化网络较为流行的解决方案之一。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/dde45f8c326b0b6e2fbf391d3】。文章转载请联系作者。
评论