Kubernetes&&CNI插件&&Calico、Flannel、Weave、Canal、Spiderpool

前言

参考资料
Kubernetes 网络插件 Calico 完全运维指南
几张图彻底搞懂 Kubernetes 的底层网络
K8s 高性能网络组件详解:Calico 的 IPIP 网络模式
Flannel VXLAN 模式分析
Kubernetes容器平台,从繁荣走向碎片化

常见术语

CNI
Container Network Interface。定义了实现容器之间网络连通性和释放网络资源等相关操作的接口规范。

CNI插件
负责为Pod分配IP地址,并处理跨节点的网络路由等具体的工作。

veth
Virtual Ethernet Device。veth是一种在Linux中用于网络虚拟化的技术,常用与容器网络中。
veth pair 可以看作是一对虚拟网络接口设备,它们像管道的两端一样相连。
在容器网络中,veth pair 通常一端连接容器(表现为eth0接口),一端连接主机(表现为veth1接口,位于主机的全局网络命名空间内),这样便可以实现容器内的网络流量经由eth0接口进,经由veth接口流出到主机的网络命名空间,并通过主机的网络路由和策略进行进一步的处理或转发。
在这里插入图片描述

netns
Network Namespace(网络命名空间)。

第2层(二层)网络
OSI 7层模型中的数据链路层。第2层网络会处理网络上两个相邻节点之间的帧传递。第2层网络的一个值得注意的示例是以太网,其中MAC表示为子层。

第3层(三层)网络
OSI 7层模型中的网络层。第3层网络的主要关注点是在第2层连接之上的主机之间路由数据包,常见的IPv4、IPv6和ICMP属于第3层网络协议。

Overlay网络
Overlay模式是在二层或三层网络之上再构建起来一个独立的网络,这个网络通常会有自己独立的IP地址空间、交换或者路由的实现。VXLAN协议是目前最流行的Overlay网络隧道协议之一,显著优势就是灵活,对底层网络没有侵入性。

在这里插入图片描述

路由模式
路由模式放弃了跨主机容器在L2的连通性,而专注于通过路由协议提供容器在L3的通信方案;路由模式更易于集成到现在的数据中心的基础设施之上,便捷地连接容器和主机,并在报文过滤和隔离方面有着更好的扩展能力以及更精细的控制模型。

Underlay模式
Underlay模式是借助驱动程序将宿主机的底层网络接口直接暴露给容器使用的一种网络构建技术,较为常见的解决方案有MAC VLAN、IP VLAN和直接路由等。

  • VXLAN: Virtual Extensible LAN(虚拟可扩展 LAN)。是一种覆盖网络技术,允许在现有的物理网络基础设施之上创建大量虚拟化的局域网(LAN)。它主要用于解决传统VLAN技术的一些限制,如VLAN ID数量限制(只有4096个)。VXLAN可以支持高达1600万个虚拟网络,极大地扩展了网络的规模和灵活性。
    • 封装与隧道技术: VXLAN通过封装原始的以太网帧(Layer 2)到UDP数据包(Layer 3)中来工作。这意味着它可以跨越不同的网络和子网,实现跨网络边界的通信。
    • VXLAN网络标识符(VNI): 每个VXLAN网络都有一个唯一的标识符,称为VNI(VXLAN Network Identifier),它提供了地址隔离,确保各个VXLAN网络之间的数据包不会互相干扰。
    • VTEP(VXLAN Tunnel Endpoint): VTEP是VXLAN架构中的端点设备,负责封装和解封装数据包。每个通过VXLAN通信的网络设备都有一个或多个VTEP。
      • 当数据包从虚拟网络出发时,VTEP会捕获这些数据包,将它们封装在VXLAN格式中(即加入VNI和UDP头),然后通过物理网络发送。
      • 当VXLAN数据包到达目的地的VTEP时,该VTEP将对数据包进行解封装,移除VXLAN头部,然后将原始的以太网帧转发到目标虚拟网络中。
      • VTEP通常部署在数据中心的交换机(物理或虚拟)上,但也可以部署在其他网络设备或服务器上。
      • 在容器化环境(如Kubernetes使用Flannel等CNI)中,VTEP可以作为软件组织运行,处理容器或Pod之间的VXLAN通信。

网状网络
网状网络(Mesh network)是指每个节点连接到许多其他节点以协作路由、并实现更大连接的网络。网状网络允许通过多个路径进行路由,从而提供更可靠的网络。网状网格的缺点是每个附加节点都会增加大量开销。

BGP
边界网关协议(Border Gateway Protocol, BGP)是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或‘前缀’表来实现自治系统(AS)之间的可达性,属于矢量路由协议。BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。

Flannel

工作原理

  • Flannel为每个节点分配一个Pod IP段,其中cni0作为该IP段的网关。同一个节点的Pod的 veth 使用同一个网段的IP地址,经由网关cni0实现同节点内Pod-to-Pod通信。
  • 当需要跨节点通信时,需要借助flannel.1接口。
  • flannel.1是VXLAN网络的VTEP设备。当数据包到达flannel.1的时候,就开始了VXLAN封包(MAC in UDP)过程,一个以太网帧被依次加上了VXLAN头(VNI信息)、UDP头、外部IP头和MAC头等。外部IP头里包含了VXLAN隧道的源地址和目的地址(VTEP地址),外部MAC头则包含了以太网帧到达下一跳所需的MAC地址。

1.Flannel有几种不同类型的后端可用于封装和路由。默认和推荐的方法是使用VXLAN,因为VXLAN性能更良好并且需要的手动干预更少。
2.在Kubernetes 的 kube-flannel namespace 中,存在一个名为kube-flannel-cfg的ConfigMap,可以通过修改net-conf.json文件修改网络模式和pods网段。
3.如果集群的规模预计不会到达上百规模,将vxlan改为host-gw可以提高网络传输性能。

在这里插入图片描述
在这里插入图片描述

Calico

介绍

Calico 是一个基于BGP的纯三层的数据中心网络方案。Calico 在每个计算节点都利用 Linux Kernel 实现了一个高效的虚拟路由器 vRouter 来负责数据转发。每个 vRouter 都通过 BGP1 协议把在本节点上运行的容器的路由信息向整个 Calico 网络广播,并自动设置到达其他节点的路由转发规则。
Calico 保证所有容器之间的数据流量都是通过IP路由的方式完成互联互通的。Calico节点组网时可以直接利用数据中心的网络结构(L2或者L3),不需要额外的NAT、隧道或者Overlay Network,没有额外的封包解包,能够节约CPU运算,提高网络效率。

calico的特点

  • 高效的网络连接
  • 安全策略管理
  • 高性能、大规模:
  • 灵活性:
  • 网络安全:Calico 基于 iptables 还提供了丰富的网络策略,实现了 K8s 的 Network Policy策略,提供容器间网络可达性限制的功能。
  • 动态路由
  • 网络策略
  • 网络隔离

Calico配置第3层网络,该网络使用BGP路由协议在主机之间路由数据包。这意味着在主机之间移动时,不需要将数据包包装在额外的封装层中。BGP路由机制可以本地引导数据包,而无需额外在流量层中打包流量。
Istio 是针对 Pod 层 Workload 的访问控制; Calico 针对 Node 层的访问控制

calicoctl

安装
# 下载calicoctl
curl -L https://github.com/projectcalico/calico/releases/download/v3.28.0/calicoctl-linux-amd64 -o calicoctl
chmod +x ./calicoctl
cp calicoctl  /usr/local/bin/
calicoctl version

Calico的架构及核心组件

在这里插入图片描述
Calico + Istio 架构图
在这里插入图片描述

  • Felix:是运行在每个 Node 的守护程序。主要负责路由和 ACL 的策略以及搭建网络、通过运行在 Node 上的 Iptables 进行细粒度的访问控制。
  • etcd:强一致性、高可用的键值存储,持久存储calico数据的存储管理系统。主要负责网络元数据一致性,确保Calico网络状态的准确性;
  • BGP Client(BIRD):读取Felix设置的内核路由状态,在数据中心分发状态。
  • BGP Route Reflector(BIRD):BGP路由反射器,在较大规模部署时使用。如果仅使用BGP Client形成mesh全网互联就会导致规模限制,因为所有BGP client节点之间两两互联,需要建立N^2个连接,拓扑也会变得复杂。因此使用reflector来负责client之间的连接,防止节点两两相连。
  • Dikastes/Envoy:可选的 Kubernetes sidecars,可以通过相互 TLS 身份验证保护 Workload 到 Workload 的通信,并增加相关的控制策略。

Calico的工作原理

Calico 把每个操作系统的协议栈认为是一个路由器,然后把所有的容器认为是连在这个路由器上的网络终端,在路由器之间跑标准的路由协议——BGP的协议,然后让它们自己去学习这个网络拓扑该如何转发。所以 Calico 方案其实是一个纯三层的方案,也就是说让每台机器的协议栈的三层去确保两个容器,跨主机容器之间的三层连通性。

Calico的两种网络方式

IPIP
把 IP 层封装到 IP 层的一个 tunnel。它的作用其实基本上就相当于一个基于IP层的网桥! ipip 是通过两端的路由做一个 tunnel,把两个本来不通的网络通过点对点连接起来。ipip 的源代码在内核 net/ipv4/ipip.c 中可以找到。
在原有 IP 报文中封装一个新的 IP 报文,新的 IP 报文中将源地址 IP 和目的地址 IP 都修改为对端宿主机 IP。
在这里插入图片描述

BGP
将节点做为虚拟路由器通过 BGP 路由协议来实现集群内容器之间的网络访问。
在这里插入图片描述

# 默认使用IPIP模式,修改以下配置变为BGP模式
CALICO_IPV4POOL_IPIP: off
FELIX_IPINIPENABLED: false

Cross-subnet
Calico-ipip 模式和 calico-bgp 模式都有对应的局限性,对于一些主机跨子网而又无法使网络设备使用 BGP 的场景可以使用 cross-subnet 模式,实现同子网机器使用 calico-BGP 模式,跨子网机器使用 calico-ipip 模式。

kubectl edit ipPool/default-ipv4-ippool
  ipipMode: CrossSubnet

问题现象、分析思路、解决方法

问题1

Warning FailedCreatePodSandBox 11s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container networkPlugin cni failed to set up pod "calico-kube-controllers-7c87c5f9b8-9nn7r_kube-system" network: cannot find a qualified ippool
kubelet无法创建pod(calico-kube-controllers-7c87c5f9b8-9nn7r_kube-system),原因是pod的网络环境无法初始化,而网络环境初始化依赖cni插件(calico),calico报错:cannot find a qualified ippool。
获取ipPool的状态
calicoctl get ipPool -o wide --allow-version-mismatch
NAME                  CIDR          NAT    IPIPMODE   VXLANMODE   DISABLED   DISABLEBGPEXPORT   SELECTOR   
default-ipv4-ippool   10.1.0.0/16   true   Always     Never       false      false              all()   

Weave

Weave在集群中的每个节点之间创建网状overlay网络,参与者之间可以灵活路由。这一特性再结合其他一些独特的功能,在某些可能导致问题的情况下,Weave可以智能地路由。
为了创建网络,Weave依赖于网络中每台主机上安装的路由组件。然后,这些路由器交换拓扑信息,以维护可用网络环境的最新视图。当需要将流量发送到位于不同节点上的pod时,Weave路由组件会自动决定是通过“快速数据路径”发送,还是回退到“sleeve”分组转发的方法。
快速数据路径依靠内核的本机Open vSwitch数据路径模块,将数据包转发到适当的pod,而无需多次移入和移出用户空间。Weave路由器会更新Open vSwitch配置,以确保内核层具有有关如何路由传入数据包的准确信息。相反,当网络拓扑不适合快速数据路径路由时,sleeve模式可用作备份。它是一种较慢的封装模式,在快速数据路径缺少必要的路由信息或连接的情况下,它可以来路由数据包。当流量通过路由器时,它们会了解哪些对等体与哪些MAC地址相关联,从而允许它们以更少的跳数、更智能地路由后续流量。当网络更改导致可用路由改变时,这一相同的机制可以帮助每个节点进行自行更正。

Canal

Canal是Flannel和Calico的组合,因此它的优点也在于这两种技术的交叉。网络层用的是Flannel提供的简单overlay,可以在许多不同的部署环境中运行且无需额外的配置。在网络策略方面,Calico强大的网络规则评估,为基础网络提供了更多补充,从而提供了更多的安全性和控制。

Kubernetes CNI网络最强对比:Flannel、Calico、Canal和Weave

Spiderpool

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值