目录
一、Kubernetes三种接口
二、Kubernetes三种网络
三、VLAN与VXLAN
1.VLAN
2.VXLAN
3.区别
3.1作用不同
3.2vxlan支持更多的二层网络
3.3已有的网络路径利用效率更高
3.4防止物理交换机Mac表耗尽
3.5相对VLAN技术,VXLAN技术具有以下优势
四、CNI网络插件——Flannel
1.Overlay Network
2.UDP
3.VXLAN
4.Host-gw
5.其他插件
五、总结——CNI网络插件
1.Flannel
2.Calico
2.1Calico的IPIP模式工作原理
2.2Calico的BGP模式工作原理
一、Kubernetes三种接口
- CRI:容器运行时接口(Docker、Containerd、Podman、Cri-o)
- CNI:容器网络接口(Flannel、Calico、Cilium)
- CSI:容器存储接口(NFS、Ceph、GFS、OSS、S3、Minio)
二、Kubernetes三种网络
- 节点网络:物理服务器网卡,网卡IP。每个主机网卡的组成,集群节点的网络通信。
- Pod网络:PodIP 提供给Docker容器使用的IP地址,虚拟IP地址。一个Pod中只有一个IP地址,一个Pod中会共享一个IP地址出去,Pod之间通讯要加网络。Pod与Pod之间可以通过PodIP相互通信。
- Service网络:ClusterIP Service-IP地址,虚拟IP地址,给Pod提供载体。在K8S集群内可通过Service资源的ClusterIP实现对Pod集群的网络代理转发。
三、VLAN与VXLAN
1.VLAN
做资源的隔离和安全,使用Vlan,资源不够用的时候,使用VLAN,防止广播风暴
2.VXLAN
VXLAN:虚拟网络技术,将每个电脑作为一个网络标识,都做一个虚拟化的划分,可以划分几万个标识,将每台电脑绑定固定的标识。假设从一楼到三楼的数据通信,VXLAN会将数据包进行封装,将标识符和收件人和寄件人信息封装好,通过网络传给对面。相当于建立了虚拟隧道,不需要借助设备进行。
3.区别
3.1作用不同
- VLAN主要用作于在交换机上逻辑划分广播域,还可以配合STP生成树协议阻塞路径接口,避免产生环路和广播风暴。
- VXLAN可以将数据帧封装成UDP报文,再通过网络层传输给其它网络,从而实现虚拟大二层网络的通信
3.2vxlan支持更多的二层网络
- vlan使用12位bit表示vlanID,因此最多支持2^12=4094个vlan
- vxlan使用的ID使用24位bit,最多可以支持2^24个个vlan
3.3已有的网络路径利用效率更高
- vlan使用spanning tree protocol避免环路,会将一半的网络路径阻塞
- vxlan的数据包封装成UDP通过网络层传输,可以使用所有的网络路径
3.4防止物理交换机Mac表耗尽
- vlan需要在交换机的Mac表中记录Mac物理地址
- vxlan采用隧道机制,Mac物理地址不需记录在交换机
3.5相对VLAN技术,VXLAN技术具有以下优势
- 24位长度的VNI字段值可以支持更多数量的虚拟网络,解决了VLAN数目上限为4094的局限性的问题。
- VXLAN技术通过隧道技术在物理的三层网络中虚拟二层网络,处于VXLAN网络的终端无法察觉到VXLAN的通信过程,这样也就使得逻辑网络拓扑和物理网络拓扑实现了一定程度的解耦,网络拓扑的配置对于物理设备的配置的依赖程度有所降低,配置更灵活更方便。
- VLAN技术仅仅解决了二层网络广播域分割的问题,而VXLAN技术还具有多租户支持的特性,通过VXLAN分割,各个租户可以独立组网、通信,地址分配方面和多个租户之间地址冲突的问题也得到了解决。
四、CNI网络插件——Flannel
Flannel 的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。
Flannel 是 Overlay 网络的一种,也是将 TCP 源数据包封装在另一种网络包里面进行路由转发和通信,目前支持 UDP、VXLAN、Host-gw 3种数据转发方式。
1.Overlay Network
- 叠加网络,在二层或者三层基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路隧道连接起来。
- 通过Overlay技术(可以理解成隧道技术),在原始报文外再包一层四层协议(UDP协议),通过主机网络进行路由转发。这种方式性能有一定损耗,主要体现在对原始报文的修改。目前Overlay主要采用VXLAN。
2.UDP
UDP用户态,就是应用程序封装,通过UDP协议,IP封装,解封装的过程,原理通过FLannel服务进行封装,将UDP封装进去
数据从主机 A 上 Pod 的源容器中发出后,经由所在主机的 docker0/cni0 网络接口转发到 flannel0 接口,flanneld 服务监听在 flannel0 虚拟网卡的另外一端。
Flannel 通过 Etcd 服务维护了一张节点间的路由表。源主机 A 的 flanneld 服务将原本的数据内容封装到 UDP 报文中, 根据自己的路由表通过物理网卡投递给目的节点主机 B 的 flanneld 服务,数据到达以后被解包,然后直接进入目的节点的 flannel0 接口, 之后被转发到目的主机的 docker0/cni0 网桥,最后就像本机容器通信一样由 docker0/cni0 转发到目标容器。
3.VXLAN
隧道模式,默认配置,利用内核VXLAN来封装主机(host)之间传送数据包
- 数据帧从主机 A 上 Pod 的源容器中发出后,经由所在主机的 docker0/cni0 网络接口转发到 flannel.1 接口
- flannel.1 收到数据帧后添加 VXLAN 头部,封装在 UDP 报文中
- 主机 A 通过物理网卡发送封包到主机 B 的物理网卡中
- 主机 B 的物理网卡再通过 VXLAN 默认端口 4789 转发到 flannel.1 接口进行解封装
- 解封装以后,内核将数据帧发送到 cni0,最后由 cni0 发送到桥接到此接口的容器 B 中。
4.Host-gw
Host-gw:二层网络配置,不支持云环境,通过在主机的路由表中直接创建路由信息(subnet路由条目),到达目标,性能好,配置麻烦
5.其他插件
- Antree
- Cannal
- Kube-OVN
- Weave-Net
五、总结——CNI网络插件
1.Flannel
通常会采用VXLAN模式,用的是叠加网络(二层和三层网络)、IP隧道方式传输数据,由于要进行封装和解封装,对性能有一定的影响。
Flannel产品成熟,依赖性较少,易于安装,功能简单,配置方便,利于管理。但是不具备复杂的网络策略配置能力。同时不具备策略的配置能力。
3种模式(UDP、VXLAN、Host-gw)
- VLAN隧道模式,默认配置,利用内核VXLAN来封装主机(host)之间传送数据包
- UDP用户态,就是应用程序封装,通过UDP协议,IP封装,解封装的过程,原理通过FLannel服务进行封装,将UDP封装进去。由于 UDP 模式是在用户态做转发,会多一次报文隧道封装,因此性能上会比在内核态做转发的 VXLAN 模式差。
- Host-gw:二层网络配置,不支持云环境,通过在主机的路由表中直接创建路由信息(subnet路由条目),到达目标,性能好,配置麻烦
注:其中只配置一种,根据你的需求来配(或者自己判断)
默认网段10.244.0.0/16
2.Calico
功能强大,没有封装和解封装的过程,对性能影响较小,具有网络策略的配置能力,但是路由表维护起来比较复杂。
使用IPIP模式可以实现跨子网传输,但是传输过程中需要额外的封包和解包过程,对性能有一定的影响。
使用BGP模式会把每个node节点看作成路由器,通过Felix、BIRD组件来维护和分发路由规则,可实现直接通过BGP路由协议实现路由转发,传输过程中不需要额外封包和解包过程,因此性能较好,但是只能在同一个网段里使用,无法跨子网传输。
Calico不使用CNI0网桥,而使通过路由规则把数据包直接发送到目标主机,所以性能较高;而且还具有更丰富的网络策略配置管理能力,功能更全面,但是维护起来较为复杂。
默认网段192.168.0.0/16
模式:网络BGP、IPIP(封装的模式)、混合模式(CrossSubnet)
BGP:跨网络网关的动态路由协议,实现路由的最佳状态到达对端
2.1Calico的IPIP模式工作原理
- 原始数据包从源主机的Pod容器发出,通过 veth pair 设备送达到tunl0接口,再被内核的IPIP驱动封装到node节点网络的IP报文
- 根据Felix维护的路由规则通过物理网卡发送到目标node节点
- IP数据包到达目标node节点的tunl0接口后再通过内核的IPIP驱动解封装得到原始数据包,再根据本地路由规则通过 veth pair 设备送达到目标Pod容器
2.2Calico的BGP模式工作原理
每个Pod容器都有一个 veth pair 设备,一端接入容器,另一个接入宿主机网络空间,并设置一条路由规则。这些路由规则都是 Felix 维护配置的,由 BIRD 组件基于 BGP 动态路由协议分发路由信息给其它节点。
- 原始数据包从源主机的Pod容器发出,通过 veth pair 设备送达到宿主机网络空间
- 根据Felix维护的路由规则通过物理网卡发送到目标node节点
- 目标node节点接收到数据包后,会根据本地路由规则通过 veth pair 设备送达到目标Pod容器
所以对于较小规模且网络要求简单的K8S集群,可以采用Flannel作为CNI网络插件。
对于K8S集群规模较大且要求更多的网络策略配置时,可以考虑采用性能更好更全面的Calico或Cilium