k8s集群上运行的Pod默认都会从同一网络平面得到一个唯一的IP地址,即IP-pre-pod模型,无论是否处于同一名称空间,各Pod彼此间都可以直接通过各自的IP地址进行通信。但Pod的网络管理并非由k8s实现,主要由第三方项目以CNI插件形式完成,
在k8s集群中主要涉及同一Pod内容器通信、Pod间通信、Service到Pod的通信以及集群外部与Pod通信这4种需求。
Pod内容器通信
一个Pod内各容器共享同一网络名称空间,它通常由构建Pod对象的基础容器pause所提供。因此同一Pod内的各容器可以直接通过lo接口完成交互。
Pod间的通信
各Pod需要运行在同一个平面网络中,每个Pod对象拥有一个虚拟网络接口和集群全局唯一的IP地址,该IP地址可以直接和其它Pod进行通信,如下图中的PodA和PodB的通信。另外,运行Pod的各节点也会通过桥设备等配置此网络平面中的一个IP地址,例如下图中的cni0,这表示Node到Pod的通信也可以在此网络中进行。因此,Pod间的通信或Pod到Node的通信类似于同一IP网络中的主机通信。
Service与Pod的通信
Service资源的专用网络称为集群网络,每个Service对象在此网络中拥有一个固定IP地址。管理员或者用户对于Service对象的创建或修改操作,会由各节点上的kube-proxy根据不同的代理模式将其定义为相应节点上的iptables或ipvs规则,Pod或客户端对Service对象IP地址的访问将会由这些iptables或ipvs规则进行调度和转发,从而完成Service和Pod之间的通信
集群外部客户端与Pod对象的通信
引入集群外部流量到达Pod对象有4种方式,前两种是基于本地节点的端口或者使用主机名称名称空间,后两种是基于NodePort或LoadBalance类型的Service对象
综上所述,集群内的Pod间通信,即便通过Service进行“代理”和“调度”,但绝大部分都无需使用NAT,而是Pod间的直接通信。由此可见,上面的4种通信模型种,仅“Pod间的通信”是负责解决跨节点间容器通信的核心所在,但Kubernetes通过CNI解决,CNI是目前Kubernetes系统上标准的网络插件接口规范,目前绝大多数为K8s解决Pod网络通信的插件都是遵循CNI规范的实现。
CNI(Container Network Interface),容器网络API接口。
它是k8s中一个标准的调用网络实现的接口,kubelet通过这个标准的API来调用不同的网络插件以实现不同的网络配置方式。实现了这个接口的网络插件就是CNI插件,它实现了一系列的CNI API接口。
简单来说,CNI 做两件事,容器创建时的网络分配,和当容器被删除时释放网络资源。常见的 CNI 插件包括 Calico、flannel、Terway、Weave Net 等
k8s通过cni配置文件来决定使用什么cni插件,基本使用方法如下:
具体流程如下图所示:
目前常用的CNI插件主要都是Overlay和Underlay网络模型实现
Overlay网络借助VXLAN、IPIP和GRE等隧道协议,通过隧道协议封装Pod之前的通信报文来构建一个虚拟网络。Overlay网络示意图如下:
隧道转发的本质是将容器双方的通信报文封装为各自宿主机之前的报文,借助宿主机之间的“虚拟隧道”来完成数据交换。这种虚拟网络的基本要求是只要宿主机支持隧道协议即可,对底层网络没有特殊需求
VXLAN是目前最流行的Overlay网络隧道协议之一,采用将L2的以太网帧封装到UDP报文中(即L2 over L4),并在L3网络中传输,即采用Mac in UDP的方式对报文进行重新封装。这种方式可实现二层网络在三层范围内进行扩展,将“二层域”突破限制形成“大二层域”,那么,同一大二层域就类似于传统网络中vlan的概念,不过在vlxan网络中称为Bridge Domian,简称BD。类似于vlan使用vlan id进行区分,各BD通过VNI区分。
VXLAN相关概念:
VXLAN报文的封装格式如下图所示:
Underlay网络就是传统IT基础设施网络,由交换机和路由器等设备组成,借助以太网协议、路由协议和VLAN协议等驱动,它还是Overlay网络的底层网络,为Overlay网络提供数据通信服务。容器网络中的Underlay网络是指借助驱动程序将宿主机的底层网络接口直接暴露给容器使用的一种网络构建技术,较为常见的解决方案有MAC VLAN、IP VLAN和直接路由等
MAC VlAN支持在一个网络接口上虚拟出多个网络接口,每个虚拟接口拥有唯一的MAC地址,并可按需配置IP 地址。通常这些虚拟接口和原始接口在MAC VLAN中用上层或下层接口来表述。与Bridge模式相比,MACVLAN不依赖虚拟网桥、NAT和端口映射,它允许容器以虚拟接口方式直连物理接口。
MAC VLAN有4中工作模式,它们的特性如下:
综上所述,除了Passthru模式外的容器流量将被MAC VLAN过滤而无法与底层主机通信,从而将主机与容器完全隔离,其隔离级别高于网桥式网络模型。由于各实例都有专用的MAC地址,因此MAC VLAN允许传播广播和多播流量,但这需要物理网口工作于混杂模式,公有云环境可能不支持使用混杂模式。
另外,MAC VLAN为每个实例使用唯一的MAC地址,这可能会导致具有安全策略以防止MAC地址欺骗的交换机出现问题,因为这类交换机的接口只允许一个MAC地址通过
IP VLAN与MAC VLAN类似,它同样创建虚拟接口并为每个接口分配唯一的IP,不同之处在于,所有的虚拟接口将共享使用物理接口的MAC地址,从而不再违反MAC地址防欺骗的策略,且不要求在物理接口启用混杂模式
IP VALN有L2 和L3两种模型,其中L2模式类似于MAC VLAN的Bridge模式,上层接口被用作网桥或交换机,负责为下层接口交换报文;而L3模式中,上层接口相当于路由器,负责为下层接口路由报文
直接路由模型,放弃了跨主机网络在L2的连通性,而专注于通过路由协议提供容器在L3的通信。这种方式更易于集成到现有数据中心的基础设施上,便捷的来连接容器和主机,并且在报文过滤和隔离方面有着更好的扩展能力及更精细的控制模型,因此是容器化网络较为流行的解决方案之一
一个常用的直接路由网络方案如下图,每个主机上的容器在二层通过网桥连通,网关指向当前主机上网桥接口的地址。跨主机间的容器通信,依赖主机上的路由表指示完成报文路由。因此,每个主机上物理接口的地址都可能成为另一个主机路由报文中的下一跳,这就要求个主机的物理接口必须处于同一个二层网络中
显然,与Overlay相比,Underlay网络因无需对报文进行额外封装而具有更好的性能,但对底层网络有一定限制条件