32.6. 配置 MetalLB BGP peer


作为集群管理员,您可以添加、修改和删除边框网关协议(BGP)对等点。MetalLB Operator 使用 BGP peer 自定义资源来标识 MetalLB speaker pod 联系的对等者启动 BGP 会话。对等点接收 MetalLB 分配给服务的负载均衡器 IP 地址的路由公告。

32.6.1. 关于 BGP peer 自定义资源

下表中描述了 BGP peer 自定义资源的字段。

表 32.5. MetalLB BGP peer 自定义资源
字段类型描述

metadata.name

string

指定 BGP peer 自定义资源的名称。

metadata.namespace

string

指定 BGP peer 自定义资源的命名空间。

spec.myASN

整数

为 BGP 会话的本地末尾指定 Autonomous System 号。在您添加的所有 BGP peer 自定义资源中指定相同的值。范围是从 04294967295

spec.peerASN

整数

为 BGP 会话的远程端指定 Autonomous System 号。范围是从 04294967295

spec.peerAddress

string

指定建立 BGP 会话的对等点的 IP 地址。

spec.sourceAddress

string

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

spec.peerPort

整数

可选:指定用来建立 BGP 会话的对等端口。范围为 016384

spec.holdTime

string

可选:指定到 BGP 对等点的保留时间。最小值为 3 秒(3s)。常见的单位是秒和分钟,如 3s1m5m30s。要更快地检测路径失败,还要配置 BFD。

spec.keepaliveTime

string

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

spec.routerID

string

可选:指定要公告到 BGP peer 的路由器 ID。如果指定了此字段,则必须在添加的每个 BGP peer 自定义资源中指定相同的值。

spec.password

string

可选:指定 MD5 密码,以发送到执行 TCP MD5 经过身份验证的 BGP 会话的路由器的对等点。

spec.passwordSecret

string

可选:指定 BGP Peer 的身份验证 secret 的名称。secret 必须存在于 metallb 命名空间中,且类型为 basic-auth。

spec.bfdProfile

string

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

spec.nodeSelectors

object[]

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

spec.ebgpMultiHop

布尔值

可选:指定 BGP peer 是否有多个网络跃点。如果 BGP peer 没有直接连接到同一网络,则 speaker 无法建立 BGP 会话,除非此字段设置为 true。此字段适用于 外部 BGP。外部 BGP 是用来描述当 BGP 对等点属于不同的自治系统的术语。

注意

passwordSecret 字段与 password 字段相互排斥,包含对包含密码的 secret 的引用。设置这两个字段会导致解析失败。

32.6.2. 配置 BGP peer

作为集群管理员,您可以添加 BGP peer 自定义资源来与网络路由器交换路由信息,并为服务公告 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 peer 的配置:

    $ oc apply -f bgppeer.yaml

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

此流程演示了如何:

  • 配置一组地址池(pool1pool2)。
  • 配置一组 BGP 对等点(pe1peer2)。
  • 配置 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 peer 的配置:

      $ 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

32.6.4. 通过网络 VRF 公开服务

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

重要

通过 BGP 对等点上的 VRF 公开服务只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

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

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

注意

通过一个属于网络 VRF 的接口建立 BGP 会话,MetalLB 可以通过该接口公告服务,并让外部流量通过这个接口访问该服务。但是,network VRF 路由表与 OVN-Kubernetes 使用的默认 VRF 路由表不同。因此,流量无法访问 OVN-Kubernetes 网络基础架构。

要启用定向到服务的流量访问 OVN-Kubernetes 网络基础架构,您必须配置路由规则来为网络流量定义下一跃点。如需更多信息,请参阅附加资源部分中的"使用 MetalLB 管理对称路由"中的 NodeNetworkConfigurationPolicy 资源。

这些是通过带有 BGP peer 的网络 VRF 公开服务的高级步骤:

  1. 定义 BGP peer 并添加网络 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 peer 关联的网络 VRF 实例。MetalLB 可以公告服务并根据 VRF 中的路由信息做出路由决策。
      注意

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

    2. 运行以下命令,应用 BGP peer 的配置:

      $ 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 peer。
    2. 运行以下命令,应用 BGP 公告的配置:

      $ oc apply -f first-adv.yaml
  4. 创建一个 Namespace, Deployment, 和 Service 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"

32.6.5. BGP 对等配置示例

32.6.5.1. 示例:限制节点连接到 BGP peer

您可以指定节点选择器字段来控制哪些节点可以连接到 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]

32.6.5.2. 示例:为 BGP peer 指定 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 peer 资源禁用 BFD,请删除 BGP 对等配置,并在没有 BFD 配置集的情况下重新创建它。如需更多信息,请参阅 BZ#2050824

32.6.5.3. 示例:为双栈网络指定 BGP 对等点

要支持双栈网络,请为 IPv4 添加一个 BGP peer 自定义资源,并为 IPv6 添加一个 BGP peer 自定义资源。

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

32.6.6. 后续步骤

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.