k8s入坑之路(9)k8s网络插件详解

  • Flannel: 最成熟、最简单的选择
  • Calico: 性能好、灵活性最强,目前的企业级主流
  • Canal: 将Flannel提供的网络层与Calico的网络策略功能集成在一起。
  • Weave: 独有的功能,是对整个网络的简单加密,会增加网络开销
  • Kube-router: kube-router采用lvs实现svc网络,采用bgp实现pod网络.
  • CNI-Genie:CNI-Genie 是一个可以让k8s使用多个cni网络插件的组件,暂时不支持隔离策略

k8s的容器虚拟化网络方案大体分为两种: 基于隧道方案和基于路由方案

一、隧道方案

flannel的 vxlan模式、calico的ipip模式都是隧道模式。

1、1隧道模式过程

隧道模式分为两个过程:分配网段和封包/解包两个过程

1.1.1分配网络

宿主机利用etcd(etcd中维护ip)会为当前主机上运行的容器分配一个虚拟ip,并且宿主机上运行一个代理网络进程agent,代理出入的数据包。

1.1.2封包/解包

宿主上的agent进程会改变容器的发出的数据包的源ip和目的ip,目的宿主机上的agent收到数据包进行拆包然后送到目的容器。

二、路由方案

flannel的host-gw模式,calico的bgp模式都是路由方案

1.1路由过程

真个路由过程分为分配网段、广播路由两个阶段

1.1.1分配网段

类似隧道模式,每台宿主上的agent会从etcd中为每个容器分配一个虚ip。

1.1.2广播路由

agent会在宿主机上增加一套路由规则,凡是目的地址是该容器的ip的就发往容器的虚拟网卡上,同时会通过BGP广播协议将自己的虚拟ip发往集群中其他node节点,其他的node节点收到广播同样在本机创建一条路由规则:该虚拟ip的数据包发至他的宿主机ip上。

优缺点对比

由于隧道模式存在封包和拆包的过程而路由模式没有,所以路由模式性能高于隧道模式;

隧道模式通过agent代理工作在ip层而路由模型工作在mac层下;

路由模式会因为路由表膨胀性能下降;

Calico简单简介

1 Calico是一个纯三层的协议,为OpenStack虚机和Docker容器提供多主机间通信。Calico不使用重叠网络比如flannel和libnetwork重叠网络驱动,
2 它是一个纯三层的方法,使用虚拟路由代替虚拟交换,每一台虚拟路由通过BGP协议传播可达信息(路由)到剩余数据中心

Calico 架构

Calico 是一个三层的数据中心网络方案,而且方便集成 OpenStack 这种 IaaS 云架构,能够提供高效可控的 VM、容器、裸机之间的通信。

 

 

 1 结合上面这张图,我们来过一遍 Calico 的核心组件:
 2  
 3 Felix,Calico agent,跑在每台需要运行 workload 的节点上,主要负责配置路由及 ACLs 等信息来确保 endpoint 的连通状态;
 4  
 5 etcd,分布式键值存储,主要负责网络元数据一致性,确保 Calico 网络状态的准确性;
 6  
 7 BGP Client(BIRD), 主要负责把 Felix 写入 kernel 的路由信息分发到当前 Calico 网络,确保 workload 间的通信的有效性;
 8  
 9 BGP Route Reflector(BIRD), 大规模部署时使用,摒弃所有节点互联的 mesh 模式,通过一个或者多个BGP Route Reflector来完成集中式的路由分发;
10  
11 通过将整个互联网的可扩展 IP 网络原则压缩到数据中心级别,Calico 在每一个计算节点利用Linux kernel实现了一个高效的vRouter来负责数据转发而每个vRouter通过BGP
12 协议负责把自己上运行的 workload 的路由信息像整个 Calico 网络内传播 - 小规模部署可以直接互联,大规模下可通过指定的
13 BGP route reflector 来完成。
14  
15 这样保证最终所有的 workload 之间的数据流量都是通过 IP 包的方式完成互联的。

 

1 Calico 节点组网可以直接利用数据中心的网络结构(支持 L2 或者 L3),不需要额外的 NAT,隧道或者 VXLAN overlay network。

 

如上图所示,这样保证这个方案的简单可控,而且没有封包解包,节约 CPU 计算资源的同时,提高了整个网络的性能。

此外,Calico 基于 iptables 还提供了丰富而灵活的网络 policy, 保证通过各个节点上的 ACLs 来提供 workload 的多租户隔离、安全组以及其他可达性限制等功能。

 

 

Calico网络方式(两种)
1)IPIP
从字面来理解,就是把一个IP数据包又套在一个IP包里,即把 IP 层封装到 IP 层的一个 tunnel,看起来似乎是浪费,实则不然。它的作用其实基本上就相当于一个基于IP层的网桥!一般来说,普通的网桥是基于mac层的,根本不需 IP,而这个 ipip 则是通过两端的路由做一个 tunnel,把两个本来不通的网络通过点对点连接起来。ipip 的源代码在内核 net/ipv4/ipip.c 中可以找到。

2)BGP
边界网关协议(Border Gateway Protocol, BGP)是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或‘前缀’表来实现自治系统(AS)之间的可达性,属于矢量路由协议。BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。BGP,通俗的讲就是讲接入到机房的多条线路(如电信、联通、移动等)融合为一体,实现多线单IP,BGP 机房的优点:服务器只需要设置一个IP地址,最佳访问路由是由网络上的骨干路由器根据路由跳数与其它技术指标来确定的,不会占用服务器的任何系统。

1 每个主机上都部署了calico/node作为虚拟路由器,并且可以通过calico将宿主机组织成任意的拓扑集群。当集群中的容器需要与外界通信时,
2 就可以通过BGP协议将网关物理路由器加入到集群中,使外界可以直接访问容器IP,而不需要做任何NAT之类的复杂操作。
3  
4 当容器通过calico进行跨主机通信时,其网络通信模型如下图所示:

 

 1 从上图可以看出,当容器创建时,calico为容器生成veth pair,一端作为容器网卡加入到容器的网络命名空间,并设置IP和掩码,一端直接暴露在宿主机上,
 2 并通过设置路由规则,将容器IP暴露到宿主机的通信路由上。于此同时,calico为每个主机分配了一段子网作为容器可分配的IP范围,这样就可以根据子网的
 3 CIDR为每个主机生成比较固定的路由规则。
 4  
 5 当容器需要跨主机通信时,主要经过下面的简单步骤:
 6 1)容器流量通过veth pair到达宿主机的网络命名空间上。
 7 2)根据容器要访问的IP所在的子网CIDR和主机上的路由规则,找到下一跳要到达的宿主机IP。
 8 3)流量到达下一跳的宿主机后,根据当前宿主机上的路由规则,直接到达对端容器的veth pair插在宿主机的一端,最终进入容器。
 9  
10 从上面的通信过程来看,跨主机通信时,整个通信路径完全没有使用NAT或者UDP封装,性能上的损耗确实比较低。但正式由于calico的通信机制是完全基于三层的,这种机制也带来了一些缺陷,例如:
11 1)calico目前只支持TCP、UDP、ICMP、ICMPv6协议,如果使用其他四层协议(例如NetBIOS协议),建议使用weave、原生overlay等其他overlay网络实现。
12 2)基于三层实现通信,在二层上没有任何加密包装,因此只能在私有的可靠网络上使用。
13 3)流量隔离基于iptables实现,并且从etcd中获取需要生成的隔离规则,有一些性能上的隐患。

使用IPIP模式后的路由如下:

node1:

 

master1:

 

此模式还会在宿主机上生成虚拟网卡tunnel

node1:

 

master1:

 

 

如此,在node1上能ping 通master1的pod。两个宿主机通过这个tunnel进行通信,就像Linux的网桥一样。

 

 

posted @ 2021-07-14 14:16  大辉哥  阅读(4127)  评论(0编辑  收藏  举报