目录
1. 术语
二层网络:
核心层+汇聚层 两层,用于搭建局域网(网桥/交换机),通过MAC寻址进行通信,在同一个冲突域内。
三层网络:
核心层+汇聚层+接入层 三层。用于搭建大型网络,通过IP路由通信,跨多个冲突域。
封包:
将网络数据包封装,在报文中添加源地址、目标地址、端口号等信息,使网络设备能够正确地识别和转发报文,确保到达目标地址。
Overlay 覆盖网络:
在已有网络上建立一个虚拟网络,采用隧道封包技术,把数据包封包解包,转发到目的地。通常由网络插件来实现,如flannel、calico。
Underlay 网络:
底层的物理网络,通过硬件设备(交换机、路由器、负载均衡设备、防火墙)转发数据包。Underlay网络可以是二层也可以是三层网络。
VLAN 虚拟局域网:
将一个物理的 LAN 从逻辑上划分成多个广播域。每个VLAN是一个广播域,VLAN内的主机间可以直接通信,而VLAN间则不能直接互通,以此达到隔离广播报文的目的。
VXLAN 虚拟可扩展局域网:
是一种 overlay 技术,通过三层的网络搭建虚拟的二层网络。它在源设备与目的设备之间建立一条隧道,采用封包技术将报文封装后转发,屏蔽了底层网络的结构和细节。
2. 容器网络接口CNI
容器网络接口(Container Network Interface),是一种标准的接口, 将异种网络环境的实现抽象出来,用于在配置或销毁容器时动态配置适当的网络配置和资源,实现kubernetes集群的Pod网络通信及管理。
CNI 的两部分
-
CNI接口,用于给容器配置网络,包含:
-
添加网络 AddNetwork (net *NetworkConfig, rt *RuntimeConf) (types.Result, error)
-
删除网络 DelNetwork (net *NetworkConfig, rt *RuntimeConf) error
-
-
IPAM 接口,用于给容器分配IP地址
常见的插件
具体的网络实现是由对应的插件去做的
-
flannel
-
calico:性能优于 flannel
-
公有云:AWS/阿里/腾讯的flannel定制版
-
私有云:Vmware NSX-T
-
网络性能要求高时:MacVlan
k8s 创建容器网络的过程
第1步:kubelet先创建pause容器,创建一个network namespace
第2步:调用网络driver,寻找CNI插件(CNI的配置目录为/etc/cni/net.d)
$ ls /etc/cni/net.d
10-flannel.conflist
$ cat 10-flannel.conflist
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
第3步:CNI driver根据配置去调用具体的CNI插件
这里的调用是二进制调用方式,可执行文件在/opt/cni/bin下
$ ls /opt/cni/bin
bandwidth dhcp firewall host-device ipvlan macvlan ptp static vlan
bridge dummy flannel host-local loopback portmap sbr tuning vrf
第4步:CNI插件给pause容器配置正确的网络,pod中其他的容器都是用pause的网络
3 VXLAN
VXLAN 虚拟可扩展的局域网(Virtual eXtensible Local Area Network),是一种 overlay 技术,通过三层的网络来搭建虚拟的二层网络。

思想
- 创建在原有的 IP 网络(三层)上,只要是三层可达(能够通过 IP 互相通信)的网络就能部署 VXLAN。
- 每个端点上都有一个 VTEP(VXLAN Tunnel Endpoints)设备,负责 VXLAN 协议报文的封包和解包,也就是在虚拟报文上封装 VTEP 通信的报文头。VTEP 设备可以是网络设备(交换机),也可以是一台机器(虚拟化集群中的宿主机)。
- 物理网络上可以创建多个 VXLAN 网络,这些 VXLAN 网络可以认为是一个虚拟隧道(Tunnel),不同节点的虚拟机能够通过隧道直连。
- 每个 VXLAN 网络由唯一的 VNI(VXLAN Network Identifier)标识,不同的 VXLAN 互不影响。一共可以虚拟出 2^24 = 16,777,216 个租户,也就是说使用 VXLAN 搭建的公有云可以理论上可以支撑千万级别的租户。
跨主机容器间如何利用 VXLAN 通信
在k8s集群内,如果使用 VXLAN 点对点通信,那所有pod之间都需要点对点互联,因此不能使用点对点模型。
由于k8s容器的所有流量都会打到网桥上,那么可以直接将 VTEP 设备插到网桥上,容器流量通过网桥发至 VTEP 设备,再经过 VXLAN 网络转发出去

VXLAN 的多种模式
-
点对点模式:明确的端到端
-
VXLAN + Bridge模式:明确的端到端,但端与端上的服务是多对多的
-
多播模式:让同一个 VXLAN 网络中容纳多个节点,形成一张 VXLAN 连通网
-
手动维护
-
VXLAN 分布式控制中心:(一种SDN架构)
-
预先将每个点的信息(MAC地址,IP地址)注册到分布式控制中心
-
将每个 VXLAN 网络的 VTEP 地址也注册到分布式控制中心
-
每个VTEP 上有一个agent,与控制中心通信,获取信息
-