资讯专栏INFORMATION COLUMN

calico网络模型中的路由原理

Prasanta / 1807人阅读

摘要:在这种模式下,部署需要执行此处下载的仍可以参照上文的部署方式进行等的定制化。网络通过方式部署好后,我们在集群中创建几个我们在这个上来看。

calico的部署

1、下载模板
wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml

可以得到一份calico官方提供的v3.1版本calico的部署模板(基于kubeadm)。当然里面都是社区的镜像,我们可以替换成本地镜像.建议到网易云的景象中心下载,很多其他的国内镜像仓库都不做维护了。

2、启/禁用 ip-ip

目前官方提供的模板里,默认打开了ip-ip功能,该功能会在node上创建一个设备:tunl0,容器的网络数据会经过该设备被封装一个ip头再转发。这里,calico.yaml中通过修改calico-node的环境变量:CALICO_IPV4POOL_IPIP来实现ipip功能的开关:默认是Always,表示开启;Off表示关闭ipip; cross-subnet表示开启并支持跨子网,目前用不到这种类型。
sed -i "s#Always#Off#g" calico.yaml

3、部署:

注意:部署前,要配置一个参数,让calico-node组件能够识别node的IP,node上可能有多块网卡,官方提供的yaml文件中,ip识别策略(IPDETECTMETHOD)没有配置,即默认为first-found,这会导致一个网络异常的ip作为nodeIP被注册,从而影响node-to-node mesh。我们可以修改成can-reach的策略,尝试连接某一个Ready的node的IP,以此选择出正确的IP。

为了方便,下面的脚本里,我以任意一个node的ip地址为reach 地址

connective_ip=`kubectl get node -o wide |grep Ready |head -n1 |awk "{print $6}"`
sed -i  -rn "p;/name: IP/,/autodetect/H;/autodetect/{g;s/^
//;p}" calico.yaml 
sed -i "1,/name: IP/{s/name: IP/name: IP_AUTODETECTION_METHOD/}" calico.yaml
sed -i "1,/"autodetect"/{s/"autodetect"/can-reach=__ONE_CONNECTIVE_ENDPOINT__/}" calico.yaml
sed -i "s#__ONE_CONNECTIVE_ENDPOINT__#$connective_ip#g" calico.yaml

执行:
kubectl apply -f calico.yaml

4、calico使用过程中的一些其他点

calico以ipip模式部署完毕后,node上会有一个tunl0的网卡设备,这是ipip做隧道封装用的。当我们把节点下线,calico容器都停止后,这个设备依然还在,执行 rmmod ipip 命令可以将它删除(如果calico-node仍在运行,会自动再建一个新的)

calico部署完毕后,其数据记录在calico-etcd容器运行节点的/var/etcd/calico-data目录中,如果要完全清理集群中的etcd数据,需要将该目录删除。

calico支持以kubernetes为存储后端,以这种方式部署时,calico不再需要额外部署etcd,而是将数据以CRD的方式存到k8s中。calico的组件依赖kubeconfig与k8s交互。在这种模式下,部署calico需要执行:

wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
kubectl apply -f rbac-kdd.yaml
kubectl apply -f calico.yaml
此处下载的calico.yaml 仍可以参照上文的部署方式进行ipip、ip pool等的定制化。

calico bgp 网络

通过bgp方式部署好calico后,我们在集群中创建几个pod:

root@k8s-calico1:~# pods 
NAMESPACE     NAME                                       READY     STATUS    RESTARTS   AGE       IP                NODE
huang1        huangtest-69d9fffffd97-cbzbm                 1/1       Running   0          20m       192.168.211.1     k8s-calico4
huang1        huangtest-69d9fffffd97-pbvvw                 1/1       Running   0          3m        192.168.210.194   k8s-calico3
huang2        hhh-6897d64fcd-4zph4                       1/1       Running   0          1d        192.168.97.2      k8s-calico2

我们在k8s-calico2这个node上来看。执行ip r, 在这个node的路由中,需要我们关注的有:

192.168.97.2 dev calic285cddbb40 scope link 
blackhole 192.168.97.0/26 proto bird 
192.168.210.192/26 via 10.173.32.26 dev eth0 proto bird 
192.168.211.0/26 via 10.173.32.25 dev eth0 proto bird

192.168.97.2 dev calic285cddbb40 scope link 这条路由将通向容器ip的请求导向veth:calic285cddbb40 ,进而让请求直达容器内的网卡。
blackhole 192.168.97.0/26 proto bird 表示发往192.168.97.0/26网段的报文都会被丢弃且不会回复源端。配置这条路由的原因是:这台机器上的calico网络可分配的cidr是192.168.97.0/26,容器里访问同网段的其他IP时,配置该路由以避免报文被发到外部。
最后两条,分别记录了:要访问calico网络中的某个网段,需要以对应的node IP为网关,通过eth0发包。也就是说通过这两条路由,可以将部分网段(目的IP)的包经由eth0发送到正确的地方。

我们可以这么理解:pod hhh-6897d64fcd-4zph4中ping huangtest-69d9fffffd97-pbvvw时,流量是这么走的:

0、数据包封装完成,srcip:192.168.97.2 , destip:192.168.210.194
1、容器中只有eth0网卡,容器里ip r 看到的是default **** dev eth0,所以流量通过容器的eth0发送。
2、容器网卡的配置是通过vethpair做的,也就是说,容器里网卡发的包,在宿主机上都会被calic285cddbb40设备发出。
3、通过第2步,网络报文就在宿主机的网络中,受宿主机路由影响,192.168.210.192/26 via 10.173.32.26 dev eth0 proto bird这条路由会将数据从eth0转发,并发给路由中记录的网关:10.173.32.26(这个ip,就是pod huangtest-69d9fffffd97-pbvvw所在的node:k8s-calico3 的ip)
4、10.173.32.26是node:k8s-calico3上eth0的ip,收到包后,在机器自身的路由表中寻找合理的路由,当然这个地方也会有路由:192.168.210.194 dev calif6874dae1d2 scope link,于是包顺利被对端接收

calico ipip 网络

我们通过ip-ip模式部署calico,然后将原有的pod全部删掉重建,如下:

root@k8s-calico1:~# pods 
NAMESPACE     NAME                                       READY     STATUS             RESTARTS   AGE       IP                NODE
huang1        huangtest-69d9fffffd97-2b8hr                 1/1       Running            0          1m        192.168.97.1      k8s-calico2
huang1        huangtest-69d9fffffd97-npwzw                 1/1       Running            0          1m        192.168.210.65    k8s-calico4
huang2        hhh-6897d64fcd-kqsj4                       1/1       Running            0          10s       192.168.210.129   k8s-calico3

我们再去看看k8s-calico2这个node 上的路由,同样的需要我们关注的路由有下面的几条:

root@k8s-calico2:~# ip r  |grep bird
192.168.97.1 dev cali3683f65394b scope link
blackhole 192.168.97.0/26 proto bird 
192.168.110.64/26 via 10.173.32.24 dev tunl0 proto bird onlink 
192.168.210.64/26 via 10.173.32.25 dev tunl0 proto bird onlink 
192.168.210.128/26 via 10.173.32.26 dev tunl0 proto bird onlink

前两条不再赘述,我们看到最后三条路由,其实他们描述的逻辑与BGP的那两条没有差别,只不过网卡换成了tunl0.

我们以一个例子来解释清楚:pod huangtest-69d9fffffd97-2b8hr ping hhh-6897d64fcd-kqsj4

0、封装报文,SRCIP:192.168.97.1 DESTIP:192.168.210.129
1、容器中只有eth0网卡,容器里ip r 看到的是default **** dev eth0,所以流量通过容器的eth0发送。
2、容器网卡的配置是通过vethpair做的,也就是说,容器里网卡发的包,在宿主机上都会被calic285cddbb40设备发出。
3、通过第2步,网络报文就在宿主机的网络中,受宿主机路由影响,192.168.210.128/26 via 10.173.32.26 dev tunl0 proto bird onlink 识别到匹配的对端IP,将报文从tunl0发出到10.173.32.26。这里,tunl0会对报文进行封装,在原有的ip报文之上封装了一个ip头部,新的头部中,srcip是宿主机自身的ip:10.173.32.23, destip是对端的ip地址:10.173.32.26。
我们可以通过tcpdump抓包看到这个步骤:
封装前:

封装后(注意到输出内容结尾有ipip-proto-4):


4、由于宿主机上只有一个eth的物理机网卡,所以流量终究还是从eth0向外发出到10.173.32.26。10.173.32.26这个节点的eth0网卡,收到了报文后,发现带有ipip协议的标记(第3步中tcpdump抓包看到的ipip-proto-4),将ipip头部解开,于是处理到了真实的报文。
5、宿主机上192.168.210.129 dev cali5ce61eb6bc2 scope link 这个路由将包发给vethpair,从而被容器内的eth0接收。
6、icmp响应包的走向与上述的走向逻辑上相同。

待定:补充ipip和bgp的使用场景。以及calico的BGP路由配置方法(AS,node-mesh)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32740.html

相关文章

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

    摘要:第层网络的一个值得注意的示例是以太网,其中表示为子层。与其他方案相比,相对容易安装和配置。与不同,不使用网络。网络策略是其最受追捧的功能之一。 本文将在介绍技术原理和相应术语的基础上,再集中探索与详细对比目前最流行的CNI插件:Flannel、Calico、Weave和Canal,对比介绍它们的原理、使用方法、适用场景和优缺点等。 showImg(https://segmentfaul...

    scq000 评论0 收藏0
  • Kubernetes CNI网络最强对比:Flannel、Calico、Canal和Weave

    摘要:第层网络的一个值得注意的示例是以太网,其中表示为子层。与其他方案相比,相对容易安装和配置。与不同,不使用网络。网络策略是其最受追捧的功能之一。 本文将在介绍技术原理和相应术语的基础上,再集中探索与详细对比目前最流行的CNI插件:Flannel、Calico、Weave和Canal,对比介绍它们的原理、使用方法、适用场景和优缺点等。 showImg(https://segmentfaul...

    Noodles 评论0 收藏0
  • Calico 网络通信原理揭秘

    摘要:是一个纯三层的数据中心网络方案,而且无缝集成像这种云架构,能够提供可控的容器裸机之间的通信。网络模型揭秘下面我们通过具体的例子来帮助大家理解网络的通信原理。 Calico 是一个纯三层的数据中心网络方案,而且无缝集成像 OpenStack 这种 Iaas 云架构,能够提供可控的 VM、容器、裸机之间的 IP 通信。为什么说它是纯三层呢?因为所有的数据包都是通过路由的形式找到对应的主机和...

    everfight 评论0 收藏0
  • docker网络方案简介

    摘要:模式容器直接使用宿主机的网络配置,包括网卡,路由等,这种方案下,从网络层面来看,容器就不是容器了,只是一个宿主机上的进程端口而已。 注:本篇仅仅是对各个网络方案的简介和思考。需要深入学习如何部署和使用的同学请自行度娘~ 中小docker用户的苦恼 docker的使用者十分广泛,不止有网易蜂巢,daocloud,时速云这类的已经成熟化的公有云服务,许多中小型企业内部也在试图将docker...

    bbbbbb 评论0 收藏0
  • docker网络方案简介

    摘要:模式容器直接使用宿主机的网络配置,包括网卡,路由等,这种方案下,从网络层面来看,容器就不是容器了,只是一个宿主机上的进程端口而已。 注:本篇仅仅是对各个网络方案的简介和思考。需要深入学习如何部署和使用的同学请自行度娘~ 中小docker用户的苦恼 docker的使用者十分广泛,不止有网易蜂巢,daocloud,时速云这类的已经成熟化的公有云服务,许多中小型企业内部也在试图将docker...

    ?xiaoxiao, 评论0 收藏0

发表评论

0条评论

Prasanta

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<