【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 协议更新过程。

参考资料


debian 升级内核

本文使用 Debian 9 stretch/ Debian 10 buster进行内核升级。Debian 9 默认是 4.9 的内核。Debian 10 默认是 4.19 的内核。

修改源

# debian 9
echo -e "deb http://http.debian.net/debian stretch-backports main\ndeb-src http://http.debian.net/debian stretch-backports main" | sudo tee /etc/apt/sources.list.d/sources.list

# debian 10 
echo -e "\ndeb https://deb.debian.org/debian buster-backports main" >> /etc/apt/sources.list

更新package

sudo apt-get update
sudo apt-get dist-upgrade

查看内核列表

apt-cache search linux-image

查看到最新的内核如下

image-20210126104152271

安装

# debian 9
sudo apt-get install -t stretch-backports linux-image-xxx版本

# debian 10
sudo apt-get install -t buster-backports linux-image-4.19.0-16-amd64

加载内核

# sudo update-grub # 这句不使用也ok的
sudo apt-get clean
sudo reboot

检查下,已经切到了新内核

uname -r

4.19.0-0.bpo.13-amd64

清理

apt-get autoremove

1585879018684

安装headers

很多情况下,我们还需要使用headers进行其它软件的安装。经常会遇到无法安装的情况,为了避免这种情况,这里也记录一下headers的安装过程。

安装前要重启机器,确保目前已使用升级后的内核。

reboot
uname -a

安装:

sudo apt-get install libmnl-dev linux-headers-$(uname -r) build-essential make git # 安装必要的包

echo "deb http://deb.debian.org/debian/ unstable main" | sudo tee /etc/apt/sources.list.d/unstable.list
echo -e "Package: *\nPin: release a=unstable\nPin-Priority: 150\n" | tee /etc/apt/preferences.d/limit-unstable

apt-get update
apt-get upgrade