前言

了解k8s 容器网络的小伙伴肯定经常可以看到underlay 网络和bgp 相关的字眼,比如cilium calico 等等cni 都支持了bgp 协议,但是什么是bgp 和为什么要用到bgp 不太清楚,本文会从什么是bgp ,以及为什么要用到bgp 来揭开它的神秘面纱

什么是BGP

在了解BGP 之前我们需要了解一些背景知识

自治系统

随着IP 网络的发展,网络的规模越来越大,无论哪种路由协议都不能完成全网 的路由计算,因此网络分成了很多个自治系统( AS , Autonomous System )或路由选择域 ( Routing Domain ),自治系统可以制定自己的路由策 略,并管理自治系统内进行具体路由控制的路由器集合。

每个自治系统都有一个唯一的自治系统编号,它的基本思路是希望通过不同的编 号来区分不同的自治系统。通过路由协议和自治系统编号,路由器可以确定路由 路径和路由信息的交换方式。某个自治系统缺乏足够的安全机制,就可以利用编 号改变路径回避它。

图1为两个自治系统AS100和AS200之间的网络链接

图1

EGP和IGP

自治系统内部的动态路由协议被规定为域内路由协议即IGP,自治系统之间的路由协议则是域间路由协议EGP

如图1所示OSPF RIP 均属于IGP ,BGP 属于EGP

通俗来讲,BGP 是一个三层网络的路由协议,用来打通互联网中各个自治系统的网络,在云原生领域BGP协议用于打通云原生不同网络环境,比如容器网络和物理网络、集群内部网络和外部网络等。

为什么我们需要BGP

传统物理网络遇到的问题

1 因特网规模太大,AS 之间路由选择困难,如果使用链路状态路由协议,每个路由器必要保存一个很大的路由表

2 AS 之间路由选择必须考虑有关的策略,比如国内的AS 之间自然是不希望经过国外的AS

云原生网络遇到的问题

1 overlay 网络无法保证容器网络和集群外互通,一般underlay网络(比如flannel的hostgateway) 又会占用大量的物理IP,明显在我们的生成环境中我们想全都要,既要大量可用虚拟IP 又要极致网络性能

2 大集群跨网段跨vpc 的流量需要配置多条路由

BGP简单原理

BGP 采用TCP 来保证协议传输的可靠性,端口号为179,BGP 只负责传递路由信息,不会计算路由,不会暴露AS 内部的网络拓扑,BGP 的路由更新是触发更新,不是周期性更新。

在配置BGP 时,每个AS 都必须配置至少一个路由器作为BGP Speaker,两个BGP Speaker 通过共享网络连接在一起,两个相连的AS 之间通过BGP Speaker 之间建立TCP 连接来交换路由信息,两个建立链接的BGP Speaker 互称neighboor 或者peer,图2表示BGP Speaker 和AS 自己的关系,图中画出了三个AS 和五个BGP Speaker

图2

当BGP Speaker 建立连接并成功交换路由之后,每个BGP Speaker 会根据路由信息生成到达各AS 较好的路由如图2-1,生成的路由表信息是一个树形结构,不存在环路

图2-1

BGP 的几种报文

名称作用发送时刻
Open协商BGP对等体参数,建立对等体关系TCP 建联成功后
Update发送BGP 路由更新BGP 对等体关系建立之后,有路由需要发送或者路由变化时向peer发送Update 报文
Notification报告错误信息,中止对等关系当BGP在运行中发生错误时,发送Notification报文将错误通告给BGP peer
Keepalive标志peer 建立,维持BGP peer 关系BGP 路由器接到对端的keepalive 报文,将peer状态置为已建立,同时后续定期发送keepalive 报文保持连接
Route-refresh用于在改变路由策略后请求peer 重新发送路由信息,只有支持路由刷新能力的BGP 设备才能发送和相应此报文当路由策略发送变化时,触发请求peer重新通告路由

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐