Calico网络解决方案

Calico是一种容器间的网络通信方案,同时提供隔离与管控机制

Calico设计优势:

  • Calico采用三层路由方法(所有数据包都是通过路由的形式找到对应的主机和容器的),抑制了二层广播,减少了资源开销,传统二层网络需要依赖广播消息机制,并使用vlan广播域隔离技术,但是有4096个规格限制,vxlan可以提高规格,但是隧道开销严重
  • 可扩展性更强
  • 依赖性较少

Calico主要工作组件:

1、Felix:运行于每个主机上的agent进程,负责为容器设置网络资源(IP地址、路由规则、iptables规则等),保证跨主机容器网络

2、etcd:Calico使用的后端存储,也可以使用kubernetes API数据存储(推荐)

3、BGP Client(BIRD):Calico在每个节点部署一个BGPClient,监听主机上Felix注入的路由信息,然后通过BGP协议广播告知其余主机节点,实现网络互通

4、BGP Route Reflector:可减少BGP Client导致的规模限制问题

5、calico-kube-controllers:用于管理Kubernetes集群中的网络策略(Network Policy)

Calico通讯协议:

  • IPIP协议:通过IPIP隧道作为通信基础,每个节点上创建tunl0作为隧道出入口封装报文
  • BGP协议:纯三层的路由交换,直接使用物理机作为虚拟路由器,不在创建额外的tunnel

BGP协议又分为两种方式:

  • BGP Speaker 全互联模式(node-to-node mesh):网络成网状,两两互联,适合小规模集群(上述工作组件中的第三个)
  • BGP Speaker 路由反射模式(Route Reflector):BGP Speaker连接到一个或多个中心BGP Speaker,网络成星状。适合大规模节点集群(上述工作组件中的第四个)

Calico网络验证:

1、IPIP工作模式:

1.1 首先在不同节点上运行两个pod,demo1和demo2,可以看到podIP如下:

宿主机的IP信息如下:

1.2 进入demo1中,去ping一下demo2,如图:

可以发现,是可以ping通的,那么为什么可以ping通呢,首先我们查看下demo1的路由,如图:

根据路由看出,ping之后会匹配到第一条路由,意思是去往任何目标网段的数据包都将发往网关169.254.1.1,并通过网卡eth0出去(注:eth0为pod内容器的网卡,不是宿主机)

路由表中Flags标志的含义如下:

  • U:up表示当前网卡为启动状态
  • H :host表示该路由为一个主机,多为达到数据包的路由
  • G :Gateway 表示该路由是一个网关,如果没有说明目的地是直连的
  • D: Dynamicaly 表示该路由是重定向报文修改
  • M :表示该路由已被重定向报文修改

1.3 查看demo1所在宿主机节点上的路由信息,如图:

从上图看出,当ping 10.244.195.3时,会通过路由tunl0,此路由意思为,去往10.244.195.0的数据包通过路由tunl0发往网关10.9.2.251,此时demo2所在的宿主机节点IP充当网关,通过此路由发送数据包到demo2所在节点

1.4 查看demo2所在宿主机节点上的路由信息,如图:

当节点收到数据包后,发现目的地IP为10.244.195.3,于是匹配到上图中黄线的路由,此路由意思为:10.244.195.3为本机直连设备,去往该设备的数据包将发往网卡cali8d9a2af576c

在创建pod的时候,Calico会给pod创建一个veth pair设备对,一端为pod内的网卡,一端就是宿主机看到的这个cali8d9a2af576c网卡,因此发送到cali8d9a2af576c的数据包,其实就是发送到demo2的网卡中

1.5 抓包查看ping的过程,在ping 的过程中执行如下命令抓取demo1所在宿主机网卡的数据包:

# -i: 指定宿主机网卡名称
# -vv: 更详细显示执行过程
# -w : 将执行结果输出到文件ipip.pcap中,pcap为一种文件格式
tcpdump -i ens33 -vv -w ipip.pcap

抓包后通过工具Wireshark进行分析(搜索ICMP),如图:

从上图可以看出,demo1 ping demo2 的数据包一共5层,其中ip有2层,分别是pod之间的网络和主机之间的网络,因此是在demo1 ping demo2的ICMP包外面多封装了一层主机之间的数据包

因此:IPIP模式就是将IP包封装在IP包里,所有pod的数据包通过隧道tunl0发送

2、BGP工作模式:

在安装calico的时候,默认安装的就是IPIP工作模式,可通过如下方式修改为BGP模式

第一种:修改修改IPPool中的ipipMode为Never,可以理解为禁用IPIP模式,执行命令如下:

kubectl edit ippool

第二种:修改calico.yaml文件的CALICO_IPV4POOL_IPIP为Never,不过此种方式只适用于第一次部署,如果已经部署了IPIP模式,这种方式不生效,除非删除calico,修改后重新部署

2.1 继续以上面ping为例子,首先查看demo1的路由信息,如图:

从上图看出,发往任何网段的数据包都通过网关169.254.1.1以及网卡eth0出去

查看demo1所在的宿主机k8s-master02的路由信息,如图:

上述路由意思是:去往网段10.244.195.0的数据包,通过网关10.9.2.251(demo2所在的宿主机IP)到达,并且从网卡ens33出去

2.2 查看demo2所在节点的宿主机的路由信息,如图:

上述路由含义:当节点接收到数据后,发现目的IP地址为10.244.195.3,就匹配到图中黄色线位置的路由信息,数据包将发往网卡cali8d9a2af576c,此网卡为calico创建pod的时候创建的veth pair 设备对的一端,另一端在demo2这个pod里

demo2对demo1的ping做出回应也是一样的原理,如图:

上述路由含义:去往10.244.122.128的返回数据包,以10.9.2.250(demo1所在节点的宿主机IP)为网关,通过网卡ens33,发往demo1所在的节点上

2.3 在ping的过程中,在demo1所在节点上执行抓包命令,执行如下命令:

tcpdump -i ens33 -vv -w ipip.pcap

抓包后通过工具Wireshark进行分析(搜索ICMP),如图:

从上图看出,BGP模式下,没有宿主机IP的封装,但是有mac地址的封装,源mac地址为demo1所在宿主机的网卡mac地址,目标mac是demo2所在宿主机的网卡mac,因为当一个数据包的目的地址不是本机时,就会查询路由表,从路由表中查询到网关后,通过ARP获得网关的MAC地址,网关的IP不会出现在网络包中,实际上Calico利用了网卡的代理ARP功能,当ARP请求目标跨网段时,网关设备收到此ARP请求,会将自己的MAC地址返回给请求者,上图中的目标mac地址即为代理mac地址,因此请求数据包封装的就是此mac地址,返回数据包原理一样

3、两种网络模式对比

1、IPIP模式:

流量:tunlo设备封装数据,形成隧道,承载进出流量

适用类型:适用于pod之间不在同一个网段中,跨网段访问场景。外层封装的宿主ip能够解决跨网段的路由问题

效率:流量通过tunl0设备封装,效率略低

2、BGP模式:

流量:通过路由表实现流量导向

适用类型:适用于pod之间在同一个网段,适用大型网络

效率:原生的hostGW,效率高

注:切换为BGP模式后,原来的IPIP隧道设备tunl0不会自动删除,需要执行如下命令手动删除:

modprobe -r ipip

BGP仅适用于规模较小的集群环境,大规模集群环境使用bgp route reflector

标签