【Calico系列】5 kubernetes BGP 更新报文

前言

Calico 是容器网络的一种解决方案,提供了纯 3 层的网络模型,每个容器都通过 IP 直接通信,中间通过路由转发找到对方。容器所在的节点充当传统的路由器,提供了路由查找的功能。

我计划将 Calico/BGP 相关的内容都过一遍,把这个过程记录下来。本篇是对 bgp 报文的抓包记录,便于在学习bgp中更有实感。

由于网络的水深与个人能力有限,本文不免存在错误之处。如有疑问,请查阅文末参考资料或与我线上/线下讨论。

背景

kubernetes 部署在裸金属上,使用 calico BGP 并与交换机交换路由,可以充分发挥硬件的速度优势。具体部署架构可参考 calico 官方的部署模式 Calico over IP fabrics #The AS Per Rack model, leaf-spine 二层架构:

img

其中 Spine 与 Leaf 之间使用三层 ebgp 互联,每个机柜是一个 AS,机柜内使用 ibgp 协议互联,柜顶交换机与核心交换机使用 ebgp互联。

数据中心BGP路由协议规划

BGP 最初是为不同自治系统之间的互通设计的,它也可以用在数据中心内部。现代数据中心中使用最广泛的路由协议就是 BGP。但在 BGP 引入到数据中心场景时,网络规划需要考虑不少问题。

如下图是某厂商典型的三级CLOS数据中心组网:

img

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会有一次心跳包检测。

1587390182337

路由更新

在这里我简单地用两个 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 的路由:

1587390389534

交换机 Tor2 添加originator_ID和Cluster_list,用于IBGP防环。而后它 使用 update 信息传给同一个 AS 内的 peer 85

1587390976168

同时 Tor2 向 Tor1 发 ebgp 请求,由于 ebgp 的特性,路由携带的Cluster-list和originator全部消失。

(截图空缺=。=)

然后Tor1向 同一个 AS 内的 peer 发送 update 信息:

1587391270606

结束

本文对 bgp 的 update 报文做了简单的记录,便于新人理解 bgp 协议更新过程。

参考资料


道家到底高明在哪儿? 写一个开源的 macOS 程序可以赚多少钱?- 子骅 luin