【Calico系列】5 kubernetes BGP 更新报文
2020-04-20 tech kubernetes bgp calico 5 mins 6 图 1831 字
前言
Calico 是容器网络的一种解决方案,提供了纯 3 层的网络模型,每个容器都通过 IP 直接通信,中间通过路由转发找到对方。容器所在的节点充当传统的路由器,提供了路由查找的功能。
我计划将 Calico/BGP 相关的内容都过一遍,把这个过程记录下来。本篇是对 bgp 报文的抓包记录,便于在学习bgp中更有实感。
由于网络的水深与个人能力有限,本文不免存在错误之处。如有疑问,请查阅文末参考资料或与我线上/线下讨论。
背景
kubernetes 部署在裸金属上,使用 calico BGP 并与交换机交换路由,可以充分发挥硬件的速度优势。具体部署架构可参考 calico 官方的部署模式 Calico over IP fabrics #The AS Per Rack model, leaf-spine 二层架构:
其中 Spine 与 Leaf 之间使用三层 ebgp 互联,每个机柜是一个 AS,机柜内使用 ibgp 协议互联,柜顶交换机与核心交换机使用 ebgp互联。
数据中心BGP路由协议规划
BGP 最初是为不同自治系统之间的互通设计的,它也可以用在数据中心内部。现代数据中心中使用最广泛的路由协议就是 BGP。但在 BGP 引入到数据中心场景时,网络规划需要考虑不少问题。
如下图是某厂商典型的三级CLOS数据中心组网:
BGP设计要点大致如下:
- 为Tor、Leaf、Spine设备规划 AS号
- 设备间建立 BGP 邻居
- 为CLOS网络生成 ECMP 等价路由
- 对不同类型的 BGP 路由进行路由属性控制
- 指定路由传递规则
- 使用双向转发检测协议(BFD)加快故障收敛
对于以上涉及要点,Kubernetes 裸金属需要完成如下基础配置:
-
BGP计时器,keepalive/hold timer
配置为1S/3S,在数据中心内部,故障的快速收敛更为重要,配置为1S/3S加快收敛。
-
发布路由通告的间隔,Advertisement Interval
配置为0,立即发布。
-
bgp log-neighbor-changes
启用交换机侧BGP日志功能,BGP邻居关系建立以及断开时会生成日志信息。
-
BGP ECMP
不同交换机支持可能不同,一般默认为8,推荐配置为 32。
抓包
假定主机使用 bond0 网卡与集群内外部互访,使用如下命令抓包
$ sudo tcpdump -w `hostname`-` date "+%m%d-%H%M"`-bgp.pcap -i bond0
由于配置了BGP keepalive为1s,我们观察到每隔1s会有一次心跳包检测。
路由更新
在这里我简单地用两个 Tor ebgp 互联,架构如下:
(ebgp)|-------------------------|(ebgp)
| |
(172.16.0.26/30) (172.16.0.22/30)
Tor1(AS65412) Tor2(AS65413)
(10.90.0.254/25) (10.90.0.126/25)
| | |
|(ibgp) |(ibgp) |(ibgp)
▲131 ▲85 ▲86
▲为服务器,Tor1和Tor2为柜顶交换机
86节点向 Tor2 广播明10.90.20.128/27 的路由:
交换机 Tor2 添加originator_ID和Cluster_list,用于IBGP防环。而后它 使用 update 信息传给同一个 AS 内的 peer 85
同时 Tor2 向 Tor1 发 ebgp 请求,由于 ebgp 的特性,路由携带的Cluster-list和originator全部消失。
(截图空缺=。=)
然后Tor1向 同一个 AS 内的 peer 发送 update 信息:
结束
本文对 bgp 的 update 报文做了简单的记录,便于新人理解 bgp 协议更新过程。