目录
前言
今天这篇文章主要来详细说一说k8s的网络以及网络之间的区别,工作流程等
一、K8S的三种网络
1.1 Pod 内容器与容器之间的通信
在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命名空间,相当于它们在同一台机器上一样,可以用 localhost 地址访问彼此的端口。
1.2 同一个 Node 内 Pod 之间的通信
每个 Pod 都有一个真实的全局 IP 地址,同一个 Node 内的不同 Pod 之间可以直接采用对方 Pod 的 IP 地址进行通信,Pod1 与 Pod2 都是通过 Veth 连接到同一个 cni0/docker0 网桥,网段相同,所以它们之间可以直接通信。
1.3 不同 Node 上 Pod 之间的通信
Pod 地址与 docker0 在同一网段,docker0 网段与宿主机网卡是两个不同的网段,且不同 Node 之间的通信只能通过宿主机的物理网卡进行。
要想实现不同 Node 上 Pod 之间的通信,就必须想办法通过主机的物理网卡 IP 地址进行寻址和通信。因此要满足两个条件:Pod 的 IP 不能冲突;将 Pod 的 IP 和所在的 Node 的 IP 关联起来,通过这个关联让不同 Node 上 Pod 之间直接通过内网 IP 地址通信
1.4 汇总
节点网络 | nodeIP (网卡地址) |
通过节点的物理网卡上的nodeIP实现节点间的通信 |
Pod网络 | podIP | 在K8S集群内部,可通过podIP访问Pod |
Service网络 | clusterIP | 在K8S集群内部,访问clusterIP,可通过serivce实现对Pod的网络代理和负载均衡 |
二、K8S的三种接口
CRI | 容器运行时接口 | 调用容器运行时(容器引擎)运行容器 | docker containerd podman |
CSI | 容器存储接口 | 调用后端存储作为Pod的存储卷给容器挂载使用 | 本地文件系统 nfs ceph oss s3 |
CNI | 容器网络接口 | 调用网络插件创建Pod网络,给每个Pod分配全局唯一的podIP,还能实现Pod跨主机通信 | flannel calico cilium |
三、VLAN 和 VXLAN 的区别
VXLAN 即 Virtual Extensible LAN(虚拟可扩展局域网):
是一种网络虚拟化技术,它使用一种隧道协议,将二层以太网帧封装在四层UDP报文中,通过三层网络传输,组成一个虚拟大二层网络,到达目的地后由隧道端点解封装并将数据发送给目标地址。从而实现分布在不同的宿主机上的虚拟机或者容器就像在同一个局域网(LAN)里那样自由通信。
3.1 使用场景不同
VLAN主要用于在交换机逻辑划分广播域
VXLAN还可以用于叠加网络隧道传输数据,将数据报文封装到UDP报文中,再通过网络层传输到其它节点网络,从而实现虚拟大二层网络的通信
3.2 支持的数量不同
VLAN最多支持 2^12 个(4096 -2)
VXLAN支持的更多,最多可支持 2^24 个
3.3 是否记录到MAC地址表中
VLAN需要记录到交换机的MAC地址表中
VXLAN不记录在交换机的MAC地址表中
四、flannel网络
4.1 flannel概述
flannel 的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。
flannel 是 Overlay 网络的一种,也是将 TCP 源数据包封装在另一种网络包里面进行路由转发和通信,目前支持 UDP、VXLAN、Host-gw 3种数据转发方式。
4.2 flannel的三种模式
4.2.1 UDP模式
flannel最早的模式,转发性能最差,基于flanneld应用程序实现数据包的封装、解封装UDP头部。
4.2.2 VXLAN模式
flannel的默认和推荐模式,转发性能比UDP模式更好,基于内核实现数据帧的封装、解封装UDP头部。
4.2.3 HOST-GW模式
转发性能最好的模式,但是不能跨网段通信,当k8s集群非常大时,会导致宿主机上的路由表变得非常巨大,不利于维护和管理。
4.3 工作原理
4.3.1 UDP模式
- 数据从主机A 上 Pod 的源容器中发出后,经由所在主机的 cni0 网桥转发到 flannel0 接口,flanneld 服务监听在 flannel0 接口的另外一端。
- 发送给 flannel0 接口的 IP 包信息将被 flanneld 进程接收,flanneld 进程接收 IP 包后在原有的基础上进行 UDP 封包。
- Flannel 通过 etcd 服务维护了一张节点间的路由表。目标容器所在宿主机的 IP 地址,flanneld 通过查询 etcd 很容易就能得到。
- flanneld 将封装好的 UDP 报文通过节点网络发往在主机B 监听 8285 端口的 flanneld 进程
- 运行在主机B 上的 flanneld 将 UDP 报文解包后得到原始 IP 包,内核通过查询本机路由表将该 IP 包转发给 cni0 网桥。
- cni0 网桥将 IP 包转发给连接在网桥上的目标Pod。至此整个流程结束。回程报文将按照上面的数据流原路返回。
etcd 之 Flanneld 提供说明:
存储管理 Flannel 可分配的IP地址段资源
监控 etcd 中每个 Pod 的实际地址,并在内存中建立维护 Pod 节点路由表
由于在 UDP 模式下 flanneld 进行网络的封包和解包工作,而 VXLAN 模式下封包解包的工作由内核完成,因此性能上 UDP 模式会比在内核态做转发的 VXLAN 模式差。
4.3.2 VXLAN模式
- 原始数据报文从源主机的Pod发出,经过cni0网桥转到flannel.1接口设备。
- flannel.1接口设备收到数据报文后,会在内核态为数据报文添加以太网头部和VXLAN,再将此数据帧封装到UDP报文里。
- flannel.1接口设备通过查询本地的FDB表获取到目标节点的nodeIP,对UDP报文封装nodeIP头部、MAC头部,再通过节点网络发送给目标node节点。
- 送达到目标节点的UDP报文通过8472端口发送到目标node节点的flannel.1接口设备。
- 目标node节点的flannel.1接口设备在内核态对UDP报文进行解封装获取原始数据报文,再根据本地路由将数据报文经过cni0网桥发送到目标Pod。
五、Calico网络
5.1 Calico 模式
1、IPIP 模式
在原有 IP 报文中封装一个新的 IP 报文,新的 IP 报文中将源地址 IP 和目的地址 IP 都修改为对端宿主机 IP。Calico 默认使用 IPIP 的模式。
2、BGP 模式
将节点做为虚拟路由器通过 BGP 路由协议来实现集群内容器之间的网络访问。
3、cross-subnet(ipip-bgp混合模式)
IPIP 模式和 BGP 模式都有对应的局限性,对于一些主机跨子网而又无法使网络设备使用 BGP 的场景可以使用 cross-subnet 模式,实现同子网机器使用 BGP 模式,跨子网机器使用 IPIP 模式。
5.2 Calico组成部分
- Calico CNI插件:主要负责与kubernetes对接,供kubelet调用使用。
- Felix:运行在每一台 Host 的 agent 进程,主要负责在宿主机上维护路由规则、网络接口管理等。
- BIRD:BGP Client,负责监听 Host 上由 Felix 注入的路由信息,然后通过 BGP 协议广播在集群里分发路由规则信息,从而实现网络互通。
- etcd:分布式键值存储,主要负责网络元数据一致性,确保 Calico 网络状态的准确性。
5.3 Calico 工作原理
5.3.1 calico的IPIP模式
- 原始数据报文从源主机的Pod发出,经过veth pair设备送达到tunl0接口设备。
- tunl0接口设备收到数据报文后,会在内核态将原始数据报文封装到节点的IP报文中,再根据Felix维护的路由规则通过节点网络发送到目标节点的tunl0接口设备。
- 目标节点的tunl0接口设备收到节点IP报文后,会在内核态进行解封装获取原始数据报文,再根据本地路由将数据报文经过veth pair设备发送到目标Pod。
5.3.2 calico的BGP模式
- 原始数据报文从源主机的Pod发出,经过veth pair设备送达到宿主机的网络空间,再根据Felix维护的路由规则通过节点网络发送到目标节点。
- 目标节点收到数据报文后,再根据本地路由将数据报文经过veth pair设备发送到目标Pod。
- 本质就是通过路由规则来实现Pod之间通信。
- 每个Pod都有一对veth pair设备,一端接入Pod,另一端接入宿主机的网络空间,并设置了一条路由规则。
- 这些路由规则都是由 Felix 维护的,再由 BIRD(BGP Client) 通过BGP动态路由协议分发给其它节点。
5.4 flannel和calico的区别
flannel | calico | |
模式 | UDP、VXLAN、HOST-GW |
IPIP、BGP、Cross-SubNet(混合模式)、 VXLAN |
默认网段 | 10.244.0.0/16 |
192.168.0.0/16 |
通信方式 | 通常会采用VXLAN模式,由于用的是叠加网络(overlay)、IP隧道方式传输数据,在传输过程中需要额外的封包和解包,对转发性能会有些影响。 |
1、使用IPIP或VXLAN模式可以实现跨网段通信,但传输过程需要额外的封包和解包,对转发性能会有些影响。 2、使用BGP模式会把每个节点看作为虚拟路由器,通过Felix、BIRD组件来维护和分发路由规则,可实现直接通过路由转发数据包到目标主机,转发过程不需要额外的封包和解包,因此性能更好。 |
性能 | 简单易用、资源消耗低 |
性能更好,功能更全面,支持多种网络策略配置 |
六、总结
flannel适合规模较小,网络要求简单的K8S集群环境。calico适合规模较大,需要设置网络策略的K8S集群。