目录
5.4 vxlan 模式中 cni 和 flannel 分别是干什么的
一 k8s 有哪些网络组件
-
Flannel:Flannel是一个简单且高效的网络解决方案,用于为Kubernetes集群中的容器提供网络连接,它通过为每个节点创建一个子网,然后使用VXLAN隧道将节点之间的流量路由到正确的容器。
-
Calico:Calico是一个开源的网络解决方案,它基于BGP协议构建了一个高度可扩展的容器网络。Calico可以提供网络策略功能,允许管理员定义流量控制规则。
-
Weave Net:Weave Net是一个具有网络拓扑感知能力的软件定义网络(SDN)解决方案,它能够自动发现和管理Kubernetes集群中的网络连接。
-
Cilium:Cilium是一个用于Kubernetes集群的网络和安全解决方案,它结合了BPF(Berkeley Packet Filter)和XDP(eXpress Data Path)技术,提供高性能的网络层和安全功能。
以上列举的网络组件是Kubernetes中常见的选择,每个组件都有其特定的特点和适用场景。
本章仅对生产环境中最常用 Flannel Calico 模式做具体分析介绍
二 k8s 网络概念
1, k8s 三种网络
‘’
2,K8S 中 Pod 网络通信
2.1 Pod 内容器与容器之间的通信
在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命名空间,相当于它们在同一台机器上一样,可以用 localhost 地址访问彼此的端口。
2.2 同一个 Node 内 Pod 之间的通信
每个 Pod 都有一个真实的全局 IP 地址,同一个 Node 内的不同 Pod 之间可以直接采用对方 Pod 的 IP 地址进行通信,Pod1 与 Pod2 都是通过 Veth 连接到同一个 docker0/cni0 网桥,网段相同,所以它们之间可以直接通信。
2.3 不同 Node 上 Pod 之间的通信
Pod 地址与 docker0 在同一网段,docker0 网段与宿主机网卡是两个不同的网段,且不同 Node 之间的通信只能通过宿主机的物理网卡进行。
要想实现不同 Node 上 Pod 之间的通信,就必须想办法通过主机的物理网卡 IP 地址进行寻址和通信。因此要满足两个条件:Pod 的 IP 不能冲突;将 Pod 的 IP 和所在的 Node 的 IP 关联起来,通过这个关联让不同 Node 上 Pod 之间直接通过内网 IP 地址通信。
三 Flannel 网络组件
1,Flannel 是什么
Flannel 的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。
Flannel 是 Overlay 网络的一种,也是将 TCP 源数据包封装在另一种网络包里面进行路由转发和通信,目前支持 UDP、VXLAN、Host-gw 3种数据转发方式。
英文翻译:法兰绒
2,Overlay Network 是什么
虚拟隧道技术
叠加网络,在二层或者三层基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路隧道连接起来。
通过Overlay技术(可以理解成隧道技术),在原始报文外再包一层四层协议(UDP协议),通过主机网络进行路由转发。这种方式性能有一定损耗,主要体现在对原始报文的修改。目前Overlay主要采用VXLAN。
3,VXLAN与 VLAN
3.1 VXLAN 是什么
将源数据包封装到UDP中,并使用基础网络的IP/MAC作为外层报文头进行封装,然后在以太网上传输,到达目的地后由隧道端点解封装并将数据发送给目标地址。
3.2 vlan vxlan 区别
VLAN (Virtual Local Area Network) 和 VXLAN (Virtual eXtensible Local Area Network) 都是网络虚拟化技术,旨在提高网络资源的灵活性和利用率,但它们之间存在一些关键区别:
网络规模:
- VLAN 使用 12 位标识符来定义 VLAN ID,因此理论上最多可以创建 4094 个不同的 VLAN。这限制了其在网络规模上的应用,尤其是在大规模数据中心环境中。
- VXLAN 使用 24 位的 VNI (VXLAN Network Identifier),允许创建多达 2^24(约1600万个)个独立的虚拟网络,极大地扩展了网络规模,适合云和大数据中心环境。
网络路径利用效率:
- VLAN 依赖于 Spanning Tree Protocol (STP) 或 Rapid Spanning Tree Protocol (RSTP) 来防止网络中的广播风暴和环路,但这通常会导致部分网络路径被阻塞,降低了网络带宽的利用率。
- VXLAN 则通过将二层数据包封装在 UDP 报文中,利用 IP 网络进行传输,绕过了 STP 的限制,所有路径都可以被利用,提高了网络的效率和弹性。
MAC 地址表的管理:
- 在 VLAN 中,每个交换机都需要维护一个 MAC 地址表,随着网络规模的扩大,MAC 表可能达到其容量极限,导致性能问题。
- VXLAN 使用隧道技术,源和目的主机之间的二层通信可以在三层网络上透明传输,MAC 地址信息不需要在每一跳上都进行学习和维护,减轻了底层物理交换机的负担,防止了 MAC 表耗尽的问题。
应用场景:
- VLAN 通常用于较小规模的网络分段,适合企业内部的网络管理,便于隔离广播域,控制网络流量。
- VXLAN 主要针对大规模的云服务提供商和数据中心环境,特别是那些需要跨多个物理网络或地理位置扩展二层网络的场景,以支持虚拟机的大规模迁移和多租户环境。
综上所述,VLAN 是一种较为传统且广泛应用的技术,适用于基本的网络分段需求,而 VXLAN 是一种更高级的网络虚拟化技术,设计用来应对现代数据中心的大规模、高动态性的网络架构挑战。
4,Flannel UDP 模式
4.1 Flannel UDP 模式的工作原理
数据从主机 A 上 Pod 的源容器中发出后,经由所在主机的 docker0/cni0 网络接口转发到 flannel0 接口,flanneld 服务监听在 flannel0 虚拟网卡的另外一端。
Flannel 通过 Etcd 服务维护了一张节点间的路由表。源主机 A 的 flanneld 服务将原本的数据内容封装到 UDP 报文中, 根据自己的路由表通过物理网卡投递给目的节点主机 B 的 flanneld 服务,数据到达以后被解包,然后直接进入目的节点的 flannel0 接口, 之后被转发到目的主机的 docker0/cni0 网桥,最后就像本机容器通信一样由 docker0/cni0 转发到目标容器。
4.2 Flannel UDP 模式 数据流向
pode1 到pode4的数据流向过程;
首先每个node 节点上,Flannel会在每个节点上设置一个UDP socket监听特定端口(默认是8285)
docker0 是网关
源pod ip 到 目的 pod ip 先经过CNI(一个标准化的接口,使得Kubernetes等平台能够与Flannel这样的网络插件无缝集成 )
再经过Flannel 服务
flanneld 服务 调用etcd 路由表(里面存储了真机的ip)进行数据封装到UDP报文,路由转发
数据封装如下:
源真机ip 到 目的真机ip
源pod ip 到 目的 pod ip
根据路由表(etcd) 借助物理网卡
然后 数据到达node2 数据解封 找到pode4
4.3 ETCD 之 Flannel 提供说明
存储管理Flannel可分配的IP地址段资源
监控 ETCD 中每个 Pod 的实际地址,并在内存中建立维护 Pod 节点路由表
5, Flannel VXLAN 模式
5.1 VXLAN 模式 是什么
VXLAN 模式使用比较简单,flannel 会在各节点生成一个 flannel.1 的 VXLAN 网卡(VTEP设备,负责 VXLAN 封装和解封装)。
VXLAN 模式下作是由内核进行的。flannel 不转发数据,仅动态设置 ARP 表和 MAC 表项。
UDP 模式的 flannel0 网卡是三层转发,使用 flannel0 时在物理网络之上构建三层网络,属于 ip in udp ;VXLAN封包与解包的工 模式是二层实现,overlay 是数据帧,属于 mac in udp 。
5.2 Flannel VXLAN 模式跨主机的工作原理
1、数据帧从主机 A 上 Pod 的源容器中发出后,经由所在主机的 docker0/cni0 网络接口转发到 flannel.1 接口
2、flannel.1 收到数据帧后添加 VXLAN 头部,封装在 UDP 报文中
3、主机 A 通过物理网卡发送封包到主机 B 的物理网卡中
4、主机 B 的物理网卡再通过 VXLAN 默认端口 4789 转发到 flannel.1 接口进行解封装
5、解封装以后,内核将数据帧发送到 cni0,最后由 cni0 发送到桥接到此接口的容器 B 中。
5.3 VXLAN 模式 数据流向
VXLAN(Virtual eXtensible Local Area Network)模式下的数据流向可以概括为以下几个步骤:
源虚拟机发送数据:当一台虚拟机(VM)需要向另一台处于不同子网但属于同一VXLAN网络的VM发送数据时,数据帧首先从源VM的虚拟网卡(vNIC)发出。
进入VTEP(VXLAN Tunnel End Point):数据帧到达源VM所在的主机上的VXLAN隧道端点(VTEP)。VTEP是实现VXLAN封装的关键组件,它负责将二层的数据帧封装成三层的UDP报文。在这个过程中,VTEP会添加一个VXLAN头部,其中包含VNI(VXLAN Network Identifier),用以区分不同的VXLAN网络段。此外,源和目标VTEP的IP地址也会被用作UDP报文的源和目的地址。
VXLAN数据包穿越IP网络:封装后的UDP报文作为一个普通的三层数据包在网络中路由,可以穿越三层网络,不受传统二层网络的限制,从而实现了二层网络在三层网络上的延伸。
到达目标VTEP:封装的VXLAN数据包最终到达目标VM所在主机的VTEP。VTEP根据UDP报文中的VNI解封装数据包,恢复出原始的二层数据帧。
交付给目标虚拟机:解封装后的二层数据帧被送到目标VM的虚拟网卡上,完成了从源VM到目标VM的数据传输。
简而言之,VXLAN通过在原有的二层数据帧外封装一层UDP/IP头,使原本受限于二层网络范围的通信能够跨越三层网络,同时保持了二层网络的隔离特性,实现了大规模数据中心内的虚拟网络扩展。
5.4 vxlan 模式中 cni 和 flannel 分别是干什么的
CNI (Container Network Interface)
CNI是一个开放的标准,定义了一套接口规范,使得网络插件能够与容器运行时(如Docker、rkt或CRI-O)集成,为容器提供网络连接能力。CNI关注的是容器网络的创建、删除和查询等生命周期管理操作。它让容器编排系统(如Kubernetes)能够动态地插入不同的网络实现,以满足不同的网络需求。简而言之,CNI是一个框架,它使得网络配置和管理变得更加灵活和模块化。
Flannel
Flannel是实现CNI标准的一个具体网络插件,它主要解决Kubernetes集群中跨节点容器之间的网络通信问题。Flannel为每个节点分配一个子网,并确保集群内的所有节点都能够访问这些子网。通过创建覆盖网络(overlay network),Flannel使得不同节点上的容器仿佛处于同一局域网内,可以相互通信。
在VXLAN模式下,Flannel的工作流程如下:
子网分配:Flannel为集群中的每个节点分配一个唯一的子网,保证网络地址空间的隔离和利用。
VXLAN封装:当容器间需要通信时,Flannel利用VXLAN协议将二层以太网帧封装在UDP报文中。这样,即便容器位于不同的物理节点,也能够通过三层网络(IP网络)进行通信。
内核态处理:VXLAN的数据包在宿主机的内核中进行封装和解封装,提高了数据转发的效率。
路由和转发:Flannel确保正确的路由规则被设置,使数据包能够从源容器顺利到达目的容器。
总结来说,CNI提供了一个标准化的接口,使得Kubernetes等平台能够与Flannel这样的网络插件无缝集成;而Flannel作为具体的网络实现,通过VXLAN等技术解决了容器跨节点通信的问题,为容器提供了一个统一的虚拟网络环境
6, host-gw 模式
host-gw 二层网络配置, 它不支持云环境,
通过在主机的路由表 中直接创建路由信息(subnet路由条目) 到达目标 性能好 配置麻烦
7,fannel中 vxlan 和 UDP 模式的区别
Flannel 是一种为 Kubernetes 集群提供网络覆盖(overlay network)的工具,它允许跨多个主机的容器之间相互通信,好像它们在同一局域网一样。Flannel 支持多种后端传输模式,其中 UDP 和 VXLAN 是两种常用的模式。下面是这两种模式的详细对比:
UDP 模式
工作原理:
- 在 UDP 模式下,每个 Flannel 节点运行一个
flanneld
守护进程,该进程监听一个 UDP 端口(默认 8285)。- 数据包通过 UDP 封装从一个节点发送到另一个节点,然后解封装并交付给目标容器。
flanneld
还需要与 ETCD 或其他配置存储交互,以获取网络配置和子网分配信息,并根据这些信息更新本机路由表。优点:
- 实现相对简单,不需要特殊的内核支持。
- 对于小规模集群或测试环境可能更易于设置。
缺点:
- 性能上可能不如 VXLAN,因为数据包需要在用户空间和内核空间之间多次上下文切换,这会引入额外的延迟。
- 需要手动维护或自动化更新路由表,这可能导致管理上的复杂性。
- 不如 VXLAN 扩展性好,尤其是在大规模部署时。
VXLAN 模式
工作原理:
- VXLAN 是一种标准的网络虚拟化技术,它使用 L2 over L4(即 MAC-in-UDP)封装,允许在三层网络上扩展二层网络。
- 在 Flannel 中,VXLAN 通过内核模块直接处理封装和解封装,减少了用户空间到内核空间的切换次数。
- VXLAN 使用 24 位的 VNI (VXLAN Network Identifier),理论上可以支持多达 16 百万个独立的二层网络,非常适合大规模部署。
优点:
- 性能较高,因为大部分工作在内核态完成,减少了上下文切换的开销。
- 自动管理和更新路由,减少手动配置需求。
- 高度可扩展,支持大规模的分布式网络部署。
- 提供更好的隔离性和安全性,适合多租户环境。
缺点:
- 需要内核支持 VXLAN 协议,较老的系统可能需要升级内核或安装额外的软件。
- 相比 UDP 模式,配置和理解可能更为复杂,特别是对于初学者。
总结
选择 UDP 还是 VXLAN 主要取决于具体的部署需求、性能要求、现有基础设施的支持情况以及运维团队的经验。对于追求高性能和大规模部署的场景,VXLAN 通常是更优的选择。而对于快速测试或对性能要求不那么严格的环境,UDP 模式可能因其简单性而成为合适的选择。
四 Calico 网络组件
1, Calico 是什么
英文翻译 厚棉布
#k8s 组网方案对比:
●flannel方案
需要在每个节点上把发向容器的数据包进行封装后,再用隧道将封装后的数据包发送到运行着目标Pod的node节点上。目标node节点再负责去掉封装,将去除封装的数据包发送到目标Pod上。数据通信性能则大受影响。●calico方案
Calico不使用隧道或NAT来实现转发,而是把Host当作Internet中的路由器,使用BGP同步路由,并使用iptables来做安全访问策略,完成跨Host转发。
采用直接路由的方式,这种方式性能损耗最低,不需要修改报文数据,但是如果网络比较复杂场景下,路由表会很复杂,对运维同事提出了较高的要求。
2, Calico 组成
Calico CNI插件:主要负责与kubernetes对接,供kubelet调用使用。
Felix:负责维护宿主机上的路由规则、FIB转发信息库等。
BIRD:负责分发路由规则,类似路由器。
Confd:配置管理组件。
3, Calico 工作原理
Calico 是通过路由表来维护每个 pod 的通信。Calico 的 CNI 插件会为每个容器设置一个 veth pair 设备, 然后把另一端接入到宿主机网络空间,由于没有网桥,CNI 插件还需要在宿主机上为每个容器的 veth pair 设备配置一条路由规则, 用于接收传入的 IP 包。
有了这样的 veth pair 设备以后,容器发出的 IP 包就会通过 veth pair 设备到达宿主机,然后宿主机根据路由规则的下一跳地址, 发送给正确的网关,然后到达目标宿主机,再到达目标容器。
这些路由规则都是 Felix 维护配置的,而路由信息则是 Calico BIRD 组件基于 BGP 分发而来。
calico 实际上是将集群里所有的节点都当做边界路由器来处理,他们一起组成了一个全互联的网络,彼此之间通过 BGP 交换路由, 这些节点我们叫做 BGP Peer。
4,bgp 是什么
BGP(Border Gateway Protocol,边界网关协议)是一种用于互联网上的自治系统(Autonomous Systems, AS)之间的路由选择协议。它是Internet工程任务组(IETF)制定的,用以在不同的网络运营商或者大型网络之间交换路由和可达性信息。BGP的主要职责和特性包括:
自治系统间路由:BGP主要用于连接Internet上的独立系统(即AS),使得一个AS可以了解如何到达另一个AS中的网络。
路径传播与选择:BGP设备(通常称为BGP发言人或边界路由器)通过交换路由信息来了解整个网络的拓扑结构,并基于一系列复杂的策略(如路径长度、AS路径属性、本地优先级等)来决定到达特定目的地的最佳路径。
增强的可扩展性和策略控制:BGP支持丰富的路由策略,允许网络管理员对路由信息进行精细的过滤和操控,以满足特定的业务需求或策略目标,比如流量工程、负载均衡和网络安全策略实施。
可靠性与稳定性:BGP运行在TCP协议之上(端口号179),利用TCP的确认、重传和连接管理机制来确保路由信息的可靠传输。它采用增量更新和触发更新机制,仅在路由发生变化时发送更新,有助于减少带宽消耗和预防路由振荡。
路由聚合与CIDR支持:BGP支持无类域间路由(Classless Inter-Domain Routing, CIDR),允许进行路由聚合,减少路由表的大小,提高网络效率。
多协议支持:现代的BGP版本,如BGP-4,不仅支持IPv4,还扩展支持IPv6,以及其他网络层协议,显示其高度的灵活性和适应性。
综上所述,BGP是确保全球互联网稳定运行的关键协议,通过它实现了大规模网络间的高效、可控的互联互通。
5, fannel 和calico 区别 及应用场景
Flannel和Calico都是为Kubernetes和其他容器编排系统设计的网络插件,用于实现容器间的网络通信,但它们在设计原理、实现方式和适用场景上存在一些差异。
Flannel
原理与实现:
Flannel主要通过创建覆盖网络来提供容器间通信能力,最常用的是VXLAN模式。它为集群中的每个节点分配一个子网,并使用各种后端(如VXLAN、UDP、host-gw等)来实现跨节点的数据包转发。
在VXLAN模式下,Flannel使用内核中的VXLAN模块封装数据包,通过隧道传输到目标节点,然后解封装并交付给目标容器。
应用场景:
Flannel因其简单易用和快速部署的特点,更适合小型到中型规模的集群,或者对网络配置要求不那么复杂的应用场景。
当网络需求侧重于快速部署和基本的容器间隔离时,Flannel是一个不错的选择。
Calico
原理与实现:
Calico采用了不同于Flannel的思路,它使用BGP(Border Gateway Protocol)作为路由协议,在每个节点上运行一个agent来管理和控制网络策略。Calico直接在IP层进行路由,而非使用隧道封装,从而提供更高的网络性能。
Calico支持IP-in-IP和BGP两种模式,其中BGP模式特别强调利用现有的路由基础设施,通过宣告容器的IP地址到BGP网络,实现全局的路由可达性。
应用场景:
Calico因其强大的网络策略控制能力和高性能,更适合需要细粒度网络策略管理、高级网络功能(如网络策略、安全组)以及大规模部署的场景。
在需要严格网络隔离、安全策略或需要直接在IP层进行路由的复杂网络架构中,Calico是更优的选择。
总结
性能与扩展性:Calico通常提供更好的网络性能,因为它避免了封包和解包的开销,且在大规模部署下更为稳定和可扩展。
网络策略:Calico提供更精细的网络策略和安全控制,适合需要严格安全策略和网络分段的环境。
简易性与配置:Flannel部署和配置相对简单,对于快速搭建测试环境或简单网络需求非常友好。
选择Flannel还是Calico,取决于具体的应用场景、性能需求、网络复杂度以及对网络策略控制的要求。