×

作为集群管理员,您可以添加、修改和删除边界网关协议 (BGP) 对等体。MetalLB 运算符使用 BGP 对等体自定义资源来识别 MetalLB speaker Pod 联系以启动 BGP 会话的哪些对等体。这些对等体接收 MetalLB 分配给服务的负载均衡器 IP 地址的路由通告。

关于 BGP 对等体自定义资源

BGP 对等体自定义资源的字段在下面的表格中描述。

表 1. MetalLB BGP 对等体自定义资源
字段 类型 描述

metadata.name

字符串

指定 BGP 对等体自定义资源的名称。

metadata.namespace

字符串

指定 BGP 对等体自定义资源的命名空间。

spec.myASN

整数

指定 BGP 会话本地端的自治系统编号。在您添加的所有 BGP 对等体自定义资源中指定相同的值。范围是 04294967295

spec.peerASN

整数

指定 BGP 会话远程端的自治系统编号。范围是 04294967295

spec.peerAddress

字符串

指定要联系以建立 BGP 会话的对等体的 IP 地址。

spec.sourceAddress

字符串

可选:指定建立 BGP 会话时要使用的 IP 地址。该值必须是 IPv4 地址。

spec.peerPort

整数

可选:指定要联系以建立 BGP 会话的对等体的网络端口。范围是 016384

spec.holdTime

字符串

可选:指定要向 BGP 对等体建议的保持时间持续时间。最小值为 3 秒 (3s)。常用单位为秒和分钟,例如 3s1m5m30s。为了更快地检测路径故障,还要配置 BFD。

spec.keepaliveTime

字符串

可选:指定向 BGP 对等体发送保活消息的最大间隔。如果您指定此字段,则还必须为 holdTime 字段指定一个值。指定的值必须小于 holdTime 字段的值。

spec.routerID

字符串

可选:指定要向 BGP 对等体通告的路由器 ID。如果您指定此字段,则必须在您添加的每个 BGP 对等体自定义资源中指定相同的值。

spec.password

字符串

可选:指定要发送到对等体的 MD5 密码,用于强制执行 TCP MD5 身份验证 BGP 会话的路由器。

spec.passwordSecret

字符串

可选:指定 BGP 对等体的身份验证密钥的名称。该密钥必须位于 metallb 命名空间中,并且类型为 basic-auth。

spec.bfdProfile

字符串

可选:指定 BFD 配置文件的名称。

spec.nodeSelectors

object[]

可选:使用匹配表达式和匹配标签指定选择器,以控制哪些节点可以连接到 BGP 对等体。

spec.ebgpMultiHop

布尔值

可选:指定 BGP 对等体距离多个网络跳。如果 BGP 对等体没有直接连接到同一个网络,除非将此字段设置为 true,否则 speaker 无法建立 BGP 会话。此字段适用于 *外部 BGP*。外部 BGP 用于描述 BGP 对等体属于不同的自治系统的情况。

connectTime

持续时间

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

passwordSecret 字段与 password 字段互斥,并包含对包含要使用的密码的密钥的引用。同时设置这两个字段会导致解析失败。

配置 BGP 对等体

作为集群管理员,您可以添加 BGP 对等体自定义资源以与网络路由器交换路由信息并通告服务的 IP 地址。

先决条件
  • 安装 OpenShift CLI (oc)。

  • 以具有 cluster-admin 权限的用户身份登录。

  • 使用 BGP 通告配置 MetalLB。

步骤
  1. 创建一个文件,例如 bgppeer.yaml,其内容如下例所示

    apiVersion: metallb.io/v1beta2
    kind: BGPPeer
    metadata:
      namespace: metallb-system
      name: doc-example-peer
    spec:
      peerAddress: 10.0.0.1
      peerASN: 64501
      myASN: 64500
      routerID: 10.10.10.10
  2. 应用 BGP 对等体的配置

    $ oc apply -f bgppeer.yaml

为给定的地址池配置一组特定的 BGP 对等体

此步骤说明如何:

  • 配置一组地址池 (pool1pool2)。

  • 配置一组 BGP 对等体 (peer1peer2)。

  • 配置 BGP 通告以将 pool1 分配给 peer1,将 pool2 分配给 peer2

先决条件
  • 安装 OpenShift CLI (oc)。

  • 以具有 cluster-admin 权限的用户身份登录。

步骤
  1. 创建地址池 pool1

    1. 创建一个文件,例如 ipaddresspool1.yaml,其内容如下例所示

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        namespace: metallb-system
        name: pool1
      spec:
        addresses:
          - 4.4.4.100-4.4.4.200
          - 2001:100:4::200-2001:100:4::400
    2. 应用 IP 地址池 pool1 的配置

      $ oc apply -f ipaddresspool1.yaml
  2. 创建地址池 pool2

    1. 创建一个文件,例如 ipaddresspool2.yaml,其内容如下例所示

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        namespace: metallb-system
        name: pool2
      spec:
        addresses:
          - 5.5.5.100-5.5.5.200
          - 2001:100:5::200-2001:100:5::400
    2. 应用 IP 地址池 pool2 的配置

      $ oc apply -f ipaddresspool2.yaml
  3. 创建 BGP peer1

    1. 创建一个文件,例如 bgppeer1.yaml,其内容如下例所示

      apiVersion: metallb.io/v1beta2
      kind: BGPPeer
      metadata:
        namespace: metallb-system
        name: peer1
      spec:
        peerAddress: 10.0.0.1
        peerASN: 64501
        myASN: 64500
        routerID: 10.10.10.10
    2. 应用 BGP 对等体的配置

      $ oc apply -f bgppeer1.yaml
  4. 创建 BGP peer2

    1. 创建一个文件,例如 bgppeer2.yaml,其内容如下例所示

      apiVersion: metallb.io/v1beta2
      kind: BGPPeer
      metadata:
        namespace: metallb-system
        name: peer2
      spec:
        peerAddress: 10.0.0.2
        peerASN: 64501
        myASN: 64500
        routerID: 10.10.10.10
    2. 应用 BGP peer2 的配置

      $ oc apply -f bgppeer2.yaml
  5. 创建 BGP 通告 1。

    1. 创建一个文件,例如 bgpadvertisement1.yaml,其内容如下例所示

      apiVersion: metallb.io/v1beta1
      kind: BGPAdvertisement
      metadata:
        name: bgpadvertisement-1
        namespace: metallb-system
      spec:
        ipAddressPools:
          - pool1
        peers:
          - peer1
        communities:
          - 65535:65282
        aggregationLength: 32
        aggregationLengthV6: 128
        localPref: 100
    2. 应用配置

      $ oc apply -f bgpadvertisement1.yaml
  6. 创建 BGP 通告 2。

    1. 创建一个文件,例如 bgpadvertisement2.yaml,其内容如下例所示

      apiVersion: metallb.io/v1beta1
      kind: BGPAdvertisement
      metadata:
        name: bgpadvertisement-2
        namespace: metallb-system
      spec:
        ipAddressPools:
          - pool2
        peers:
          - peer2
        communities:
          - 65535:65282
        aggregationLength: 32
        aggregationLengthV6: 128
        localPref: 100
    2. 应用配置

      $ oc apply -f bgpadvertisement2.yaml

通过网络 VRF 公开服务

您可以通过将网络接口上的 VRF 与 BGP 对等体关联来通过虚拟路由和转发 (VRF) 实例公开服务。

通过 BGP 对等体上的 VRF 公开服务仅为技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且功能可能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让您提前访问即将推出的产品功能,使客户能够在开发过程中测试功能并提供反馈。

有关 Red Hat 技术预览功能的支持范围的更多信息,请参阅 技术预览功能支持范围

通过使用网络接口上的 VRF 通过 BGP 对等体公开服务,您可以隔离服务的流量,配置独立的路由决策,并在网络接口上启用多租户支持。

通过在属于网络VRF的接口上建立BGP会话,MetalLB可以经由此接口发布服务,并使外部流量能够通过此接口访问该服务。但是,网络VRF路由表与OVN-Kubernetes使用的默认VRF路由表不同。因此,流量无法到达OVN-Kubernetes网络基础设施。

为了使指向服务的流量能够到达OVN-Kubernetes网络基础设施,必须配置路由规则来定义网络流量的下一跳。有关更多信息,请参阅附加资源部分“使用MetalLB管理对称路由”中的NodeNetworkConfigurationPolicy资源。

以下是通过具有BGP对等体的网络VRF公开服务的步骤概述

  1. 定义BGP对等体并添加网络VRF实例。

  2. 为MetalLB指定IP地址池。

  3. 配置MetalLB的BGP路由通告,以使用指定的IP地址池和与VRF实例关联的BGP对等体通告路由。

  4. 部署服务以测试配置。

先决条件
  • 您已安装OpenShift CLI(oc)。

  • 您已以具有cluster-admin权限的用户身份登录。

  • 您已定义一个NodeNetworkConfigurationPolicy将虚拟路由转发(VRF)实例与网络接口关联。有关完成此先决条件的更多信息,请参阅附加资源部分。

  • 您已在集群上安装MetalLB。

步骤
  1. 创建一个BGPPeer自定义资源 (CR)

    1. 创建一个文件,例如frrviavrf.yaml,其内容类似于以下示例

      apiVersion: metallb.io/v1beta2
      kind: BGPPeer
      metadata:
        name: frrviavrf
        namespace: metallb-system
      spec:
        myASN: 100
        peerASN: 200
        peerAddress: 192.168.130.1
        vrf: ens4vrf (1)
      1 指定要与BGP对等体关联的网络VRF实例。MetalLB可以根据VRF中的路由信息发布服务并做出路由决策。

      必须在NodeNetworkConfigurationPolicy CR中配置此网络VRF实例。有关更多信息,请参阅附加资源

    2. 通过运行以下命令应用BGP对等体的配置

      $ oc apply -f frrviavrf.yaml
  2. 创建一个IPAddressPool CR

    1. 创建一个文件,例如first-pool.yaml,其内容类似于以下示例

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        name: first-pool
        namespace: metallb-system
      spec:
        addresses:
        - 192.169.10.0/32
    2. 通过运行以下命令应用IP地址池的配置

      $ oc apply -f first-pool.yaml
  3. 创建一个BGPAdvertisement CR

    1. 创建一个文件,例如first-adv.yaml,其内容类似于以下示例

      apiVersion: metallb.io/v1beta1
      kind: BGPAdvertisement
      metadata:
        name: first-adv
        namespace: metallb-system
      spec:
        ipAddressPools:
          - first-pool
        peers:
          - frrviavrf (1)
      1 在此示例中,MetalLB将first-pool IP地址池中的一系列IP地址通告给frrviavrf BGP对等体。
    2. 通过运行以下命令应用BGP通告的配置

      $ oc apply -f first-adv.yaml
  4. 创建NamespaceDeploymentService CR

    1. 创建一个文件,例如deploy-service.yaml,其内容类似于以下示例

      apiVersion: v1
      kind: Namespace
      metadata:
        name: test
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: server
        namespace: test
      spec:
        selector:
          matchLabels:
            app: server
        template:
          metadata:
            labels:
              app: server
          spec:
            containers:
            - name: server
              image: registry.redhat.io/ubi9/ubi
              ports:
              - name: http
                containerPort: 30100
              command: ["/bin/sh", "-c"]
              args: ["sleep INF"]
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: server1
        namespace: test
      spec:
        ports:
        - name: http
          port: 30100
          protocol: TCP
          targetPort: 30100
        selector:
          app: server
        type: LoadBalancer
    2. 通过运行以下命令应用命名空间、部署和服务的配置

      $ oc apply -f deploy-service.yaml
验证
  1. 通过运行以下命令识别MetalLB speaker pod

    $ oc get -n metallb-system pods -l component=speaker
    示例输出
    NAME            READY   STATUS    RESTARTS   AGE
    speaker-c6c5f   6/6     Running   0          69m
  2. 通过运行以下命令(替换变量以匹配您的配置)验证speaker pod中BGP会话的状态是否为Established

    $ oc exec -n metallb-system <speaker_pod> -c frr -- vtysh -c "show bgp vrf <vrf_name> neigh"
    示例输出
    BGP neighbor is 192.168.30.1, remote AS 200, local AS 100, external link
      BGP version 4, remote router ID 192.168.30.1, local router ID 192.168.30.71
      BGP state = Established, up for 04:20:09
    
    ...
  3. 通过运行以下命令验证服务是否已正确通告

    $ oc exec -n metallb-system <speaker_pod> -c frr -- vtysh -c "show bgp vrf <vrf_name> ipv4"

BGP对等体配置示例

示例:限制哪些节点可以连接到BGP对等体

您可以指定节点选择器字段来控制哪些节点可以连接到BGP对等体。

apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: doc-example-nodesel
  namespace: metallb-system
spec:
  peerAddress: 10.0.20.1
  peerASN: 64501
  myASN: 64500
  nodeSelectors:
  - matchExpressions:
    - key: kubernetes.io/hostname
      operator: In
      values: [compute-1.example.com, compute-2.example.com]

示例:为BGP对等体指定BFD配置文件

您可以指定一个BFD配置文件与BGP对等体关联。BFD通过提供比BGP本身更快速地检测对等体之间通信故障的能力来补充BGP。

apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: doc-example-peer-bfd
  namespace: metallb-system
spec:
  peerAddress: 10.0.20.1
  peerASN: 64501
  myASN: 64500
  holdTime: "10s"
  bfdProfile: doc-example-bfd-profile-full

删除双向转发检测 (BFD) 配置文件并删除添加到边界网关协议 (BGP) 对等体资源的bfdProfile不会禁用BFD。相反,BGP对等体将开始使用默认的BFD配置文件。要从BGP对等体资源中禁用BFD,请删除BGP对等体配置并重新创建它,但无需BFD配置文件。有关更多信息,请参阅BZ#2050824

示例:为双协议栈网络指定BGP对等体

要支持双协议栈网络,请为IPv4添加一个BGP对等体自定义资源,为IPv6添加一个BGP对等体自定义资源。

apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: doc-example-dual-stack-ipv4
  namespace: metallb-system
spec:
  peerAddress: 10.0.20.1
  peerASN: 64500
  myASN: 64500
---
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: doc-example-dual-stack-ipv6
  namespace: metallb-system
spec:
  peerAddress: 2620:52:0:88::104
  peerASN: 64500
  myASN: 64500