32.11. 配置 MetalLB 和 FRR-K8s 的集成
FRRConfiguration
自定义资源只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
FRRouting (FRR) 是一个免费的开源互联网路由协议套件,用于 Linux 和 UNIX 平台。FRR-K8s
是基于 Kubernetes 的 DaemonSet,它以 Kubernetes 兼容的方式公开 FRR
API 的子集。作为集群管理员,您可以使用 FRRConfiguration
自定义资源 (CR) 将 MetalLB
配置为使用 FRR-K8s
作为后端。您可以使用它来提供 FRR 服务,例如接收路由。如果您使用 FRR-K8s
作为后端运行 MetalLB
,MetalLB
会生成与应用的 MetalLB 配置对应的 FRR-K8s
配置。
32.11.1. 激活 MetalLB 和 FRR-K8s 的集成
以下流程演示了如何激活 FRR-K8s
作为 MetalLB
的后端。
先决条件
- 您已在裸机硬件上安装了集群。
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。
流程
将
MetalLB
CR 的bgpBackend
字段设置为frr-k8s
,如下例所示:apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system spec: bgpBackend: frr-k8s
32.11.2. FRR 配置
您可以创建多个 FRRConfiguration
CR,以便在 MetalLB
中使用 FRR
服务。MetalLB
生成一个 FRRConfiguration
对象,它 FRR-K8s
与所有用户创建的所有配置合并。
例如,您可以配置 FRR-K8s
,以接收给定邻居公告的所有前缀。以下示例将 FRR-K8s
配置为接收带有主机 172.18.0.5
的 BGPPeer
公告的所有前缀:
FRRConfiguration CR 示例
apiVersion: frrk8s.metallb.io/v1beta1 kind: FRRConfiguration metadata: name: test namespace: metallb-system spec: bgp: routers: - asn: 64512 neighbors: - address: 172.18.0.5 asn: 64512 toReceive: allowed: mode: all
您还可以将 FRR-K8s 配置为始终阻止一组前缀,而不考虑应用的配置。这可用于避免到可能造成集群故障的 pod 或 ClusterIP
CIDR 的路由。以下示例阻止了一组前缀 192.168.1.0/24
:
MetalLB CR 示例
apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system spec: bgpBackend: frr-k8s frrk8sConfig: alwaysBlock: - 192.168.1.0/24
您可以将 FRR-K8s
设置为阻止 Cluster Network
CIDR 和 Service Network
CIDR。您可以运行以下命令来查看这些 CIDR 地址规格的值:
$ oc describe network.config/cluster
32.11.3. 配置 FRRConfiguration CRD
以下部分提供了使用 FRRConfiguration
自定义资源 (CR) 的参考示例。
32.11.3.1. router 字段
您可以使用 router
字段配置多个路由器,每个虚拟路由和转发 (VRF) 资源对应一个。对于每个路由器,您必须定义自主系统号 (ASN)。
您还可以定义要连接的边框网关协议 (BGP) 邻居列表,如下例所示:
FRRConfiguration CR 示例
apiVersion: frrk8s.metallb.io/v1beta1 kind: FRRConfiguration metadata: name: test namespace: frr-k8s-system spec: bgp: routers: - asn: 64512 neighbors: - address: 172.30.0.3 asn: 4200000000 ebgpMultiHop: true port: 180 - address: 172.18.0.6 asn: 4200000000 port: 179
32.11.3.2. toAdvertise 字段
默认情况下,FRR-K8s
不会公告配置为路由器配置的前缀。要公告它们,您可以使用 toAdvertise
字段。
您可以公告前缀的子集,如下例所示:
FRRConfiguration CR 示例
apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
name: test
namespace: frr-k8s-system
spec:
bgp:
routers:
- asn: 64512
neighbors:
- address: 172.30.0.3
asn: 4200000000
ebgpMultiHop: true
port: 180
toAdvertise:
allowed:
prefixes: 1
- 192.168.2.0/24
prefixes:
- 192.168.2.0/24
- 192.169.2.0/24
- 1
- 广告一个前缀子集。
以下示例演示了如何公告所有前缀:
FRRConfiguration CR 示例
apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
name: test
namespace: frr-k8s-system
spec:
bgp:
routers:
- asn: 64512
neighbors:
- address: 172.30.0.3
asn: 4200000000
ebgpMultiHop: true
port: 180
toAdvertise:
allowed:
mode: all 1
prefixes:
- 192.168.2.0/24
- 192.169.2.0/24
- 1
- 公告所有前缀。
32.11.3.3. toReceive 字段
默认情况下,FRR-K8s
不处理邻居公告的任何前缀。您可以使用 toReceive
字段来处理此类地址。
您可以为前缀的子集配置,如下例所示:
FRRConfiguration CR 示例
apiVersion: frrk8s.metallb.io/v1beta1 kind: FRRConfiguration metadata: name: test namespace: frr-k8s-system spec: bgp: routers: - asn: 64512 neighbors: - address: 172.18.0.5 asn: 64512 port: 179 toReceive: allowed: prefixes: - prefix: 192.168.1.0/24 - prefix: 192.169.2.0/24 ge: 25 1 le: 28 2
以下示例将 FRR 配置为处理声明的所有前缀:
FRRConfiguration CR 示例
apiVersion: frrk8s.metallb.io/v1beta1 kind: FRRConfiguration metadata: name: test namespace: frr-k8s-system spec: bgp: routers: - asn: 64512 neighbors: - address: 172.18.0.5 asn: 64512 port: 179 toReceive: allowed: mode: all
32.11.3.4. bgp 字段
您可以使用 bgp
字段定义各种 BFD
配置集,并将它们与邻居关联。在以下示例中,BFD
备份 BGP
会话,FRR
可以检测链接失败:
FRRConfiguration CR 示例
apiVersion: frrk8s.metallb.io/v1beta1 kind: FRRConfiguration metadata: name: test namespace: frr-k8s-system spec: bgp: routers: - asn: 64512 neighbors: - address: 172.30.0.3 asn: 64512 port: 180 bfdProfile: defaultprofile bfdProfiles: - name: defaultprofile
32.11.3.5. nodeSelector 字段
默认情况下,FRR-K8s
将配置应用到守护进程运行的所有节点。您可以使用 nodeSelector
字段指定要应用配置的节点。例如:
FRRConfiguration CR 示例
apiVersion: frrk8s.metallb.io/v1beta1 kind: FRRConfiguration metadata: name: test namespace: frr-k8s-system spec: bgp: routers: - asn: 64512 nodeSelector: labelSelector: foo: "bar"
FRRConfiguration
自定义资源的字段在下表中描述:
字段 | 类型 | 描述 |
---|---|---|
|
| 指定 FRR 来配置的路由器(每个 VRF 一个)。 |
|
| 用于会话本地端的自主系统编号。 |
|
|
指定 |
|
| 指定用于建立来自此路由器会话的主机 vrf。 |
|
| 指定要建立 BGP 会话的邻居。 |
|
| 指定用于会话本地端的自主系统编号。 |
|
| 指定要建立会话的 IP 地址。 |
|
| 指定建立会话时要结束的端口。默认值为 179。 |
|
|
指定用来建立 BGP 会话的密码。 |
|
|
指定邻居的身份验证 secret 的名称。secret 必须是 "kubernetes.io/basic-auth" 类型,并且与 FRR-K8s 守护进程位于同一个命名空间中。密钥 "password" 将密码存储在 secret 中。 |
|
| 根据 RFC4271 指定请求的 BGP 保留时间。默认为 180s。 |
|
|
根据 RFC4271 指定请求的 BGP keepalive 时间。默认值为 |
|
| 指定 BGP 在连接尝试到邻居之间等待的时间。 |
|
| 指明 BGPPeer 是否离开了多跃点。 |
|
| 指定用于与 BGP 会话关联的 BFD 会话的 BFD Profile 名称。如果没有设置,则不会设置 BFD 会话。 |
|
| 表示要公告给邻居的前缀列表,以及相关的属性。 |
|
| 指定要公告到邻居的前缀列表。此列表必须与您在路由器中定义的前缀匹配。 |
|
|
指定处理前缀时要使用的模式。您可以将 |
|
| 指定与公告的本地首选项关联的前缀。您必须在允许公告的前缀中指定与本地首选项关联的前缀。 |
|
| 指定与本地首选项关联的前缀。 |
|
| 指定与前缀关联的本地首选项。 |
|
| 指定与公告的 BGP 社区关联的前缀。您必须在您要公告的前缀列表中包含与本地首选项关联的前缀。 |
|
| 指定与社区关联的前缀。 |
|
| 指定与前缀关联的社区。 |
|
| 指定要从邻居接收的前缀。 |
|
| 指定要从邻居接收的信息。 |
|
| 指定来自邻居的前缀。 |
|
|
指定处理前缀时要使用的模式。当设置为 |
|
| 禁用 MP BGP 以防止它将 IPv4 和 IPv6 路由划分为不同的 BGP 会话。 |
|
| 指定从此路由器实例公告的所有前缀。 |
|
| 指定配置邻居时要使用的 bfd 配置集列表。 |
|
| 要在配置的其他部分中引用的 BFD 配置集的名称。 |
|
|
指定此系统可以接收控制数据包的最小间隔(以毫秒为单位)。默认值为 |
|
|
指定排除 jitter 的最小传输间隔,此系统希望用来发送 BFD 控制数据包(以毫秒为单位)。默认值为 |
|
| 配置检测倍数以确定数据包丢失。要确定连接丢失检测计时器,请将远程传输间隔乘以这个值。 |
|
|
配置此系统可以处理的最小 echo receive transfer-interval (以毫秒为单位)。默认值为 |
|
| 启用或禁用回显传输模式。这个模式默认为禁用,在多跃点设置中不支持。 |
|
| 将会话标记为被动。被动会话不会尝试启动连接,并在开始回复前等待来自对等的控制数据包。 |
|
| 仅限多跃点会话。为传入的 BFD 控制数据包配置最低预期 TTL。 |
|
| 限制尝试应用此配置的节点。如果指定,则只有标签与指定选择器匹配的节点才会应用配置。如果没有指定,则所有节点都会尝试应用此配置。 |
|
| 定义 FRRConfiguration 的观察状态。 |
32.11.4. FRR-K8s 如何合并多个配置
如果多个用户添加选择同一节点的配置,FRR-K8s
会合并配置。每个配置都只能扩展其他配置。这意味着,可以添加新的邻居到路由器,或向邻居公告额外的前缀,但不能删除由其他配置添加的组件。
32.11.4.1. 配置冲突
某些配置可能会导致冲突,从而导致错误,例如:
- 同一路由器的不同 ASN (在同一 VRF 中)
- 同一邻居的不同 ASN (具有相同 IP / 端口)
- 多个带有相同名称的 BFD 配置集,但不同的值
当守护进程为节点找到无效的配置时,它会将配置报告为无效,并恢复到之前有效的 FRR
配置。
32.11.4.2. 合并
在合并时,可以执行以下操作:
- 将您要公告的 IP 集合扩展到邻居。
- 使用 IP 集合添加额外的邻居。
- 扩展您要关联社区的 IP 集合。
- 允许邻居的传入路由。
每个配置都必须自包含。例如,通过利用来自其他配置的前缀,不允许在路由器部分中定义的前缀。
如果要应用的配置兼容,则合并可以正常工作,如下所示:
-
frr-K8s
结合了所有路由器。 -
frr-K8s
合并每个路由器的所有前缀和邻居。 -
frr-K8s
合并每个邻居的所有过滤器。
不太严格的过滤会优先于更严格的过滤。例如,接受某些前缀的过滤会优先于不接受任何前缀的过滤,接受所有前缀的过滤优先于接受部分前缀的过滤。