×

FRRouting (FRR) 是一个免费的开源互联网路由协议套件,适用于 Linux 和 UNIX 平台。FRR-K8s 是一个基于 Kubernetes 的 DaemonSet,它以 Kubernetes 兼容的方式公开 FRR API 的一个子集。作为集群管理员,您可以使用 FRRConfiguration 自定义资源 (CR) 来访问 MetalLB 未提供的某些 FRR 服务,例如接收路由。MetalLB 会生成与应用的 MetalLB 配置相对应的 FRR-K8s 配置。

MetalLB integration with FRR

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 或可能导致集群故障的 ClusterIPs 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 来阻止 集群网络 CIDR 和 服务网络 CIDR。您可以通过运行以下命令查看这些 CIDR 地址规范的值

$ oc describe network.config/cluster

配置 FRRConfiguration CRD

以下部分提供使用 FRRConfiguration 自定义资源 (CR) 的参考示例。

routers 字段

您可以使用 routers 字段配置多个路由器,每个虚拟路由和转发 (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

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 通告所有前缀。

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 (1)
1 如果前缀长度小于或等于 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

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

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 自定义资源的字段在下面的表格中描述

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

spec.bgp.routers

数组

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

spec.bgp.routers.asn

整数

会话本地端要使用的自治系统编号。

spec.bgp.routers.id

字符串

指定 bgp 路由器的 ID。

spec.bgp.routers.vrf

字符串

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

spec.bgp.routers.neighbors

数组

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

spec.bgp.routers.neighbors.asn

整数

指定会话本地端要使用的自治系统编号。

spec.bgp.routers.neighbors.address

字符串

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

spec.bgp.routers.neighbors.port

整数

指定建立会话时要拨号的端口。默认为 179。

spec.bgp.routers.neighbors.password

字符串

指定用于建立 BGP 会话的密码。PasswordPasswordSecret 是互斥的。

spec.bgp.routers.neighbors.passwordSecret

字符串

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

spec.bgp.routers.neighbors.holdTime

持续时间

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

spec.bgp.routers.neighbors.keepaliveTime

持续时间

指定根据 RFC4271 请求的 BGP 保持活动时间。默认为 60 秒

spec.bgp.routers.neighbors.connectTime

持续时间

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

spec.bgp.routers.neighbors.ebgpMultiHop

布尔值

指示 BGPPeer 是否距离多跳。

spec.bgp.routers.neighbors.bfdProfile

字符串

指定用于与 BGP 会话关联的 BFD 会话的 BFD 配置文件名称。如果未设置,则不会设置 BFD 会话。

spec.bgp.routers.neighbors.toAdvertise.allowed

数组

表示要通告给邻居的前缀列表及其关联属性。

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

字符串数组

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

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

字符串

指定处理前缀时使用的模式。您可以设置为filtered以仅允许prefixes列表中的前缀。您可以设置为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

字符串

指定与前缀关联的社区。

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

字符串

指定处理前缀时使用的模式。设置为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

字符串

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

spec.bgp.bfdProfiles.receiveInterval

整数

指定此系统可以接收控制分组的最小间隔(毫秒)。默认为300ms

spec.bgp.bfdProfiles.transmitInterval

整数

指定此系统要用于发送 BFD 控制分组的最小传输间隔(不包括抖动),以毫秒为单位。默认为300ms

spec.bgp.bfdProfiles.detectMultiplier

整数

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

spec.bgp.bfdProfiles.echoInterval

整数

配置此系统可以处理的最小回显接收传输间隔(毫秒)。默认为50ms

spec.bgp.bfdProfiles.echoMode

布尔值

启用或禁用回显传输模式。此模式默认情况下处于禁用状态,并且在多跳设置中不受支持。

spec.bgp.bfdProfiles.passiveMode

布尔值

将会话标记为被动。被动会话不会尝试启动连接,并在收到对等方的控制分组之前等待回复。

spec.bgp.bfdProfiles.MinimumTtl

整数

仅适用于多跳会话。配置传入 BFD 控制分组的最小预期 TTL。

spec.nodeSelector

字符串

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

status

字符串

定义 FRRConfiguration 的观察状态。

FRR-K8s 如何合并多个配置

在多个用户添加选择同一节点的配置的情况下,FRR-K8s 会合并这些配置。每个配置只能扩展其他配置。这意味着可以向路由器添加新的邻居,或向邻居通告额外的前缀,但不能删除另一个配置添加的组件。

配置冲突

某些配置可能导致冲突,从而导致错误,例如

  • 同一路由器(在同一 VRF 中)的不同 ASN

  • 同一邻居(具有相同的 IP/端口)的不同 ASN

  • 具有相同名称但不同值的多个 BFD 配置文件

当守护程序发现节点的配置无效时,它会将配置报告为无效,并恢复到之前的有效FRR配置。

合并

合并时,可以执行以下操作

  • 扩展要通告给邻居的 IP 集。

  • 添加具有其 IP 集的额外邻居。

  • 扩展要与其关联社区的 IP 集。

  • 允许邻居的传入路由。

每个配置都必须是自包含的。这意味着,例如,不能通过利用来自另一个配置的前缀来允许路由器部分中未定义的前缀。

如果要应用的配置兼容,则合并按如下方式工作

  • FRR-K8s组合所有路由器。

  • FRR-K8s合并每个路由器的所有前缀和邻居。

  • FRR-K8s合并每个邻居的所有过滤器。

限制较少的过滤器优先于限制较严格的过滤器。例如,接受某些前缀的过滤器优先于不接受任何前缀的过滤器,而接受所有前缀的过滤器优先于接受某些前缀的过滤器。