本文将探讨 kubernetes 中的网络模型,以及对各种网络模型进行分析。
underlay network model
什么是 underlay network
底层网络 underlay network 顾名思义是指网络设备基础设施,如交换机,路由器, dwdm 使用网络介质将其链接成的物理网络拓扑,负责网络之间的数据包传输。
underlay network
underlay network 可以是二层,也可以是三层;二层的典型例子是以太网 ethernet,三层是的典型例子是互联网 internet。
而工作于二层的技术是 vlan,工作在三层的技术是由 ospf, bgp 等协议组成。
k8s 中的 underlay network
在 kubernetes 中,underlay network 中比较典型的例子是通过将宿主机作为路由器设备,pod 的网络则通过学习路由条目从而实现跨节点通讯。
k8s 中的 underlay network
这种模型下典型的有 flannel 的 host-gw 模式与 calico bgp 模式。
flannel host-gw
flannel host-gw 模式中每个 node 需要在同一个二层网络中,并将 node 作为一个路由器,跨节点通讯将通过路由表方式进行,这样方式下将网络模拟成一个underlay network。
flannel host-gw
notes:通过路由方式,集群的 cidr 至少要配置 16,因为这样可以保证,跨节点的 node 作为一层网络,同节点的 pod 作为一个网络。如果不是这种用情况,路由表处于相同的网络中,会存在网络不可达
calico bgp
bgp(border gateway protocol)是去中心化自治路由协议。它是通过维护 ip 路由表或前缀表来实现 as (autonomous system)之间的可访问性,属于向量路由协议。
calico bgp
与 flannel 不同的是,calico 提供了的 bgp 网络解决方案,在网络模型上,calico 与 flannel host-gw 是近似的,但在软件架构的实现上,flannel 使用 flanneld 进程来维护路由信息;而 calico 是包含多个守护进程的,其中 brid 进程是一个 bgp 客户端与路由反射器(router reflector),bgp 客户端负责从 felix 中获取路由并分发到其他 bgp peer,而反射器在 bgp 中起了优化的作用。在同一个 ibgp 中,bgp 客户端仅需要和一个 rr 相连,这样减少了as内部维护的大量的 bgp 连接。通常情况下,rr 是真实的路由设备,而 bird 作为 bgp 客户端工作。
bgp
ipvlan & macvlan
ipvlan 和 macvlan 是一种网卡虚拟化技术,两者之间的区别为, ipvlan 允许一个物理网卡拥有多个 ip 地址,并且所有的虚拟接口用同一个 mac 地址;而 macvlan 则是相反的,其允许同一个网卡拥有多个 mac 地址,而虚拟出的网卡可以没有 ip 地址。
因为是网卡虚拟化技术,而不是网络虚拟化技术,本质上来说属于 overlay network,这种方式在虚拟化环境中与 overlay network 相比最大的特点就是可以将 pod 的网络拉平到 node 网络同级,从而提供更高的性能、低延迟的网络接口。本质上来说其网络模型属于下图中第二个。
ipvlan & macvlan
• 虚拟网桥:创建一个虚拟网卡对(veth pair),一头在容器内,一头在宿主机的 root namespaces 内。这样一来容器内发出的数据包可以通过网桥直接进入宿主机网络栈,而发往容器的数据包也可以经过网桥进入容器。
• 多路复用:使用一个中间网络设备,暴露多个虚拟网卡接口,容器网卡都可以介入这个中间设备,并通过 mac/ip 地址来区分 packet 应该发往哪个容器设备。
• 硬件交换,为每个 pod 分配一个虚拟网卡,这样一来,pod 与 pod 之间的连接关系就会变得非常清晰,因为近乎物理机之间的通信基础。如今大多数网卡都支持 sr-iov 功能,该功能将单一的物理网卡虚拟成多个 vf 接口,每个 vf 接口都有单独的虚拟 pcie 通道,这些虚拟的 pcie 通道共用物理网卡的 pcie 通道。
在 kubernetes 中 ipvlan 这种网络模型下典型的 cni 有,multus 与 danm。
multus
multus 是 intel 开源的 cni 方案,是由传统的 cni 与 multus,并且提供了 sr-iov cni 插件使 k8s pod 能够连接到 sr-iov vf 。这是使用了 ipvlan/macvlan 的功能。
当创建新的 pod 后,sr-iov 插件开始工作。配置 vf 将被移动到新的 cni 名称空间。该插件根据 cni 配置文件中的 “name” 选项设置接口名称。最后将 vf 状态设置为 up。
下图是一个 multus 和 sr-iov cni 插件的网络环境,具有三个接口的 pod。
• eth0 是 flannel 网络插件,也是作为 pod 的默认网络
• vf 是主机的物理端口 ens2f0 的实例化。这是英特尔 x710-da4 上的一个端口。在 pod 端的 vf 接口名称为 south0 。
• 这个 vf 使用了 dpdk 驱动程序,此 vf 是从主机的物理端口 ens2f1 实例化出的。这个是英特尔 x710-da4 上另外一个端口。pod 内的 vf 接口名称为 north0。该接口绑定到 dpdk 驱动程序 vfio-pci 。
multus
notes:术语
• nic:network interface card,网卡
• sr-iov:single root i/o virtualization,硬件实现的功能,允许各虚拟机间共享 pcie 设备。
• vf:virtual function,基于 pf,与 pf 或者其他 vf 共享一个物理资源。
• pf:pcie physical function,拥有完全控制 pcie 资源的能力
• dpdk:data plane development kit
与此同时,也可以将主机接口直接移动到 pod 的网络名称空间,当然这个接口是必须存在,并且不能是与默认网络使用同一个接口。这种情况下,在普通网卡的环境中,就直接将 pod 网络与 node 网络处于同一个平面内了。
danm
danm 是诺基亚开源的 cni 项目,目的是将电信级网络引入 kubernetes 中,与 multus 相同的是,也提供了 sr-iov/dpdk 的硬件技术,并且支持 ipvlan.
overlay network model
什么是 overlay
覆盖网络是使用网络虚拟化技术,在 underlay 网络上构建出的虚拟逻辑网络,而无需对物理网络架构进行更改。本质上来说,overlay network 使用的是一种或多种隧道协议 (tunneling),通过将数据包封装,实现一个网络到另一个网络中的传输,具体来说隧道协议关注的是数据包(帧)。
overlay
常见的网络隧道技术
• 通用路由封装 ( generic routing encapsulation ) 用于将来自 ipv4/ipv6 的数据包封装为另一个协议的数据包中,通常工作与 l3 网络层中。
• **vxlan (virtual extensible lan)**,是一个简单的隧道协议,本质上是将 l2 的以太网帧封装为 l4 中 udp 数据包的方法,使用 4789 作为默认端口。vxlan 也是 vlan 的扩展,对于 4096( 位 vlan id) 扩展为 1600 万( 位 vn·id )个逻辑网络。
这种工作在 overlay 模型下典型的有 flannel 与 calico 中的的 vxlan, ipip 模式。
ipip
ip in ip 也是一种隧道协议,与 vxlan 类似的是,ipip 的实现也是通过 linux 内核功能进行的封装。ipip 需要内核模块 ipip.ko 使用命令查看内核是否加载 ipip 模块lsmod | grep ipip ;使用命令modprobe ipip 加载。
ipip
kubernetes 中 ipip 与 vxlan 类似,也是通过网络隧道技术实现的。与 vxlan 差别就是,vxlan 本质上是一个 udp 包,而 ipip 则是将包封装在本身的报文包上。
notes:公有云可能不允许 ipip 流量,例如 azure
vxlan
linux 对 vxlan 协议的支持时间并不久,2012 年 stephen hemminger 才把相关的工作合并到 kernel 中,并最终出现在 kernel 3.7.0 版本。为了稳定性和很多的功能,你可以会看到某些软件推荐在 3.9.0 或者 3.10.0 以后版本的 kernel 上使用 vxlan。
vxlan
在 kubernetes 中 vxlan 网络,例如 flannel,守护进程会根据 kubernetes 的 node 而维护 vxlan,名称为 flannel.1 这是 vnid,并维护这个网络的路由,当发生跨节点的流量时,本地会维护对端 vxlan 设备的 mac 地址,通过这个地址可以知道发送的目的端,这样就可以封包发送到对端,收到包的对端 vxlan 设备 flannel.1 解包后得到真实的目的地址。
查看 forwarding database 列表
$ bridge fdb268791:fc dev flannel.1 dst 10.0.0.3 self permanent
notes:vxlan 使用的 4789 端口,wireshark 应该是根据端口进行分析协议的,而 flannel 在 linux 中默认端口是 8472,此时抓包仅能看到是一个 udp 包。
通过上述的架构可以看出,隧道实际上是一个抽象的概念,并不是建立的真实的两端的隧道,而是通过将数据包封装成另一个数据包,通过物理设备传输后,经由相同的设备(网络隧道)进行解包实现网络的叠加。
weave vxlan
**weave 也是使用了 vxlan 技术完成的包的封装,这个技术在 weave 中称之为 fastdp (fast data path)**,与 calico 和 flannel 中用到的技术不同的,这里使用的是 linux 内核中的 openvswitch datapath module,并且 weave 对网络流量进行了加密。
weave vxlan
notes:fastdp 工作在 linux 内核版本 3.12 及更高版本,如果低于此版本的例如 centos7,weave 将工作在用户空间,weave 中称之为 sleeve mode。
冰箱响的原因及解决办法浅析
8英寸晶圆到底有多缺?
增材制造后处理概述:批量精加工是未来发展趋势
小米MIX2屏占比再度提升,米粉现在还会最期待小米手机6吗?
加拿大移动通信 全国范围中断
探讨Kubernetes中的网络模型(各种网络模型分析)
智能家居实现远程控制可以带来什么好处
一种音频小信号功率放大器信号放大电路设计浅析
怎么设计一块好的双层PCB板
江波龙Mini SDP首次突破行业想象,主控、缓存和闪存三合一
基于一种用于测量光强度的电路设计
莫仕宣布与堪泰公司达成协作关系共同强化工业自动化解决方案
智慧热力:热力管网自动化在线监测系统解决方案
选择oppor11或小米5X其实就是要你选择迪丽热巴或吴亦凡
可调线性稳压电源_线性可调稳压电源的设计详解
VICOR电源HAM™AC谐波衰减模块特性与优势
着眼于自动驾驶热潮,DMS在车内扮演着什么角色?
电磁干扰对电子医疗设备的危害及预防措施
三星向法国Note 7用户补偿128GB SD卡 还能免费游览VR公园
WAYON维安自控制保险丝,锂电池的安全卫士