一、前言
Calico(Calico网络策略及安全性)是一个开源的容器网络和安全性解决方案,设计用于支持云原生应用程序在Kubernetes、OpenShift和其他容器化平台上的部署,用于解决跨主机容器的互相访问,calico常用的模式有两种ipip跟bgp模式,下面就以这两种模式来详细的讲解一下
二、组件
Felix
Felix 是 Calico 的数据平面代理,运行在每个 Kubernetes 节点上,即calico的客户端。它负责处理数据包的转发、路由和策略执行等任务
BIRD
BIRD 是一个开源的 BGP 路由器,用于实现 Calico 网络中的 BGP 功能
etcd
用于存储 Calico 网络配置和状态信息
三、工作模式
calico跟flannel一样,也是通过创建veth pair,通过veth pair实现容器与宿主机之间的网络互通,不过calico的veth pair跟flannel的不一样,flannel的veth pair是一个cni0去连接多个容器的端口,而calico的veth pair是创建出两两对应的一组端口端口,即每个容器都有一个对应的宿主机虚拟网卡与之连接
通过下图示例可以看到在容器内查看网卡会发现网卡的名称叫eth0@if7,其实后面的7是宿主机编号为7的网卡,每个容器的网卡都会与宿主机各自对应的网卡相连,就构成了一条通道,就相当于交换机端口和客户端端口连上了网线,构成两两相对应的一组端口
ipip
ipip的工作模式其实相当于是flannel的udp模式,ipip模式也是使用了叫tunl0的虚拟网卡设备,tunl0设备就是一个TUN设备,作用于操作系统的网络层,用于在用户空间程序与内核空间之间传递网络数据包,与flannel udp模式不同的是,ipip是直接在内核态中封装数据包,即tunl0去驱动内核中的ipip将数据包打包,打包完成后转发到宿主机的网卡中
1.在k8s集群中使用ipip模式部署calico组件时,felix即calico的客户端会将每个节点主机的网络信息存储到etcd中,并且会获取etcd中存储的与之相对应的容器子网信息,在宿主机节点上生成tunl0设备、分别与每个容器对应的虚拟网卡,并且在宿主机中生成相当于的路由信息
这里通过20.244.226.31容器访问20.244.53.214容器说明calico ipip模式的工作原理,如下图所示
2.20.244.226.31容器先是通过自身的路由将ip包传递到eth0上,而eth0是通过veth pair的方式与宿主机上的cali58d26edd0c2@if3相连在一起的,所以数据包会传递到宿主机的cali58d26edd0c2@if3上
3.数据包在cali58d26edd0c2@if3上转发给内核,该数据包的目的地址是20.244.53.214,通过宿主机的路由表信息查询会发现与之匹配的路由信息为下一跳的网关是10.1.60.127,内核使用10.1.60.127作为目的地址将ip数据包再封装一层依然是ip数据包,转发到tunl0上
4.tunl0接收到ip数据包后转给内核,根据路由表信息通过ens192网卡对外发送
5.对端宿主机接收到ip数据包后通过内核拆封ip数据包,得知里层ip数据包目的地址是20.244.53.214,查询路由表会匹配到一条路由是将ip数据包发送到名为calic174e222b70的虚拟端口
6.前面说过该虚拟端口用的veth pair是一组网络虚拟接口,所以它的对端连接在对应的容器上,而这个容器就是地址为20.244.53.214的容器,所以该ip数据包会通过calic174e222b70的虚拟端口传输到容器的端口上
总结一下,ipip模式就是将原来的ip数据包再封装多一层同样是作为ip数据包,即原本的数据包要发送到20.244.53.214这个地址,宿主机没法识别要发送到哪里,所以需要给这个ip数据包再封装多一层用对方容器的宿主机的地址作为目的地址,这样宿主机就能知道要将这个ip数据包发送到对方容器所属的宿主机中去,ipip模式也被称为ip in ip
bgp模式
bgp模式与flannel的host-gw模式相似,都是完全使用了路由的方式实现数据包的传输,减少了数据包封装拆封装的步骤,不同的是flannel host-gw模式使用的是静态路由的方式,bgp使用bgp的方式,都是以宿主机作为网关,进行路由的转发,bgp模式与host-gw模式一样也是需要k8s集群中的宿主机在一个二层连通的网络中才可以使用
bgp分为两种模式,一种是mesh模式,一种是Router Reflection模式,默认使用的是mesh模式,mesh模式有个缺点,就是当集群节点超过100台的时候,使用mesh模式集群节点的通信压力会很大,超过100台集群的节点要使用router Reflection模式
mesh模式
在mesh模式中,每个节点都与其他节点直接建立 BGP 邻居关系。每个节点都负责向其他节点通告自己的子网信息,节点之间通过 BGP 协议交换路由信息,每个节点都维护整个网络的路由表,以便实现容器间的通信,但是每个节点都需要向所有其他节点通告路由信息,在大规模集群中,会产生较大的网络开销
Router Reflection模式
在 Route Reflector BGP 模式中,引入了路由反射器(Route Reflector)来简化 BGP 邻居关系,减少网络开销,路由反射器负责与所有节点建立 BGP 邻居关系,并在节点之间传播路由信息,充当路由信息的中心节点
这里就只说明mesh的bgp模式
1.在k8s集群中使用bgp模式部署calico组件时,BIRD即bgp路由的客户端会向其余节点传输路由信息,felix组件在宿主机节点上生成分别与每个容器对应的虚拟端口
这里通过10.244.85.219容器访问10.244.135.132容器说明calico bgp模式的工作原理,如下图所示
2.10.244.85.219容器先是通过自身的路由将ip包传递到eth0上,而eth0是通过veth pair的方式与宿主机上的cali58d26edd0c2@if3相连在一起的,所以数据包会传递到宿主机的cali58d26edd0c2@if3上
3.数据包在cali58d26edd0c2@if3上转发给内核,该数据包的目的地址是10.244.135.132,通过宿主机的路由表信息查询会发现与之匹配的路由信息为下一跳的网关是10.1.60.13,内核将数据包转发到ens192上对外发送到对端宿主机中
4.对端宿主机接收到ip数据包后转发给内核,得知ip数据包目的地址是10.244.135.132,查询路由表会匹配到一条路由是将ip数据包发送到名为calica7dd4daeec的虚拟端口
- 前面说过该虚拟端口用的veth pair是一组网络虚拟接口,所以它的对端连接在对应的容器上,而这个容器就是地址为10.244.135.132的容器,所以该ip数据包会通过calica7dd4daeec的虚拟端口传输到容器的端口上
calico的bgp模式与flannel的host-gw模式一样通过减少封装和解封装包,直接使用路由转发的方式来优化性能