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 作为后端运行 MetalLBMetalLB 会生成与应用的 MetalLB 配置对应的 FRR-K8s 配置。

MetalLB 与 FRR 集成

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.5BGPPeer 公告的所有前缀:

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

1 2
如果前缀长度小于或等于 le 的前缀长度,且大于或等于 ge 的前缀长度,则应用前缀。

以下示例将 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 自定义资源的字段在下表中描述:

表 32.9. MetalLB FRRConfiguration 自定义资源
字段类型描述

spec.bgp.routers

数组

指定 FRR 来配置的路由器(每个 VRF 一个)。

spec.bgp.routers.asn

整数

用于会话本地端的自主系统编号。

spec.bgp.routers.id

string

指定 bgp 路由器的 ID。

spec.bgp.routers.vrf

string

指定用于建立来自此路由器会话的主机 vrf。

spec.bgp.routers.neighbors

数组

指定要建立 BGP 会话的邻居。

spec.bgp.routers.neighbors.asn

整数

指定用于会话本地端的自主系统编号。

spec.bgp.routers.neighbors.address

string

指定要建立会话的 IP 地址。

spec.bgp.routers.neighbors.port

整数

指定建立会话时要结束的端口。默认值为 179。

spec.bgp.routers.neighbors.password

string

指定用来建立 BGP 会话的密码。passwordPasswordSecret 是互斥的。

spec.bgp.routers.neighbors.passwordSecret

string

指定邻居的身份验证 secret 的名称。secret 必须是 "kubernetes.io/basic-auth" 类型,并且与 FRR-K8s 守护进程位于同一个命名空间中。密钥 "password" 将密码存储在 secret 中。passwordPasswordSecret 是互斥的。

spec.bgp.routers.neighbors.holdTime

duration

根据 RFC4271 指定请求的 BGP 保留时间。默认为 180s。

spec.bgp.routers.neighbors.keepaliveTime

duration

根据 RFC4271 指定请求的 BGP keepalive 时间。默认值为 60s

spec.bgp.routers.neighbors.connectTime

duration

指定 BGP 在连接尝试到邻居之间等待的时间。

spec.bgp.routers.neighbors.ebgpMultiHop

布尔值

指明 BGPPeer 是否离开了多跃点。

spec.bgp.routers.neighbors.bfdProfile

string

指定用于与 BGP 会话关联的 BFD 会话的 BFD Profile 名称。如果没有设置,则不会设置 BFD 会话。

spec.bgp.routers.neighbors.toAdvertise.allowed

数组

表示要公告给邻居的前缀列表,以及相关的属性。

spec.bgp.routers.neighbors.toAdvertise.allowed.prefixes

字符串数组

指定要公告到邻居的前缀列表。此列表必须与您在路由器中定义的前缀匹配。

spec.bgp.routers.neighbors.toAdvertise.allowed.mode

string

指定处理前缀时要使用的模式。您可以将 filtered 设置为只允许前缀列表中的前缀。您可以设置为 all,以允许路由器上配置的所有前缀。

spec.bgp.routers.neighbors.toAdvertise.withLocalPref

数组

指定与公告的本地首选项关联的前缀。您必须在允许公告的前缀中指定与本地首选项关联的前缀。

spec.bgp.routers.neighbors.toAdvertise.withLocalPref.prefixes

字符串数组

指定与本地首选项关联的前缀。

spec.bgp.routers.neighbors.toAdvertise.withLocalPref.localPref

整数

指定与前缀关联的本地首选项。

spec.bgp.routers.neighbors.toAdvertise.withCommunity

数组

指定与公告的 BGP 社区关联的前缀。您必须在您要公告的前缀列表中包含与本地首选项关联的前缀。

spec.bgp.routers.neighbors.toAdvertise.withCommunity.prefixes

字符串数组

指定与社区关联的前缀。

spec.bgp.routers.neighbors.toAdvertise.withCommunity.community

string

指定与前缀关联的社区。

spec.bgp.routers.neighbors.toReceive

数组

指定要从邻居接收的前缀。

spec.bgp.routers.neighbors.toReceive.allowed

数组

指定要从邻居接收的信息。

spec.bgp.routers.neighbors.toReceive.allowed.prefixes

数组

指定来自邻居的前缀。

spec.bgp.routers.neighbors.toReceive.allowed.mode

string

指定处理前缀时要使用的模式。当设置为 filtered 时,只允许 prefixes 列表中的前缀。当设置为 all 时,允许路由器上配置的所有前缀。

spec.bgp.routers.neighbors.disableMP

布尔值

禁用 MP BGP 以防止它将 IPv4 和 IPv6 路由划分为不同的 BGP 会话。

spec.bgp.routers.prefixes

字符串数组

指定从此路由器实例公告的所有前缀。

spec.bgp.bfdProfiles

数组

指定配置邻居时要使用的 bfd 配置集列表。

spec.bgp.bfdProfiles.name

string

要在配置的其他部分中引用的 BFD 配置集的名称。

spec.bgp.bfdProfiles.receiveInterval

整数

指定此系统可以接收控制数据包的最小间隔(以毫秒为单位)。默认值为 300ms

spec.bgp.bfdProfiles.transmitInterval

整数

指定排除 jitter 的最小传输间隔,此系统希望用来发送 BFD 控制数据包(以毫秒为单位)。默认值为 300ms

spec.bgp.bfdProfiles.detectMultiplier

整数

配置检测倍数以确定数据包丢失。要确定连接丢失检测计时器,请将远程传输间隔乘以这个值。

spec.bgp.bfdProfiles.echoInterval

整数

配置此系统可以处理的最小 echo receive transfer-interval (以毫秒为单位)。默认值为 50ms

spec.bgp.bfdProfiles.echoMode

布尔值

启用或禁用回显传输模式。这个模式默认为禁用,在多跃点设置中不支持。

spec.bgp.bfdProfiles.passiveMode

布尔值

将会话标记为被动。被动会话不会尝试启动连接,并在开始回复前等待来自对等的控制数据包。

spec.bgp.bfdProfiles.MinimumTtl

整数

仅限多跃点会话。为传入的 BFD 控制数据包配置最低预期 TTL。

spec.nodeSelector

string

限制尝试应用此配置的节点。如果指定,则只有标签与指定选择器匹配的节点才会应用配置。如果没有指定,则所有节点都会尝试应用此配置。

status

string

定义 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 合并每个邻居的所有过滤器。
注意

不太严格的过滤会优先于更严格的过滤。例如,接受某些前缀的过滤会优先于不接受任何前缀的过滤,接受所有前缀的过滤优先于接受部分前缀的过滤。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.