Container容器借助底层Linux操作系统的Namespace与Cgroup内核技术,实现在单一主机资源的轻量级虚拟化资源隔离,包含进程ID、主机名、用户ID、文件名、网络和进程间通信等。同时每个网络空间Network Namesapce都有独立的网络栈,包括网络接口(Network Interface)、回环设备(Lookback Device)、路由表(Routing Table)和iptables规则等,是容器网络隔离与通信的基础。
Kubernetes是以Container容器技术为核心的调度引擎,将传统云计算对应的基础资源,包含计算、存储,网络进行了彻底池化统一管理,同时将运行在技术架构之上的应用和服务也进行了抽象标准化,再通过调度快速实现应用与资源的匹配,即以应用为中心构建云原生操作系统能力。
在Kubernetes集群内,既要解决相同宿主机多个命名空间网络栈共享底层硬件资源,同时还要解决集群内部跨宿主机网络通信的问题,面向应用提供完成的网络能力,所以容器网络是Kubernetes最复杂部分,同时也是设计精华所在:对于相同宿主机共享底层硬件设备问题,通常是借助虚拟化技术来实现,通过虚拟设备来实现灵活的管理,再将虚拟化设备连接到真实的物理设备上实现网络通信;对于跨宿主机网络通信问题,采用SDN软件定义网络的思路,灵活使用底层网络通信协议,同时结合各种虚拟化隧道通信技术,实现容器集群内外部通信。
所以要搞清楚复杂的容器网络及各种各样的网络插件,首先需要了解网络通信基础,网络设备虚拟化以及网络隧道技术。
网络通信基础
01 网络模型
OSI网络模型将网络数据发送和接收数据的过程分为7层,分别是物理层(Physical Layer),数据链路层(Data Link Layer),网络层(Network Layer),传输层(Transport Layer),会话层(Session Layer),表示层(Presentation Layer),应用层(Application Layer)。TCP/IP协议定义了一个应用于不同网络间信息传输的协议簇,对网络中各层次的通信制定了标准和方法。TCP/IP包含了很多协议,常见的协议包括IP、FTP、TCP、UDP、SMTP等。TCP/IP协议定义4层或者5层,4层主要包含链路层,网络层,传输层,应用层。OSI是开放系统的互连模型,相关的协议已经非常少使用,但是模型本身非常通用;只是由于OSI模型过于理想化,至今尚未有完整的实现。TCP/IP网络结构体系实际上是由OSI七层模型演化而来,是一个工业标准,并不是只由TCP和IP协议组成,而是由支持能够在多个不同的网络间实现信息传输的协议簇,后续的网络通信主要是基于TCP/IP协议讲解。
02 网络数据包
在TCP/IP通信中,网络层的作用是实现终端的点对点通信。通过IP地址将数据包发送给目的主机,在发送数据时,网络堆栈的每一层都会添加自己的报文头,包含该层需要的控制/元数据,以便在数据包穿过网络时对其进行处理,并将生成的数据包传递到堆栈的下一层。这样就产生了完整的数据包。
03 IP路由
当网络设备收到一个数据包时,它根据数据包的目的IP地址查询路由表,如果有匹配的路由条目,就根据查询结果将数据包转发出去,如果没有任何匹配的路由条目,则将数据包丢弃,这个过程就是IP路由。除了路由器,三层交换机、防火墙、负载均衡设备甚至主机等设备都可以进行路由操作。每一个路由条目包含目的网段地址/子网掩码、路由协议、出接口、下一跳IP地址、路由优先级和度量值等信息。路由表直连路由、静态路由和动态路由三种方式获取,其中动态路由是通过动态路由协议从相邻网络设备动态学习到的路由条目。协议有OSPF,BGP ,RIP,RIPv2等。
其中BGP协议,即边界网关协议,是一种运行于TCP上的一种能够处理因特网大小的网络协议,也是一种可以完善无关路由域间的多路连接协议。BGP主要用于与其他BGP线路建立网络连接、相互交换包括AS在内的信息。Kubernetes容器网络插件Calico,就基于此协议实现网络数据转发。
04 NAT(Network Address Translation)
网络地址转换是一种地址转换技术,可以将IP数据报文头中的IP地址转换为另一个IP地址,并通过转换端口号达到地址重用的目的。
网络设备虚拟化
在没有虚拟化技术之前,计算机网络系统都只通过物理网卡,线缆介质,连接外部网络,构成庞大的网络。随着虚拟化技术的出现,网络也随之被虚拟化,相较于单一的物理网络,虚拟网络变得非常复杂。Linux虚拟网络的底层都是由一个个的虚拟设备构成的,以此来实现诸如交换、路由、隧道、隔离、聚合等多种网络功能。常见的虚拟网络设备有tap/tun、veth-pair和bridge。
01 Tap/Tun
Tap/Tun是Linux内核实现的一对虚拟网络设备,TAP工作在二层,TUN工作在三层。Linux内核通过TAP/TUN设备向绑定该设备的用户空间程序发送数据,反之用户空间程序也可以像操作物理网络设备那样向 TAP/TUN 设备发送数据。
02 Veth-pair
Veth-pair是一端连着内核协议栈,另一端连着另一个设备,一个设备收到内核发送的数据后,会发送到另一个设备上去,这种设备通常用于容器中两个namespace之间的通信。
03 Bridge
Bridge是Linux内核实现的一个工作在二层的虚拟网络设备,但不同于TAP/TUN这种单端口的设备,Bridge实现为多端口,本质上是一个虚拟交换机,具备和物理交换机类似的功能。Bridge可以绑定其他Linux网络设备作为从设备,并将这些从设备虚拟化为端口,当一个从设备被绑定到Bridge上时,就相当于真实网络中的交换机端口上插入了一根连有终端的网线。
网络隧道技术
隧道(Tunneling)是一种网络数据通信技术,主要解决网络协议不支持,数据传输不安全等网络通信问题。将不支持的协议数据包打包成支持的协议数据包之后进行传输,或在不安全网络上提供一个安全路径。通过网络隧道技术,可以使隧道两端的网络组成一个更大的内部网络。
隧道协议有二层隧道协议与三层隧道协议两类,二层隧道协议对应OSI模型中数据链路层,使用帧作为数据交换单位,将数据封装在点对点协议的帧中通过互联网络发送,协议包含PPTP、L2TP、L2F等。三层隧道协议对应OSI模型中网络层,使用包作为数据交换单位,将数据包封装在附加的IP包头中通过IP网络传送,协议包含GRE、IPSec、GRE等。Linux原生支持多种三层隧道,其底层实现原理都是基于tun设备:
-
IPIP:普通的IPIP隧道,就是在报文的基础上再封装成一个IPv4报文
-
GRE:通用路由封装(Generic Routing Encapsulation),定义了在任意网络层协议上封装其他网络层协议的机制,所以对于IPv4和IPv6都适用
-
SIT:主要用于IPv4报文封装IPv6报文,即IPv6 over IPv4
-
ISATAP:站内自动隧道寻址协议,类似于sit也是用于IPv6的隧道封装
-
VTI:即虚拟隧道接口(Virtual Tunnel Interface),是一种IPsec隧道技术。
01 VXLAN隧道技术
Linux内核自3.7版本开始支持VXLAN隧道技术,是目前最流行的Overlay网络隧道协议之一,将二层以太网帧封装在四层UDP报文中,通过三层网络传输,组成一个虚拟大二层网络。VXLAN使用VTEP(VXLAN Tunnel Endpoint)来进行封包和解包:在发送端,源VTEP将原始报文封装成VXLAN报文,通过UDP发送到对端VTEP;在接收端,VTEP将解开VXLAN报文,将原始的二层数据帧转发给目的的接收方。VTEP可以是独立的网络设备,例如交换机,也可以是部署在服务器上的虚拟设备。例如使用置顶交换机(TOR)作为VTEP时,VXLAN的网络模型如下图:
-
VTEP(VXLAN tunnel endpoints):VXLAN网络的边缘设备,用来进行VXLAN报文的封包与解包。VTEP可以是网络设备(例如交换机),也可以是一台机器(例如虚拟化集群中的宿主机)。
-
VNI(VXLAN network identifier):VNI是VXLAN的标识,是个24位整数,因此最大值是2的24次方个。如果一个VNI对应一个租户,那么理论上VXLAN可以支持千万级别的租户。
-
VXLAN Tunnel:隧道是一个逻辑上的概念,在VXLAN模型中并没有具体的物理实体相对应。隧道可以看作一个虚拟通道,VXLAN通信双方都认为自己在直接通信,并不知道底层网络的存在。从整体上看,每个VXLAN网络像是为通信的设备搭建了一个单独的通信通道,也就是隧道。
VXLAN的报文就是MAC in UDP,即在三层网络的基础上构建一个虚拟的二层网络。VXLAN的封包格式显示原来的二层以太网帧(包含MAC头部、IP头部和传输层头部的报文),被放在VXLAN包头里进行封装,再套到标准的UDP头部(UDP头部、IP头部和MAC头部),用来在底层网络上传输报文。VXLAN报文比原始报文多出50个字节,这降低了网络链路传输的有效数据比例,尤其是小包。UDP目的端口是接收方VTEP设备使用的端口,IANA分配了4789作为VXLAN的目的UDP端口(flannel VXLAN模式是8472)。
最后,总结一下
总的来说,云原生Kubernetes并且没有创造新的网络技术,而是根据各种场景灵活的聚合使用各种网络技术。从底层通信技术来看,容器网络有Overlay模式,路由模式,以及Underlay模式三种,其中Overlay模式主要是通过虚拟化与隧道技术,屏蔽底层网络复杂路由转发,面向应用提供简单高效的通信能力。同时底层操作系统内核的网络的技术也在发展演进,各种虚拟化技术及隧道技术极其相似,又各自有细微的差别,所以才有多种容器网络插件及网络模式,所以容器网络规划选择一定要针对业务应用的场景,在灵活,高效,以及成本等多因素中权衡选择合适的网络方案。