配置 BGP 对等节点
当 kube-router 用于提供pod-to-pod网络连接时,BGP用于在节点间交换路由。ube-router提供灵活的网络模型,以支持不同环境的部署(公共云与私有云、可路由与不可路由pod IP、服务 IP 等)。
集群内对等节点
完全节点网格
这是默认模式。群集中的所有节点都与其他节点形成 iBGP 对等互联关系,形成一个全节点对节点网状结构。每个节点向其对等(群集中的其他节点)公布分配给节点的 pod CIDR。这种模式下无需配置。群集中的所有节点都与私有 ASN 64512 隐式关联(可使用"–cluster-asn "标记进行配置),iBGP 的使用用户来说是透明的。这种模式适用于公共云环境或小型群集部署。
非完全网格
这种模式用于支持每个群集不只一个 AS,以实现每个机架一个 AS 或每个节点一个AS。集群中的节点不会形成完整的节点对节点网状结构。用户必须通过指定nodes-full-mesh=false "来明确选择该模式。在这种模式下,kube-router 希望每个节点都通过节点的 API 对象注解中配置ASN 编号。Kube-router 将使用节点的 kube-router.io/node.asn
注解值作为 ASN编号键。注解值作为节点的 ASN编号值
用户可以使用以下命令注解节点对象:
kubectl annotate node <kube-node> "kube-router.io/node.asn=64512"
只有 ASN 相同的节点才能形成完整的网状结构。不同 ASN 的两个节点永远不会形成对等关系。
配有路由反射器的非完全网格
这种模式支持使用路由反射服务器节点汇聚客户端对等节点的常见方案。它的最大优点是不需要全网状结构,而且扩展性更好。在这种模式下,每个节点被kube-router 配置为路由反射服务器模式或路由反射客户端模式。分别通过kube-router.io/rr.server=ClusterID
、kube-router.io/rr.client=ClusterId
注解完成。在此模式下,每个路由路由反射器客户端只与路由反射器服务器对等。每个路由反射器服务器只与其他路由反射器服务器以及启用反射功能的路由反射器客户端对等。
对于路由反射器服务器模式,可以使用以下命令注解节点对象:
kubectl annotate node <kube-node> "kube-router.io/rr.server=42"
对应反射客户端模式的命令是:
kubectl annotate node <kube-node> "kube-router.io/rr.client=42"
只有客户端和服务器模式具有相同 ClusterID 的节点才能对等互联。将新节点加入集群时,请记住用 kube-router.io/rr.client=42
对其进行注解,然后在新节点和路由反射器服务器节点上重启重启 kube-router,让它们相互成功读取注解并形成对等。
集群外的对等网络
全局外部 BGP 对等点
可通过指定--peer-router-asns
和
--peer-router-ips
。参数配置可选的全局 BGP 对等网络,配置完成后,群集中的每个节点都会与指定的全局对等节点形成对等关系。Pod CIDR 和群集 IP 会被公布给全局 BGP 对等节点。为实现冗余,您还可以通过指定一个对等节点片段来配置多个路由。
示例:
--peer-router-ips="192.168.1.99,192.168.1.100"
--peer-router-asns=65000,65000
特定外部 BGP 对等节点
又者,每个节点都可以配置一个或多个特定于节点的 BGP 对等节点。有关节点特定
BGP 对等节点的信息可从节点 API 对象注解中读取:
kube-router.io/peer.ips
.kube-router.io/peer.asns
.
例如,用户可以使用以下命令注解节点对象:
kubectl annotate node <kube-node> "kube-router.io/peer.ips=192.168.1.99,192.168.1.100"
kubectl annotate node <kube-node> "kube-router.io/peer.asns=65000,65000"
AS 路径预置
出于流量整形的目的,需要将对等网络的 AS 路径公布给对等节点。这可以给每个节点添加一下注解完成:
kube-router.io/path-prepend.as
kube-router.io/path-prepend.repeat-n
如果您想将来自特定节点的所有路由都用 AS 65000 预置五次,您可以运行以下命令:
kubectl annotate node <kube-node> "kube-router.io/path-prepend.as=65000"
kubectl annotate node <kube-node> "kube-router.io/path-prepend.repeat-n=5"
BGP 对等节点本地 IP 配置
在某些设置中,可能需要设置用于连接外部 BGP 对等节点的本地 IP 地址。这可以
给节点增加一下注解完成:
kube-router.io/peer.localips
。
如果设置了该注释,它必须是一个包含每个对等节点的本地 IP 地址的列表,或者留空以使用 nodeIP。
栗子:
kubectl annotate node <kube-node> "kube-router.io/peer.localips=10.1.1.1,10.1.1.2"
这将指示 kube-router 将第一个 BGP 对等节点的 IP 10.1.1.1
用作本地地址,并将10.1.1.2
作为第二个节点的本地地址。
BGP对等节点密码验证
上述示例假定 BGP 对等路由器没有密码验证。如果需要使用密码进行对等互联,可以使用 --peer-router-passwords
命令行选项、kube-router.io/peer.passwords
节点注解,或使用 --peer-router-passwords-file
命令行选项。
Base64 编码密码
为确保密码易于解析,但不易被人眼读取,kube-router 要求将密码编码为
base64。
在 Linux 或 MacOS 系统上,您可以在命令行上对密码进行编码:
$ printf "SecurePassword" | base64
U2VjdXJlUGFzc3dvcmQ=
密码配置示例
在此 CLI 标志示例中,第一个路由器 (192.168.1.99) 使用密码,而第二个路由器 (192.168.1.100) 不使用密码。
--peer-router-ips="192.168.1.99,192.168.1.100"
--peer-router-asns="65000,65000"
--peer-router-passwords="U2VjdXJlUGFzc3dvcmQK,"
注意第一个密码末尾的逗号。
下面是相同的示例,但配置为节点注解:
kubectl annotate node <kube-node> "kube-router.io/peer.ips=192.168.1.99,192.168.1.100"
kubectl annotate node <kube-node> "kube-router.io/peer.asns=65000,65000"
kubectl annotate node <kube-node> "kube-router.io/peer.passwords=U2VjdXJlUGFzc3dvcmQK,"
最后,如果要将对等密码作为文件包含,可以使用以下选项运行 kube-router:
--peer-router-ips="192.168.1.99,192.168.1.100"
--peer-router-asns="65000,65000"
--peer-router-passwords-file="/etc/kube-router/bgp-passwords.conf"
密码文件紧跟命令行和节点注解选项的语法。
在这里,第一个对等 IP(192.168.1.99)将配置密码,而第二个对等 IP 则不配置密码。
U2VjdXJlUGFzc3dvcmQK,
注意,此文件不进行复杂解析,请不要在此文件的单行中包含除密码以外的其他内容。
BGP 社区
全局对等网络支持通过节点注释添加 BGP 社区。节点注释可表示为
- 一个 32 位整数
- 用冒号(
:
)分隔的两个 16 位整数 - 常见的 BGP 社区名称(如
no-export
,internet
,no-peer
等)
(见:WellKnownCommunityNameMap
在下面的示例中,我们通过注解将 NO_EXPORT
BGP 社区添加到两个节点上,使用了注解的所有三种形式。
kubectl annotate node <kube-node> "kube-router.io/node.bgp.communities=4294967041"
kubectl annotate node <kube-node> "kube-router.io/node.bgp.communities=65535:65281"
kubectl annotate node <kube-node> "kube-router.io/node.bgp.communities=no-export"
自定义 BGP 导入策略拒绝
默认情况下,kube-router 会接受其邻居发布的所有路由。
如果与某个邻居的 BGP 会话结束,GoBGP 会删除它收到的所有路由。
如果接收的路由之一是该节点正常工作所必需的(如:自定义静态路由),它可能会停止工作。
在下面的示例中,我们将通过自定义导入策略拒绝规则注释添加自定义前缀、防止节点丢失所需的路由:
kubectl annotate node <kube-node> "kube-router.io/node.bgp.customimportreject=10.0.0.0/16, 192.168.1.0/24"
BGP监听地址列表
默认情况下,GoBGP 服务器绑定节点 IP 地址。但在某些情况下,拥有多个 IP 地址的节点希望将 GoBGP 与多个本地地址绑定。节点上 GoGBP 应监听的本地 IP 地址可以通过注释 kube-router.io/bgp-local-addresses
来配置。
下面是让 GoBGP 服务器监听多个 IP 地址的示例:
kubectl annotate node ip-172-20-46-87.us-west-2.compute.internal "kube-router.io/bgp-local-addresses=172.20.56.25,192.168.1.99"
改写下一跳
默认情况下,kube-router 会将节点 IP 作为广告 pod CIDR 和服务 VIP 的下一跳填充到 GoBGP RIB 中。虽然这在大多数情况下都有效,但当节点有多个可通过其与外部对等设备连接的接口时,就有必要覆盖已公布路由的下一跳。下一跳需要定义为外部对等网络可以到达的接口。将 --override-nexthop
设为 true 可利用 GoBGP 中实现的 BGP next-hop-self 功能。GoBGP 中实现的BGP next-hop-self功能。在发布路由广告时,下一跳将自动被适当选择,而与 RIB 中的下一跳无关。
覆盖下一跳并启用 IPIP/隧道
常见的情况是,群集中的每个节点都连接到两个不同子网中的两个上游路由器。例如,一个路由器连接到公共网络子网,另一个路由器连接到私有网络子网。此外,节点可能被分割在不同的子网(如不同的机架)中,每个子网都有自己的路由器。
在这种情况下,"–override-nexthop "可用于与每个上游路由器正确对等,确保 BGP
下一跳属性正确设置为面向上游路由器的节点 IP 地址。启用覆盖--enable-overlay
选项可允许在不同子网之间进行overlay/underlay隧道,以实现互联的 pod网络。这种配置会产生以下影响:
-
通过 kube-router 提供的多种方式之一与群集外对等
-
覆盖下一跳
-
对在完全模式或不同子网中的节点启用overlays
这里的警告是,在上述情况下使用 --override-nexthop
选项时,可能会导致 kube-router 公布一个节点 IP 地址之外的 IP 地址,而节点 IP 正是 kube-router 在给定--enable-overlay
选项时连接隧道的地址。kube-router 会将隧道连接到节点 IP。如果出现这种情况,可能会导致某些网络流无法路由。
特别说一下,人们将–override-nexthop和
–enable-overlay结合使用
时需要小心谨慎,并确保明白网络和流程是他们想要的、kube-router 逻辑是如何工作的,以及其配置可能产生的副作用。有关风险和影响的讨论,请参阅 本 PR。