文章目录
- 为什么需要calico?
-
- -网络插件”千千万”,为何k8s要用calico
-
- calico的架构
- calico Pod 跨node通信
- tunl0 的作用?
- 为什么所有pod的默认网关都是`169.254.1.1` ?
- 什么是ARP 代理?
- jksj BGP模式的calico工作原理
- calico BGP 模式的限制
- Calico 的IPIP 模式解决了什么问题?
- jksj IPIP模式的calico工作原理
- IPIP封包模式
- IPIP网络模型
- 模拟 calico 数据流向图
- 在calico眼里节点是什么角色?
- calico 的Node-to-Node Mesh 模式和Route Reflector 的模式区别与使用场景?
- ipvs 模式下主机上的kube-ipvs0设备是什么?
- Calico 日志如何查看?
- calico的运行模式是什么?如何确定?
- calico Node A 的POD ping Node B的POD
- 容器世界的veth pari性能损耗
为什么需要calico?
Status: Not Started
Tags: 网络, 面试
-网络插件”千千万”,为何k8s要用calico
Calico作为容器网络方案和我们前面介绍的那些方案最大的不同是它没有采用overlay网络做报文的转发,而是提供了纯3层的网络模型.
三层通信模型表示每个容器都通过IP直接通信,中间通过路由转发找到对方。在这个过程中,容器所在的节点类似于传统的路由器,提供了路由查找的功能。要想路由能够正常工作,每个容器所在的主机节点扮演了虚拟路由器(vRouter)的功能,而且这些vRouter必须有某种方法,能够知道整个集群的路由信息。(必须开启内核ip forward )
Calico是一个基于BGP的纯三层的数据中心网络方案(也支持overlay网络),并且与Kubernetes、OpenStack、AWS、GCE等IaaS和容器平台有良好的集成。
Calico的设计比较新颖,*之前提到flannel的host-gw模式之所以不能跨二层网络,是因为它只能修改主机的路由,Calico把改路由表的做法换成了标准的BGP路由协议。*相当于在每个节点上模拟出一个额外的路由器,由于采用的是标准协议,Calico模拟路由器的路由表信息可以被传播到网络的其他路由设备中,这样就实现了在三层网络上的高速跨节点网络。
calico的架构
Calico组件主要架构由Felix、Confd、BIRD组成:
- Felix是负责Calico Node运行并作为每个节点Endpoint端点的守护程序,它负责管理当前主机中的Pod信息,与集群etcd服务交换集群Pod信息,并组合路由信息和ACL策略。
- Confd是负责存储集群etcd生成的Calico配置信息,提供给BIRD层运行时使用。
- **BIRD(BIRD Internet Routing Daemon)是核心组件,**Calico中的BIRD特指BIRD Client和BIRD Route Reflector,负责主动读取Felix在本机上设置的路由信息,并通过BGP广播协议在数据中心中进行分发路由。
calico Pod 跨node通信
1、 ping 数据包从pod1从容器的eth0发出后,发现目标ip不是一个子网,所以直接走网关出去
2、pod 的网关是169.254.1.1
3、对网关IP发起ARP请求,谁是169.254.1.1?mac地址是?发现是一个全E的MAC地址
[root@node2 ~]#arping 169.254.1.1
ARPING 169.254.1.1 from 10.244.104.5 eth0
Unicast reply from 169.254.1.1 [EE:EE:EE:EE:EE:EE] 0.540ms
Unicast reply from 169.254.1.1 [EE:EE:EE:EE:EE:EE] 0.550ms
Unicast reply from 169.254.1.1 [EE:EE:EE:EE:EE:EE] 0.540ms
4、node1的 veth pari 端calixxx收到 这个ARP 请求。通过开启网卡的代理 ARP 功能直接把自己的 MAC 地址返回给 pod1。
pod1中的mac 和calixx的mac都是全e,通过在宿主机上查询ARP表得知需要转达到哪个calixxx
可以看下面的抓包数据。
5、pod1 发送目的地址为pod2的IP 数据包(1-4主要是构造二层包)
6、不在一个子网,本地无法处理,数据包查找本地路由表,匹配到如下路由表:
10.244.136.0/26 via 10.50.10.33 dev tunl0 proto bird onlink
经过tunl0封包之后转发到10.50.10.33 也就是master3
此时IP数据报中Inner IP Header的IP:10.244.166.179 --> 10.244.136.13, OuterIP Header:10.50.10.34 → 10.50.10.33
7、tunl0收到数据包之后会按照ipip协议规范对进来的IP数据包封装一层外层IP头,外层IP的目的ip地址根据6步骤中的路由设置目的ip为网关10.50.10.33,外层IP的源ip地址为本node的ip 10.50.10.34。此时IP数据报变为:
Outer IP Header的IP:10.50.10.34 --> 10.50.10.33;
Inner IP Header的IP:10.244.166.179 --> 10.244.136.13。
tunl0把接收到的数据包封装成ipip报文直接发给tcp/ip协议栈。
8、tcp/ip协议栈根据ipip报文的目的地址和系统路由表(如果在一个子网就不需要),知道目的地址为10.50.10.33的数据报需要通过node master3 的eth0发送。
这一步对我的环境来说只直接二层转发因为是在同一个子网,不需要route
9、数据最终到达master3上的路由
10.244.136.13 dev cali3461c4b49f0 scope link
8、此时消息转发到了master3的veth pair calixxx端的设备,这个设备和容器另外一段的veth pair进行通信
容器内部的arp表
arp -a</