7.4. 使用 MetalLB 进行负载平衡


7.4.1. 配置 MetalLB 地址池

作为集群管理员,您可以添加、修改和删除地址池。MetalLB Operator 使用地址池自定义资源来设置 MetalLB 可分配给服务的 IP 地址。示例中使用的命名空间假定命名空间是 metallb-system

有关如何安装 MetalLB Operator 的更多信息,请参阅关于 MetalLB 和 MetalLB Operator

7.4.1.1. 关于 IPAddressPool 自定义资源

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

Expand
表 7.6. MetalLB IPAddressPool 池自定义资源
字段类型描述

metadata.name

string

指定地址池的名称。添加服务时,您可以在 metallb.io/address-pool 注解中指定这个池名称,以从特定池中选择 IP 地址。整个文档中都使用名称 doc-examplesilvergold

metadata.namespace

string

指定地址池的命名空间。指定 MetalLB Operator 使用的同一命名空间。

metadata.label

字符串

可选:指定分配给 IPAddressPool 的键值对。这可通过 BGPAdvertisement and L2Advertisement CRD 中的 ipAddressPoolSelectors 进行引用,以将 IPAddressPool 与广告关联

spec.addresses

字符串

指定分配给服务的 MetalLB Operator 的 IP 地址列表。您可以在一个池中指定多个范围 ; 它们将共享相同的设置。以 CIDR 表示法指定每个范围,或者指定为以连字符隔开的起始和结束 IP 地址。

spec.autoAssign

布尔值

可选:指定 MetalLB 是否从这个池自动分配 IP 地址。如果要使用 metallb.io/address-pool 注解从这个池中明确请求 IP 地址,请指定 false。默认值为 true

注意

对于 IP 地址池配置,请确保 address 字段只指定可用的 IP,而不被其他网络设备(特别是网关地址)使用,以防止启用 autoAssign 时发生冲突。

spec.avoidBuggyIPs

布尔值

可选:这样可确保在启用 IP 地址以 .0.255 结尾时,不会从池中分配。默认值为 false。某些较旧的消费者网络设备错误地阻止以 .0.255 结尾的 IP 地址。

您可以通过配置 spec.serviceAllocation 规格,将 IP 地址从 IPAddressPool 分配给服务和命名空间。

Expand
表 7.7. MetalLB IPAddressPool 自定义资源 spec.serviceAllocation 子字段
字段类型描述

priority

int

可选:当多个 IP 地址池与服务或命名空间匹配时,定义 IP 地址池之间的优先级。较低数字表示优先级更高。

命名空间

数组(字符串)

可选:指定您可以分配给 IP 地址池 IP 地址的命名空间列表。

namespaceSelectors

数组 (LabelSelector)

可选:指定您可以使用列表格式的标签选择器从 IP 地址池分配给 IP 地址的命名空间标签。

serviceSelectors

数组 (LabelSelector)

可选:指定您可以使用列表格式的标签选择器从地址池中分配给 IP 地址的服务标签。

7.4.1.2. 配置地址池

作为集群管理员,您可以在集群中添加地址池来控制 MetalLB 可分配给负载均衡器服务的 IP 地址。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

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

    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      namespace: metallb-system
      name: doc-example
      labels: 
    1
    
        zone: east
    spec:
      addresses:
      - 203.0.113.1-203.0.113.10
      - 203.0.113.65-203.0.113.75
    # ...
    Copy to Clipboard Toggle word wrap
    1
    分配给 IPAddressPool 的该标签可通过 BGPAdvertisement CRD 中的 ipAddressPoolSelectors 来引用,以将 IPAddressPool 与广告关联。
  2. 应用 IP 地址池的配置:

    $ oc apply -f ipaddresspool.yaml
    Copy to Clipboard Toggle word wrap

验证

  1. 输入以下命令来查看地址池:

    $ oc describe -n metallb-system IPAddressPool doc-example
    Copy to Clipboard Toggle word wrap

    输出示例

    Name:         doc-example
    Namespace:    metallb-system
    Labels:       zone=east
    Annotations:  <none>
    API Version:  metallb.io/v1beta1
    Kind:         IPAddressPool
    Metadata:
      ...
    Spec:
      Addresses:
        203.0.113.1-203.0.113.10
        203.0.113.65-203.0.113.75
      Auto Assign:  true
    Events:         <none>
    Copy to Clipboard Toggle word wrap

  2. 确认输出中已存在地址池名称,如 doc-example,以及 IP 地址范围。

7.4.1.3. 为 VLAN 配置 MetalLB 地址池

作为集群管理员,您可以在集群中添加地址池来控制 MetalLB 可分配给负载均衡器服务的创建的 VLAN 上的 IP 地址

先决条件

  • 安装 OpenShift CLI(oc)。
  • 配置单独的 VLAN。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 创建一个文件,如 ipaddresspool-vlan.yaml,该文件类似以下示例:

    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      namespace: metallb-system
      name: doc-example-vlan
      labels:
        zone: east 
    1
    
    spec:
      addresses:
      - 192.168.100.1-192.168.100.254 
    2
    Copy to Clipboard Toggle word wrap
    1
    分配给 IPAddressPool 的该标签可通过 BGPAdvertisement CRD 中的 ipAddressPoolSelectors 来引用,以将 IPAddressPool 与广告关联。
    2
    此 IP 范围必须与分配给您网络上的 VLAN 的子网匹配。要支持第 2 层 (L2) 模式,IP 地址范围必须与集群节点位于同一个子网中。
  2. 应用 IP 地址池的配置:

    $ oc apply -f ipaddresspool-vlan.yaml
    Copy to Clipboard Toggle word wrap
  3. 为确保此配置适用于您需要将 spec gatewayConfig.ipForwarding 设置为 Global 的 VLAN。

    1. 运行以下命令来编辑网络配置自定义资源 (CR):

      $ oc edit network.operator.openshift/cluster
      Copy to Clipboard Toggle word wrap
    2. 更新 spec.defaultNetwork.ovnKubernetesConfig 部分,将 gatewayConfig.ipForwarding 设置为 Global。它应该类似如下:

      Example

      ...
      spec:
        clusterNetwork:
          - cidr: 10.128.0.0/14
            hostPrefix: 23
        defaultNetwork:
          type: OVNKubernetes
          ovnKubernetesConfig:
            gatewayConfig:
              ipForwarding: Global
      ...
      Copy to Clipboard Toggle word wrap

7.4.1.4. 地址池配置示例

以下示例演示了特定场景的地址池配置。

7.4.1.4.1. 示例:IPv4 和 CIDR 范围

您可以使用无类别域间路由(CIDR)标记指定 IP 地址范围。您可以将 CIDR 表示法与使用连字符分隔下限和上限的表示法合并。

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: doc-example-cidr
  namespace: metallb-system
spec:
  addresses:
  - 192.168.100.0/24
  - 192.168.200.0/24
  - 192.168.255.1-192.168.255.5
# ...
Copy to Clipboard Toggle word wrap
7.4.1.4.2. 示例:分配 IP 地址

您可以将 autoAssign 字段设置为 false,以防止 MetalLB 自动从地址池中分配 IP 地址。然后,您可以从 IP 地址池分配单个 IP 地址或多个 IP 地址。要分配 IP 地址,请将 /32 CIDR 表示法附加到 spec.addresses 参数中的目标 IP 地址。此设置可确保只有特定 IP 地址可以分配,保留非保留 IP 地址供应用程序使用。

分配多个 IP 地址的 IPAddressPool CR 示例

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: doc-example-reserved
  namespace: metallb-system
spec:
  addresses:
  - 192.168.100.1/32
  - 192.168.200.1/32
  autoAssign: false
# ...
Copy to Clipboard Toggle word wrap

注意

添加服务时,您可以从地址池中请求特定的 IP 地址,或者在注解中指定池名称,从池中请求任何 IP 地址。

7.4.1.4.3. 示例:IPv4 和 IPv6 地址

您可以添加使用 IPv4 和 IPv6 的地址池。您可以像几个 IPv4 示例一样在 地址 列表中指定多个范围。

无论服务被分配一个 IPv4 地址、一个 IPv6 地址,还是由您添加该服务来确定。spec.ipFamiliesspec.ipFamilyPolicy 字段控制 IP 地址如何分配给该服务。

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: doc-example-combined
  namespace: metallb-system
spec:
  addresses:
  - 10.0.100.0/28 
1

  - 2002:2:2::1-2002:2:2::100
# ...
Copy to Clipboard Toggle word wrap
1
其中 10.0.100.0/28 是本地网络 IP 地址,后跟 /28 网络前缀。

您可以将 IP 地址从 IPAddressPool 分配给您指定的服务和命名空间。

如果您将服务或命名空间分配给多个 IP 地址池,MetalLB 将使用较高优先级 IP 地址池中的可用 IP 地址。如果分配的 IP 地址池没有 IP 地址可用,MetalLB 将使用较低优先级或没有优先级的 IP 地址池的可用 IP 地址。

注意

对于 namespaceSelectorsserviceSelectors 规格,您可以使用 matchLabels 标签选择器、matchExpressions 标签选择器或两者。本例展示了每个规格的一个标签选择器。

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: doc-example-service-allocation
  namespace: metallb-system
spec:
  addresses:
    - 192.168.20.0/24
  serviceAllocation:
    priority: 50 
1

    namespaces: 
2

      - namespace-a
      - namespace-b
    namespaceSelectors: 
3

      - matchLabels:
          zone: east
    serviceSelectors: 
4

      - matchExpressions:
        - key: security
          operator: In
          values:
          - S1
# ...
Copy to Clipboard Toggle word wrap
1
为地址池分配优先级。较低数字表示优先级更高。
2
以列表格式为 IP 地址池分配一个或多个命名空间。
3
使用列表格式的标签选择器为 IP 地址池分配一个或多个命名空间标签。
4
使用列表格式的标签选择器,为 IP 地址池分配一个或多个服务标签。

7.4.1.5. 后续步骤

7.4.2. 关于 IP 地址池的广告

您可以配置 MetalLB,以便使用第 2 层协议、BGP 协议或两者来广告 IP 地址。通过第 2 层,MetalLB 提供了容错的外部 IP 地址。使用 BGP,MetalLB 为外部 IP 地址和负载均衡提供容错功能。

MetalLB 支持将 L2 和 BGP 用于同一组 IP 地址。

MetalLB 提供了将地址池分配给特定 BGP 对等对象到网络上节点子集的灵活性。这可以实现更复杂的配置,例如促进节点隔离或网络分段。

7.4.2.1. 关于 BGPAdvertisement 自定义资源

BGPAdvertise 对象的字段在下表中定义:

Expand
表 7.8. BGPAdvertise 配置
字段类型描述

metadata.name

string

指定 BGP 广告的名称。

metadata.namespace

string

指定 BGP 广告的命名空间。指定 MetalLB Operator 使用的同一命名空间。

spec.aggregationLength

整数

可选:指定 32 位 CIDR 掩码中包含的位数。为了聚合发言人向 BGP 对等者公告的路由,掩码将应用于多个服务 IP 地址的路由,speaker 会公告聚合的路由。例如,聚合长度为 24,speaker 可以聚合多个 10.0.1.x/32 服务 IP 地址并公告一个 10.0.1.0/24 路由。

spec.aggregationLengthV6

整数

可选:指定 128 位 CIDR 掩码中包含的位数。例如,在聚合长度为 124 时,speaker 可以聚合几个 fc00:f853:0ccd:e799::x/128 服务 IP 地址,并公告一个 fc00:f853:0ccd:e799::0/124 路由。

spec.communities

string

可选:指定一个或多个 BGP 社区。每个社区都被指定为两个 16 位值,用冒号字符分隔。知名的社区必须指定为 16 位值:

  • NO_EXPORT: 65535:65281
  • NO_ADVERTISE: 65535:65282
  • NO_EXPORT_SUBCONFED: 65535:65283

    注意

    您还可以使用与字符串一起创建的社区对象。

spec.localPref

整数

可选:指定这个广播的本地首选项。此 BGP 属性适用于 Autonomous System 中的 BGP 会话。

spec.ipAddressPools

string

可选:用于使用这个广告进行广告的 IPAddressPools 列表,按名称选择。

spec.ipAddressPoolSelectors

string

可选:使用这个广告进行广告的 IPAddressPools 的选择器。这可用于根据分配给 IPAddressPool 而非名称本身的标签将 IPAddressPool 与公告关联。如果这个或列表没有选择 IPAddressPool,则公告会应用到所有 IPAddressPools

spec.nodeSelectors

string

可选:NodeSelectors 允许限制节点作为负载均衡器 IP 的下一个跃点。如果为空,所有节点都会作为下一个跃点进行宣布。

spec.peers

string

可选:使用列表为每个 BGPPeer 资源指定 metadata.name 值,该资源接收 MetalLB 服务 IP 地址公告。MetalLB 服务 IP 地址从 IP 地址池分配。默认情况下,MetalLB 服务 IP 地址公告给所有配置的 BGPPeer 资源。使用此字段将公告限制到特定的 BGPpeer 资源。

7.4.2.2. 使用 BGP 公告和基本用例配置 MetalLB

按如下所示配置 MetalLB,使对等 BGP 路由器为每个 MetalLB 分配为服务的负载均衡器 IP 地址接收一个 203.0.113.200/32 路由和一个 fc00:f853:ccd:e799::1/128 路由。因为没有指定 localPrefcommunity 字段,所以路由会公告,并将 localPref 设置为 0,且没有 BGP 社区。

7.4.2.2.1. 示例:使用 BGP 传输基本地址池配置

按如下所示配置 MetalLB,以便使用 BGP 协议公告 IPAddressPool

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 创建 IP 地址池。

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

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        namespace: metallb-system
        name: doc-example-bgp-basic
      spec:
        addresses:
          - 203.0.113.200/30
          - fc00:f853:ccd:e799::/124
      Copy to Clipboard Toggle word wrap
    2. 应用 IP 地址池的配置:

      $ oc apply -f ipaddresspool.yaml
      Copy to Clipboard Toggle word wrap
  2. 创建 BGP 公告。

    1. 创建一个文件,如 bgpadvertisement.yaml,内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: BGPAdvertisement
      metadata:
        name: bgpadvertisement-basic
        namespace: metallb-system
      spec:
        ipAddressPools:
        - doc-example-bgp-basic
      Copy to Clipboard Toggle word wrap
    2. 应用配置:

      $ oc apply -f bgpadvertisement.yaml
      Copy to Clipboard Toggle word wrap

7.4.2.3. 使用 BGP 广告和高级用例配置 MetalLB

按如下所示配置 MetalLB,使得 MetalLB 分配给负载均衡器的 IP 地址范围是 203.0.113.200203.0.113.203,以及 fc00:f853:ccd:e799::0fc00:f853:ccd:e799::f

为了说明两个 BGP 公告,在 MetalLB 分配 IP 地址 203.0.113.200 时,请考虑实例。以该 IP 地址为例,发言人向 BGP 对等点公告两个路由:

  • 203.0.113.200/32localPref 设置为 100,社区设置为 NO_ADVERTISE 社区的数字值。此规范指示它们可以使用此路由的对等路由器,但它们不应将有关此路由的信息传播到 BGP 对等点。
  • 203.0.113.200/30 将 MetalLB 分配的负载均衡器 IP 地址聚合到一个路由中。MetalLB 公告到 BGP 对等点的聚合路由,并将 community 属性设置为 8000:800。BGP 同行将 203.0.113.200/30 个路由传播到其他 BGP 同级服务器。当流量通过发言人路由到节点时,使用 203.0.113.200/32 路由将流量转发到集群以及与该服务关联的 pod。

当添加更多服务和 MetalLB 从池中分配更多负载均衡器 IP 地址时,对等路由器收到一个本地路由,203.0.113.20x/32,以及 203.0.113.200/30 聚合路由。您添加的每个服务都会生成 /30 路由,但 MetalLB 会将路由重复数据删除到一个 BGP 公告,然后再与对等路由器通信。

7.4.2.3.1. 示例:使用 BGP 传输高级地址池配置

按如下所示配置 MetalLB,以便使用 BGP 协议公告 IPAddressPool

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 创建 IP 地址池。

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

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        namespace: metallb-system
        name: doc-example-bgp-adv
        labels:
          zone: east
      spec:
        addresses:
          - 203.0.113.200/30
          - fc00:f853:ccd:e799::/124
        autoAssign: false
      Copy to Clipboard Toggle word wrap
    2. 应用 IP 地址池的配置:

      $ oc apply -f ipaddresspool.yaml
      Copy to Clipboard Toggle word wrap
  2. 创建 BGP 公告。

    1. 创建一个文件,如 bgpadvertisement1.yaml,内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: BGPAdvertisement
      metadata:
        name: bgpadvertisement-adv-1
        namespace: metallb-system
      spec:
        ipAddressPools:
          - doc-example-bgp-adv
        communities:
          - 65535:65282
        aggregationLength: 32
        localPref: 100
      Copy to Clipboard Toggle word wrap
    2. 应用配置:

      $ oc apply -f bgpadvertisement1.yaml
      Copy to Clipboard Toggle word wrap
    3. 创建一个文件,如 bgpadvertisement2.yaml,内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: BGPAdvertisement
      metadata:
        name: bgpadvertisement-adv-2
        namespace: metallb-system
      spec:
        ipAddressPools:
          - doc-example-bgp-adv
        communities:
          - 8000:800
        aggregationLength: 30
        aggregationLengthV6: 124
      Copy to Clipboard Toggle word wrap
    4. 应用配置:

      $ oc apply -f bgpadvertisement2.yaml
      Copy to Clipboard Toggle word wrap

7.4.2.4. 从节点的子集公告 IP 地址池

要从 IP 地址池公告 IP 地址,请只使用特定的节点集合,使用 BGPAdvertisement 自定义资源中的 .spec.nodeSelector 规格。此规格将 IP 地址池与集群中的一组节点关联。如果您在集群中的不同子网上有节点,而您想要从特定子网的地址池中公告 IP 地址,例如仅面向公共的子网。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 使用自定义资源创建 IP 地址池:

    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
    Copy to Clipboard Toggle word wrap
  2. 通过在 BGPAdvertisement 自定义资源中定义 .spec.nodeSelector 值,控制 pool1 广告的 IP 地址来自集群中的哪些节点:

    apiVersion: metallb.io/v1beta1
    kind: BGPAdvertisement
    metadata:
      name: example
    spec:
      ipAddressPools:
      - pool1
      nodeSelector:
      - matchLabels:
          kubernetes.io/hostname: NodeA
      - matchLabels:
          kubernetes.io/hostname: NodeB
    Copy to Clipboard Toggle word wrap

在本例中,pool1 广告的 IP 地址仅来自 NodeANodeB

7.4.2.5. 关于 L2Advertisement 自定义资源

l2Advertise 对象的字段在下表中定义:

Expand
表 7.9. L2 广告配置
字段类型描述

metadata.name

string

指定 L2 广告的名称。

metadata.namespace

string

指定 L2 广告的命名空间。指定 MetalLB Operator 使用的同一命名空间。

spec.ipAddressPools

string

可选:用于使用这个广告进行广告的 IPAddressPools 列表,按名称选择。

spec.ipAddressPoolSelectors

string

可选:使用这个广告进行广告的 IPAddressPools 的选择器。这可用于根据分配给 IPAddressPool 而非名称本身的标签将 IPAddressPool 与公告关联。如果这个或列表没有选择 IPAddressPool,则公告会应用到所有 IPAddressPools

spec.nodeSelectors

string

可选:NodeSelectors 将节点限制在负载均衡器 IP 的下一跃点中。如果为空,所有节点都会作为下一个跃点进行宣布。

重要

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

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

spec.interfaces

string

可选:用于声明负载均衡器 IP 的接口列表。

7.4.2.6. 使用 L2 广告配置 MetalLB

按如下所示配置 MetalLB,以便使用 L2 协议广告 IPAddressPool

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 创建 IP 地址池。

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

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        namespace: metallb-system
        name: doc-example-l2
      spec:
        addresses:
          - 4.4.4.0/24
        autoAssign: false
      Copy to Clipboard Toggle word wrap
    2. 应用 IP 地址池的配置:

      $ oc apply -f ipaddresspool.yaml
      Copy to Clipboard Toggle word wrap
  2. 创建 L2 广告。

    1. 创建一个文件,如 l2advertisement.yaml,内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: L2Advertisement
      metadata:
        name: l2advertisement
        namespace: metallb-system
      spec:
        ipAddressPools:
         - doc-example-l2
      Copy to Clipboard Toggle word wrap
    2. 应用配置:

      $ oc apply -f l2advertisement.yaml
      Copy to Clipboard Toggle word wrap

7.4.2.7. 使用 L2 广告和标签配置 MetalLB

BGPAdvertisementL2Advertisement 中的 ipAddress Pools 字段用于根据分配给 IPAddressPool 的标签将 IPAddressPool 与广告相关联。

本例演示了如何配置 MetalLB,以便通过配置 ipAddressPoolSelectors 字段来广告使用 L2 协议的 IPAddressPools

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 创建 IP 地址池。

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

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        namespace: metallb-system
        name: doc-example-l2-label
        labels:
          zone: east
      spec:
        addresses:
          - 172.31.249.87/32
      Copy to Clipboard Toggle word wrap
    2. 应用 IP 地址池的配置:

      $ oc apply -f ipaddresspool.yaml
      Copy to Clipboard Toggle word wrap
  2. 使用 ipAddressPoolSelectors 创建 L2 广告广告 IP。

    1. 创建一个文件,如 l2advertisement.yaml,内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: L2Advertisement
      metadata:
        name: l2advertisement-label
        namespace: metallb-system
      spec:
        ipAddressPoolSelectors:
          - matchExpressions:
              - key: zone
                operator: In
                values:
                  - east
      Copy to Clipboard Toggle word wrap
    2. 应用配置:

      $ oc apply -f l2advertisement.yaml
      Copy to Clipboard Toggle word wrap

7.4.2.8. 为所选接口配置带有 L2 广告的 MetalLB

默认情况下,分配给该服务的 IP 地址池的 IP 地址将从所有网络接口公告。L2Advertisement 自定义资源定义中的 interfaces 字段用于限制公告 IP 地址池的网络接口。

本例演示了如何配置 MetalLB,以便仅从所有节点的 interfaces 字段中列出的网络接口公告 IP 地址池。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您以具有 cluster-admin 权限的用户身份登录。

流程

  1. 创建 IP 地址池。

    1. 创建一个文件,如 ipaddresspool.yaml,并输入类似以下示例的配置详情:

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        namespace: metallb-system
        name: doc-example-l2
      spec:
        addresses:
          - 4.4.4.0/24
        autoAssign: false
      Copy to Clipboard Toggle word wrap
    2. 为 IP 地址池应用配置,如下例所示:

      $ oc apply -f ipaddresspool.yaml
      Copy to Clipboard Toggle word wrap
  2. 使用 接口 选择器创建 L2 广告广告 IP。

    1. 创建一个 YAML 文件,如 l2advertisement.yaml,并输入类似以下示例的配置详情:

      apiVersion: metallb.io/v1beta1
      kind: L2Advertisement
      metadata:
        name: l2advertisement
        namespace: metallb-system
      spec:
        ipAddressPools:
         - doc-example-l2
         interfaces:
         - interfaceA
         - interfaceB
      Copy to Clipboard Toggle word wrap
    2. 为公告应用配置,如下例所示:

      $ oc apply -f l2advertisement.yaml
      Copy to Clipboard Toggle word wrap
重要

接口选择器不会影响 MetalLB 如何使用 L2 选择给定 IP 的节点。如果节点没有所选接口,则所选节点不会宣布该服务。

7.4.2.9. 使用二级网络配置 MetalLB

在 OpenShift Container Platform 4.14 中,默认的网络行为是不允许在网络接口之间转发 IP 数据包。因此,当在二级接口上配置 MetalLB 时,您需要添加机器配置来只为所需的接口启用 IP 转发。

注意

从 4.13 升级的 OpenShift Container Platform 集群不受影响,因为在升级过程中设置了全局参数来启用全局 IP 转发。

要为二级接口启用 IP 转发,有两个选项:

  • 为特定接口启用 IP 转发。
  • 为所有接口启用 IP 转发。

    注意

    为特定接口启用 IP 转发提供了更精细的控制,同时为所有接口启用它应用全局设置。

7.4.2.9.1. 为特定接口启用 IP 转发

流程

  1. 运行以下命令修补 Cluster Network Operator,将参数 routingViaHost 设置为 true

    $ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig": {"routingViaHost": true} }}}}' --type=merge
    Copy to Clipboard Toggle word wrap
  2. 通过创建并应用 MachineConfig CR,为特定二级接口启用转发,如 bridge-net

    1. 在本地机器中运行以下命令来配置网络内核参数的字符串(基于 Base64 编码):

      $ echo -e "net.ipv4.conf.bridge-net.forwarding = 1\nnet.ipv6.conf.bridge-net.forwarding = 1\nnet.ipv4.conf.bridge-net.rp_filter = 0\nnet.ipv6.conf.bridge-net.rp_filter = 0" | base64 -w0
      Copy to Clipboard Toggle word wrap

      输出示例

      bmV0LmlwdjQuY29uZi5icmlkZ2UtbmV0LmZvcndhcmRpbmcgPSAxCm5ldC5pcHY2LmNvbmYuYnJpZGdlLW5ldC5mb3J3YXJkaW5nID0gMQpuZXQuaXB2NC5jb25mLmJyaWRnZS1uZXQucnBfZmlsdGVyID0gMApuZXQuaXB2Ni5jb25mLmJyaWRnZS1uZXQucnBfZmlsdGVyID0gMAo=
      Copy to Clipboard Toggle word wrap

    2. 创建 MachineConfig CR,为名为 bridge-net 的指定的二级接口启用 IP 转发。
    3. 将以下 YAML 保存到 enable-ip-forward.yaml 文件中:

      apiVersion: machineconfiguration.openshift.io/v1
      kind: MachineConfig
      metadata:
        labels:
          machineconfiguration.openshift.io/role: <node_role> 
      1
      
        name: 81-enable-global-forwarding
      spec:
        config:
          ignition:
            version: 3.2.0
          storage:
            files:
            - contents:
                source: data:text/plain;charset=utf-8;base64,bmV0LmlwdjQuY29uZi5icmlkZ2UtbmV0LmZvcndhcmRpbmcgPSAxCm5ldC5pcHY2LmNvbmYuYnJpZGdlLW5ldC5mb3J3YXJkaW5nID0gMQpuZXQuaXB2NC5jb25mLmJyaWRnZS1uZXQucnBfZmlsdGVyID0gMApuZXQuaXB2Ni5jb25mLmJyaWRnZS1uZXQucnBfZmlsdGVyID0gMAo= 
      2
      
                verification: {}
              filesystem: root
              mode: 420
              path: /etc/sysctl.d/enable-global-forwarding.conf
        osImageURL: ""
      Copy to Clipboard Toggle word wrap
      1
      要启用 IP 转发的节点角色,如 worker
      2
      使用生成的 base64 字符串填充
    4. 运行以下命令来应用配置:

      $ oc apply -f enable-ip-forward.yaml
      Copy to Clipboard Toggle word wrap

验证

  1. 应用机器配置后,按照以下步骤验证更改:

    1. 运行以下命令,在目标节点上进入 debug 会话:

      $ oc debug node/<node-name>
      Copy to Clipboard Toggle word wrap

      此步骤实例化一个名为 <node-name>-debug 的 debug pod。

    2. 运行以下命令,将 /host 设置为 debug shell 中的根目录:

      $ chroot /host
      Copy to Clipboard Toggle word wrap

      debug pod 在 pod 中的 /host 中挂载主机的 root 文件系统。通过将根目录改为 /host,您可以运行主机可执行路径中包含的二进制文件。

    3. 运行以下命令验证 IP 转发是否已启用:

      $ cat /etc/sysctl.d/enable-global-forwarding.conf
      Copy to Clipboard Toggle word wrap

      预期输出

      net.ipv4.conf.bridge-net.forwarding = 1
      net.ipv6.conf.bridge-net.forwarding = 1
      net.ipv4.conf.bridge-net.rp_filter = 0
      net.ipv6.conf.bridge-net.rp_filter = 0
      Copy to Clipboard Toggle word wrap

      输出显示 bridge-net 接口上启用了 IPv4 和 IPv6 数据包转发。

7.4.2.9.2. 全局启用 IP 转发
  • 运行以下命令来全局启用 IP 转发:
$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}' --type=merge
Copy to Clipboard Toggle word wrap

7.4.3. 配置 MetalLB BGP peer

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

7.4.3.1. 关于 BGP peer 自定义资源

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

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

metadata.name

string

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

metadata.namespace

string

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

spec.myASN

整数

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

spec.peerASN

整数

指定 BGP 会话的远程端的 ASN。范围是从 04294967295。如果使用此字段,则无法在 spec.dynamicASN 字段中指定值。

spec.dynamicASN

string

检测用于会话远程端的 ASN,而不明确设置它。为具有相同 ASN 的对等点指定 internal,或为具有不同 ASN 的对等点指定 external。如果使用此字段,则无法在 spec.peerASN 字段中指定一个值。

spec.peerAddress

string

指定建立 BGP 会话的对等点的 IP 地址。如果使用此字段,则无法在 spec.interface 字段中指定值。

spec.interface

string

指定建立会话时使用的接口名称。使用此字段配置未编号的 BGP 对等。您必须在两个 BGP 对等点之间建立点对点、第 2 层连接。您可以将未编号的 BGP 对等用于 IPv4、IPv6 或双栈,但您必须启用 IPv6 RAs (Router Advertisements)。每个接口都限制为一个 BGP 连接。如果使用此字段,则无法在 spec.peerAddress 字段中指定一个值。spec.bgp.routers.neighbors.interface 字段只是一个技术预览功能。有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

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 对等点属于不同的自治系统的术语。

connectTime

duration

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

注意

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

7.4.3.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
    Copy to Clipboard Toggle word wrap
  2. 应用 BGP peer 的配置:

    $ oc apply -f bgppeer.yaml
    Copy to Clipboard Toggle word wrap

此流程演示了如何:

  • 配置一组地址池(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
      Copy to Clipboard Toggle word wrap
    2. 为 IP 地址池 pool1 应用配置:

      $ oc apply -f ipaddresspool1.yaml
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap
    2. 为 IP 地址池 pool2 应用配置:

      $ oc apply -f ipaddresspool2.yaml
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap
    2. 应用 BGP peer 的配置:

      $ oc apply -f bgppeer1.yaml
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap
    2. 应用 BGP peer2 的配置:

      $ oc apply -f bgppeer2.yaml
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap
    2. 应用配置:

      $ oc apply -f bgpadvertisement1.yaml
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap
    2. 应用配置:

      $ oc apply -f bgpadvertisement2.yaml
      Copy to Clipboard Toggle word wrap

7.4.3.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
      Copy to Clipboard Toggle word wrap
      1
      指定要与 BGP peer 关联的网络 VRF 实例。MetalLB 可以公告服务并根据 VRF 中的路由信息做出路由决策。
      注意

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

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

      $ oc apply -f frrviavrf.yaml
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,为 IP 地址池应用配置:

      $ oc apply -f first-pool.yaml
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap
      1
      在本例中,MetalLB 将来自 first-pool IP 地址池的 IP 地址范围公告给 frrviavrf BGP peer。
    2. 运行以下命令,应用 BGP 公告的配置:

      $ oc apply -f first-adv.yaml
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,为命名空间、部署和服务应用配置:

      $ oc apply -f deploy-service.yaml
      Copy to Clipboard Toggle word wrap

验证

  1. 运行以下命令来识别 MetalLB speaker pod:

    $ oc get -n metallb-system pods -l component=speaker
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME            READY   STATUS    RESTARTS   AGE
    speaker-c6c5f   6/6     Running   0          69m
    Copy to Clipboard Toggle word wrap

  2. 运行以下命令,在 speaker pod 中验证 BGP 会话的状态是否为 Established,替换变量以匹配您的配置:

    $ oc exec -n metallb-system <speaker_pod> -c frr -- vtysh -c "show bgp vrf <vrf_name> neigh"
    Copy to Clipboard Toggle word wrap

    输出示例

    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
    
    ...
    Copy to Clipboard Toggle word wrap

  3. 运行以下命令验证该服务是否已正确公告:

    $ oc exec -n metallb-system <speaker_pod> -c frr -- vtysh -c "show bgp vrf <vrf_name> ipv4"
    Copy to Clipboard Toggle word wrap

7.4.3.5. BGP 对等配置示例

7.4.3.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]
Copy to Clipboard Toggle word wrap
7.4.3.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
Copy to Clipboard Toggle word wrap
注意

删除双向转发检测 (BFD) 配置集并删除添加到边框网关协议 (BGP) 对等资源中的 bfdProfile 不会禁用 BFD。相反,BGP 对等点开始使用默认的 BFD 配置集。要从 BGP peer 资源禁用 BFD,请删除 BGP 对等配置,并在没有 BFD 配置集的情况下重新创建它。如需更多信息,请参阅 BZ#2050824

7.4.3.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
Copy to Clipboard Toggle word wrap
重要

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

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

要配置未编号的 BGP peering,请使用以下示例配置在 spec.interface 字段中指定接口:

apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: peer-unnumber
  namespace: metallb-system
spec:
  myASN: 64512
  ASN: 645000
  interface: net0
Copy to Clipboard Toggle word wrap
注意

要使用 interface 字段,您必须在两个 BGP 对等点之间建立点对点、第 2 层连接。您可以将未编号的 BGP 对等用于 IPv4、IPv6 或双栈,但您必须启用 IPv6 RAs (Router Advertisements)。每个接口都限制为一个 BGP 连接。

如果使用此字段,则无法在 spec.bgp.routers.neighbors.address 字段中指定一个值。

7.4.3.6. 后续步骤

7.4.4. 配置社区别名

作为集群管理员,您可以配置一个社区别名并在不同的广告中使用它。

7.4.4.1. 关于社区自定义资源

community 自定义资源是社区的一个别名集合。用户可使用 BGPAdvertis 定义广告 ipAddressPools 时使用的命名别名。下表中描述了 community 自定义资源的字段。

注意

community CRD 仅适用于 BGPAdvertisement。

Expand
表 7.11. MetalLB 社区自定义资源
字段类型描述

metadata.name

字符串

指定 community 的名称。

metadata.namespace

字符串

指定 community 的命名空间。指定 MetalLB Operator 使用的同一命名空间。

spec.communities

字符串

指定可在 BGPAdvertisements 中使用的 BGP 社区别名列表。社区别名由名称(别名)和值(数字:number)组成。通过引用 spec.communities 字段中的别名名称,将 BGPAdvertisement 链接到社区别名。

Expand
表 7.12. CommunityAlias
字段类型描述

name

字符串

community 的别名名称。

value

字符串

与给定名称对应的 BGP community 值。

7.4.4.2. 使用 BGP 广告和社区别名配置 MetalLB

按如下所示配置 MetalLB,以便 BGP 协议广告 IPAddressPool,并将社区别名设置为 NO_ADVERTISE 社区的数字值。

在以下示例中,对等 BGP 路由器 doc-example-peer-community 接收一个 203.0.113.200/32 路由,以及一个 fc00:f853:ccd:e799::1/128 路由,每个 load-balancer IP 地址都分配给服务。使用 NO_ADVERTISE 社区配置了一个社区别名。

先决条件

  • 安装 OpenShift CLI (oc) 。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 创建 IP 地址池。

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

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        namespace: metallb-system
        name: doc-example-bgp-community
      spec:
        addresses:
          - 203.0.113.200/30
          - fc00:f853:ccd:e799::/124
      Copy to Clipboard Toggle word wrap
    2. 应用 IP 地址池的配置:

      $ oc apply -f ipaddresspool.yaml
      Copy to Clipboard Toggle word wrap
  2. 创建名为 community1 的社区别名。

    apiVersion: metallb.io/v1beta1
    kind: Community
    metadata:
      name: community1
      namespace: metallb-system
    spec:
      communities:
        - name: NO_ADVERTISE
          value: '65535:65282'
    Copy to Clipboard Toggle word wrap
  3. 创建一个名为 doc-example-bgp-peer 的 BGP peer。

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

      apiVersion: metallb.io/v1beta2
      kind: BGPPeer
      metadata:
        namespace: metallb-system
        name: doc-example-bgp-peer
      spec:
        peerAddress: 10.0.0.1
        peerASN: 64501
        myASN: 64500
        routerID: 10.10.10.10
      Copy to Clipboard Toggle word wrap
    2. 应用 BGP peer 的配置:

      $ oc apply -f bgppeer.yaml
      Copy to Clipboard Toggle word wrap
  4. 创建一个带有社区别名的 BGP 广告。

    1. 创建一个文件,如 bgpadvertisement.yaml,内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: BGPAdvertisement
      metadata:
        name: bgp-community-sample
        namespace: metallb-system
      spec:
        aggregationLength: 32
        aggregationLengthV6: 128
        communities:
          - NO_ADVERTISE 
      1
      
        ipAddressPools:
          - doc-example-bgp-community
        peers:
          - doc-example-peer
      Copy to Clipboard Toggle word wrap
      1
      在这里指定 CommunityAlias.name,而不是社区自定义资源 (CR) 名称。
    2. 应用配置:

      $ oc apply -f bgpadvertisement.yaml
      Copy to Clipboard Toggle word wrap

7.4.5. 配置 MetalLB BFD 配置集

作为集群管理员,您可以添加、修改和删除双向检测(BFD)配置集。MetalLB Operator 使用 BFD 配置集自定义资源来识别哪个 BGP 会话使用 BFD 来单独提供比 BGP 更快地提供的路径故障检测。

7.4.5.1. 关于 BFD 配置集自定义资源

下表中描述了 BFD 配置集自定义资源的字段。

Expand
表 7.13. BFD 配置集自定义资源
字段类型描述

metadata.name

字符串

指定 BFD 配置集自定义资源的名称。

metadata.namespace

字符串

指定 BFD 配置集自定义资源的命名空间。

spec.detectMultiplier

整数

指定确定数据包丢失的检测倍数。远程传输间隔乘以这个值来确定连接丢失检测计时器。

例如,当本地系统的检测倍数设置为 3,而远程系统会将传输间隔设置为 300 时,本地系统仅在没有接收数据包的 900 ms 后才会检测故障。

范围为 2255。默认值为 3

spec.echoMode

布尔值

指定回显传输模式。如果您不使用分布式 BFD,则回显传输模式仅在 peer 也是 FRR 时才可以正常工作。默认值为 false,而回显传输模式被禁用。

启用回显传输模式时,请考虑增加控制数据包的传输间隔,以减少带宽使用量。例如,考虑将传输间隔增加到 2000 毫秒。

spec.echoInterval

整数

指定此系统用来发送和接收回显数据包的最小传输间隔(较少的)。范围为 1060000。默认值为 50 ms。

spec.minimumTtl

整数

指定传入控制数据包的最低预期 TTL。此字段只适用于多跃点会话。

设置最小 TTL 的目的是使数据包验证要求更加严格,并避免从其他会话接收控制数据包。

默认值为 254,表示系统在该系统和对等点之间仅需要一个跃点。

spec.passiveMode

布尔值

指定会话是否标记为主动或者被动。被动会话不会尝试启动连接。相反,被动会话会等待来自 peer 的控制数据包,然后再开始回复。

当您有一个作为星星网络的中央节点,并且您希望发送不需要系统发送的控制数据包时,如果您有一个路由器将会话标记为被动。

默认值为 false,并将会话标记为 active。

spec.receiveInterval

整数

指定此系统可以接收控制数据包的最低间隔。范围为 1060000。默认值为 300 ms。

spec.transmitInterval

整数

指定此系统用来发送控制数据包的最小传输间隔(较少的)。范围为 1060000。默认值为 300 ms。

7.4.5.2. 配置 BFD 配置集

作为集群管理员,您可以添加 BFD 配置集,并配置 BGP 对等点来使用配置集。BFD 仅提供比 BGP 快于 BGP 的路径故障检测速度。

先决条件

  • 安装 OpenShift CLI (oc) 。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 创建一个文件,如 bfdprofile.yaml,其内容如下:

    apiVersion: metallb.io/v1beta1
    kind: BFDProfile
    metadata:
      name: doc-example-bfd-profile-full
      namespace: metallb-system
    spec:
      receiveInterval: 300
      transmitInterval: 300
      detectMultiplier: 3
      echoMode: false
      passiveMode: true
      minimumTtl: 254
    Copy to Clipboard Toggle word wrap
  2. 为 BFD 配置集应用配置:

    $ oc apply -f bfdprofile.yaml
    Copy to Clipboard Toggle word wrap

7.4.5.3. 后续步骤

7.4.6. 将服务配置为使用 MetalLB

作为集群管理员,当添加类型为 LoadBalancer 的服务时,您可以控制 MetalLB 如何分配 IP 地址。

7.4.6.1. 请求特定 IP 地址

与其他一些负载均衡器实施一样,MetalLB 接受服务规格中的 spec.loadBalancerIP 字段。

如果请求的 IP 地址位于任何地址池中,MetalLB 会分配请求的 IP 地址。如果请求的 IP 地址不在任何范围内,MetalLB 会报告警告。

特定 IP 地址的服务 YAML 示例

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
  annotations:
    metallb.io/address-pool: <address_pool_name>
spec:
  selector:
    <label_key>: <label_value>
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
  type: LoadBalancer
  loadBalancerIP: <ip_address>
Copy to Clipboard Toggle word wrap

如果 MetalLB 无法分配请求的 IP 地址,服务报告的 EXTERNAL-IP 会报告 <pending>,运行 oc describe service <service_name> 会包括一个类似以下示例的事件。

当 MetalLB 无法分配请求的 IP 地址时的示例

  ...
Events:
  Type     Reason            Age    From                Message
  ----     ------            ----   ----                -------
  Warning  AllocationFailed  3m16s  metallb-controller  Failed to allocate IP for "default/invalid-request": "4.3.2.1" is not allowed in config
Copy to Clipboard Toggle word wrap

7.4.6.2. 从特定池中请求 IP 地址

要从特定范围分配 IP 地址,但您不关注特定的 IP 地址,您可以使用 metallb.io/address-pool 注解从指定地址池中请求 IP 地址。

来自特定池的 IP 地址的服务 YAML 示例

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
  annotations:
    metallb.io/address-pool: <address_pool_name>
spec:
  selector:
    <label_key>: <label_value>
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
  type: LoadBalancer
Copy to Clipboard Toggle word wrap

如果您为 <address_pool_name> 指定的地址池不存在,MetalLB 会尝试从允许自动分配的池中分配 IP 地址。

7.4.6.3. 接受任何 IP 地址

默认情况下,地址池配置为允许自动分配。MetalLB 从这些地址池中分配 IP 地址。

若要接受任何为自动分配配置的池的 IP 地址,不需要特殊注释或配置。

接受任何 IP 地址的服务 YAML 示例

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
spec:
  selector:
    <label_key>: <label_value>
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
  type: LoadBalancer
Copy to Clipboard Toggle word wrap

7.4.6.4. 共享特定 IP 地址

默认情况下,服务不共享 IP 地址。但是,如果您需要在单个 IP 地址上并置服务,可以通过向服务添加 metallb.io/allow-shared-ip 注解来启用选择性 IP 共享。

apiVersion: v1
kind: Service
metadata:
  name: service-http
  annotations:
    metallb.io/address-pool: doc-example
    metallb.io/allow-shared-ip: "web-server-svc"  
1

spec:
  ports:
    - name: http
      port: 80  
2

      protocol: TCP
      targetPort: 8080
  selector:
    <label_key>: <label_value>  
3

  type: LoadBalancer
  loadBalancerIP: 172.31.249.7  
4

---
apiVersion: v1
kind: Service
metadata:
  name: service-https
  annotations:
    metallb.io/address-pool: doc-example
    metallb.io/allow-shared-ip: "web-server-svc"
spec:
  ports:
    - name: https
      port: 443
      protocol: TCP
      targetPort: 8080
  selector:
    <label_key>: <label_value>
  type: LoadBalancer
  loadBalancerIP: 172.31.249.7
Copy to Clipboard Toggle word wrap
1
metallb.io/allow-shared-ip 注解指定相同的值。此值被称为 共享键(sharing key)
2
为服务指定不同的端口号。
3
如果您必须指定 externalTrafficPolicy: local,以便服务将流量发送到同一组 pod,则指定相同的 pod 选择器。如果您使用 cluster 外部流量策略,则 pod 选择器不需要相同。
4
可选:如果您指定了上述三个项目,MetalLB 可能会将服务在同一 IP 地址上并置。若要确保服务共享 IP 地址,请指定要共享的 IP 地址。

默认情况下,Kubernetes 不允许多协议负载均衡器服务。此限制通常会导致无法运行需要同时侦听 TCP 和 UDP 的服务(如 DNS)。要解决 Kubernetes 使用 MetalLB 的这一限制,请创建两个服务:

  • 对于一个服务,请为第二个服务指定 TCP 和 指定 UDP。
  • 在两个服务中,指定相同的 pod 选择器。
  • 指定相同的共享密钥和 spec.loadBalancerIP 值,以将 TCP 和 UDP 服务在同一 IP 地址上并置。

7.4.6.5. 使用 MetalLB 配置服务

您可以将负载平衡服务配置为使用地址池中的外部 IP 地址。

先决条件

  • 安装 OpenShift CLI (oc) 。
  • 安装 MetalLB Operator 并启动 MetalLB。
  • 至少配置一个地址池。
  • 配置网络,将流量从客户端路由到集群的主机网络。

流程

  1. 创建一个 <service_name>.yaml 文件。在文件中,确保将 spec.type 字段设置为 LoadBalancer

    有关如何请求 MetalLB 分配给服务的外部 IP 地址的信息,请参考示例。

  2. 创建服务:

    $ oc apply -f <service_name>.yaml
    Copy to Clipboard Toggle word wrap

    输出示例

    service/<service_name> created
    Copy to Clipboard Toggle word wrap

验证

  • 描述该服务:

    $ oc describe service <service_name>
    Copy to Clipboard Toggle word wrap

    输出示例

    Name:                     <service_name>
    Namespace:                default
    Labels:                   <none>
    Annotations:              metallb.io/address-pool: doc-example  
    1
    
    Selector:                 app=service_name
    Type:                     LoadBalancer  
    2
    
    IP Family Policy:         SingleStack
    IP Families:              IPv4
    IP:                       10.105.237.254
    IPs:                      10.105.237.254
    LoadBalancer Ingress:     192.168.100.5  
    3
    
    Port:                     <unset>  80/TCP
    TargetPort:               8080/TCP
    NodePort:                 <unset>  30550/TCP
    Endpoints:                10.244.0.50:8080
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:  
    4
    
      Type    Reason        Age                From             Message
      ----    ------        ----               ----             -------
      Normal  nodeAssigned  32m (x2 over 32m)  metallb-speaker  announcing from node "<node_name>"
    Copy to Clipboard Toggle word wrap

    1
    如果您从特定池请求 IP 地址,则会显示该注释。
    2
    服务类型必须表示 LoadBalancer
    3
    如果服务被正确分配,load-balancer ingress 字段会指示外部 IP 地址。
    4
    events 字段显示分配给声明外部 IP 地址的节点名称。如果出现错误,Event 字段会指示错误的原因。

7.4.7. 使用 MetalLB 管理对称路由

作为集群管理员,您可以通过从 MetalLB、NMState 和 OVN-Kubernetes 实现功能来有效地管理带有多个主机接口的 MetalLB 负载均衡器服务后面的 pod 的流量。通过结合此上下文中的这些功能,您可以提供对称路由、流量隔离,并支持具有不同网络上的客户端及重叠 CIDR 地址。

要实现此功能,了解如何使用 MetalLB 实施虚拟路由和转发(VRF)实例,并配置出口服务。

重要

使用带有 MetalLB 和出口服务的 VRF 实例配置对称流量只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

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

7.4.7.1. 使用 MetalLB 管理对称路由的挑战

当您将 MetalLB 与多个主机接口搭配使用时,MetalLB 通过主机上的所有可用接口公开并宣布服务。这可能会造成与网络隔离、非对称返回流量和重叠 CIDR 地址相关的挑战。

确保返回流量达到正确的客户端的一个选项是使用静态路由。但是,使用这个解决方案,MetalLB 无法隔离服务,然后通过不同的接口声明每个服务。另外,静态路由需要手动配置,并在添加远程站点时需要维护。

在实现 MetalLB 服务时,对称路由的进一步挑战是外部系统预期应用程序的源和目标 IP 地址相同的情况。OpenShift Container Platform 的默认行为是将主机网络接口的 IP 地址分配为来自 pod 的流量的源 IP 地址。这在多个主机接口中存在问题。

您可以通过实施组合来自 MetalLB、NMState 和 OVN-Kubernetes 的功能的配置来解决这些挑战。

您可以使用 NMState 在主机上配置 VRF 实例、将 VRF 实例与 MetalLB BGPPeer 资源关联,以及为出口流量配置出口服务来克服实施对称路由的挑战。

图 7.7. 使用带有 MetalLB 的 VRF 管理对称路由的网络概述

配置过程涉及三个阶段:

1.定义 VRF 和路由规则

  • 配置 NodeNetworkConfigurationPolicy 自定义资源 (CR),将 VRF 实例与网络接口关联。
  • 使用 VRF 路由表直接入口和出口流量。

2.将 VRF 链接到 MetalLB BGPPeer

  • 配置 MetalLB BGPPeer 资源,以使用网络接口上的 VRF 实例。
  • 通过将 BGPPeer 资源与 VRF 实例关联,指定的网络接口成为 BGP 会话的主接口,MetalLB 通过这个接口公告服务。

3.配置出口服务

  • 配置出口服务,为出口流量选择与 VRF 实例关联的网络。
  • 可选:将出口服务配置为使用 MetalLB 负载均衡器服务的 IP 地址作为出口流量的源 IP。

7.4.7.3. 使用带有 MetalLB 的 VRF 配置对称路由

您可以为需要同一入口和出口网络路径的 MetalLB 服务后面的应用程序配置对称网络路由。

这个示例将 VRF 路由表与 MetalLB 和出口服务相关联,以便为 LoadBalancer 服务后面的 pod 启用对称路由。

重要
  • 如果您在 EgressService CR 中使用 sourceIPBy: "LoadBalancerIP" 设置,您必须在 BGPAdvertisement 自定义资源 (CR) 中指定负载均衡器节点。
  • 在使用带有 gatewayConfig.routingViaHost 规格设置为 true 的 OVN-Kubernetes 的集群中,您可以使用 sourceIPBy: "Network" 设置。另外,如果您使用 sourceIPBy: "Network" 设置,您必须在使用网络 VRF 实例配置的节点上调度应用程序工作负载。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。
  • 安装 Kubernetes NMState Operator。
  • 安装 MetalLB Operator。

流程

  1. 创建一个 NodeNetworkConfigurationPolicy CR 来定义 VRF 实例:

    1. 创建一个文件,如 node-network-vrf.yaml,其内容类似以下示例:

      apiVersion: nmstate.io/v1
      kind: NodeNetworkConfigurationPolicy
      metadata:
        name: vrfpolicy 
      1
      
      spec:
        nodeSelector:
          vrf: "true" 
      2
      
        maxUnavailable: 3
        desiredState:
          interfaces:
          - name: ens4vrf 
      3
      
            type: vrf 
      4
      
            state: up
            vrf:
              port:
              - ens4 
      5
      
              route-table-id: 2 
      6
      
          - name: ens4 
      7
      
            type: ethernet
            state: up
            ipv4:
              address:
              - ip: 192.168.130.130
                prefix-length: 24
              dhcp: false
              enabled: true
          routes: 
      8
      
            config:
            - destination: 0.0.0.0/0
              metric: 150
              next-hop-address: 192.168.130.1
              next-hop-interface: ens4
              table-id: 2
          route-rules: 
      9
      
            config:
            - ip-to: 172.30.0.0/16
              priority: 998
              route-table: 254 
      10
      
            - ip-to: 10.132.0.0/14
              priority: 998
              route-table: 254
            - ip-to: 169.254.0.0/17
              priority: 998
              route-table: 254
      Copy to Clipboard Toggle word wrap
      1
      策略的名称。
      2
      这个示例将策略应用到带有 vrf:true 标签的所有节点。
      3
      接口的名称。
      4
      接口的类型。这个示例创建了一个 VRF 实例。
      5
      VRF 附加到的节点接口。
      6
      VRF 的路由表 ID 的名称。
      7
      与 VRF 关联的接口的 IPv4 地址。
      8
      定义网络路由的配置。next-hop-address 字段定义路由的下一跃点的 IP 地址。next-hop-interface 字段定义路由的传出接口。在本例中,VRF 路由表是 2,它引用您在 EgressService CR 中定义的 ID。
      9
      定义额外的路由规则。ip-to 字段必须与 Cluster Network CIDR、Service Network CIDR 和 Internal Masquerade 子网 CIDR 匹配。您可以运行以下命令来查看这些 CIDR 地址规格的值: oc describe network.operator/cluster
      10
      计算路由时使用的 Linux 内核的主路由表的 ID 为 254
    2. 运行以下命令来应用策略:

      $ oc apply -f node-network-vrf.yaml
      Copy to Clipboard Toggle word wrap
  2. 创建 BGPPeer 自定义资源 (CR):

    1. 创建一个文件,如 frr-via-vrf.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
      Copy to Clipboard Toggle word wrap
      1
      指定要与 BGP peer 关联的 VRF 实例。MetalLB 可以公告服务并根据 VRF 中的路由信息做出路由决策。
    2. 运行以下命令,应用 BGP peer 的配置:

      $ oc apply -f frr-via-vrf.yaml
      Copy to Clipboard Toggle word wrap
  3. 创建一个 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
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,为 IP 地址池应用配置:

      $ oc apply -f first-pool.yaml
      Copy to Clipboard Toggle word wrap
  4. 创建 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
      
        nodeSelectors:
          - matchLabels:
              egress-service.k8s.ovn.org/test-server1: "" 
      2
      Copy to Clipboard Toggle word wrap
      1
      在本例中,MetalLB 将来自 first-pool IP 地址池的 IP 地址范围公告给 frrviavrf BGP peer。
      2
      在本例中,EgressService CR 将出口流量的源 IP 地址配置为使用负载均衡器服务 IP 地址。因此,您必须指定负载均衡器节点返回流量,以便为来自 pod 的流量使用相同的返回路径。
    2. 运行以下命令,应用 BGP 公告的配置:

      $ oc apply -f first-adv.yaml
      Copy to Clipboard Toggle word wrap
  5. 创建一个 EgressService CR:

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

      apiVersion: k8s.ovn.org/v1
      kind: EgressService
      metadata:
        name: server1 
      1
      
        namespace: test 
      2
      
      spec:
        sourceIPBy: "LoadBalancerIP" 
      3
      
        nodeSelector:
          matchLabels:
            vrf: "true" 
      4
      
        network: "2" 
      5
      Copy to Clipboard Toggle word wrap
      1
      指定出口服务的名称。EgressService 资源的名称必须与您要修改的负载均衡器服务的名称匹配。
      2
      指定出口服务的命名空间。EgressService 的命名空间必须与您要修改的负载均衡器服务的命名空间匹配。egress 服务是命名空间范围的。
      3
      这个示例将 LoadBalancer 服务入口 IP 地址分配为出口流量的源 IP 地址。
      4
      如果为 sourceIPBy 规格指定 LoadBalancer,则单一节点处理 LoadBalancer 服务流量。在本例中,只有标签 vrf: "true" 的节点才能处理服务流量。如果没有指定节点,OVN-Kubernetes 会选择一个 worker 节点来处理服务流量。当选择节点时,OVN-Kubernetes 以以下格式标记节点: egress-service.k8s.ovn.org/<svc_namespace>-<svc_name>: ""
      5
      指定出口流量的路由表 ID。确保值与 NodeNetworkConfigurationPolicy 资源中定义的 route-table-id ID 匹配,例如 route-table-id: 2
    2. 运行以下命令,为出口服务应用配置:

      $ oc apply -f egress-service.yaml
      Copy to Clipboard Toggle word wrap

验证

  1. 运行以下命令,验证您可以访问 MetalLB 服务后运行的 pod 的应用程序端点:

    $ curl <external_ip_address>:<port_number> 
    1
    Copy to Clipboard Toggle word wrap
    1
    更新外部 IP 地址和端口号,以适合您的应用程序端点。
  2. 可选:如果您将 LoadBalancer 服务入口 IP 地址指定为出口流量的源 IP 地址,请使用 tcpdump 等工具分析外部客户端接收的数据包,以此验证此配置。

7.4.8. 配置 MetalLB 和 FRR-K8s 的集成

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

警告

在配置虚拟路由转发(VRF)用户时,必须将其 VRF 改为小于 1000 的表 ID,因为 OpenShift Container Platform 保留大于 1000。

7.4.8.1. 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
Copy to Clipboard Toggle word wrap

您还可以将 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
Copy to Clipboard Toggle word wrap

您可以将 FRR-K8s 设置为阻止 Cluster Network CIDR 和 Service Network CIDR。您可以运行以下命令来查看这些 CIDR 地址规格的值:

$ oc describe network.config/cluster
Copy to Clipboard Toggle word wrap

7.4.8.2. 配置 FRRConfiguration CRD

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

7.4.8.2.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
Copy to Clipboard Toggle word wrap

7.4.8.2.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
Copy to Clipboard Toggle word wrap

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
Copy to Clipboard Toggle word wrap

1
公告所有前缀。
7.4.8.2.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
Copy to Clipboard Toggle word wrap

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
Copy to Clipboard Toggle word wrap

7.4.8.2.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
Copy to Clipboard Toggle word wrap

7.4.8.2.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"
Copy to Clipboard Toggle word wrap

7.4.8.2.6. interface 字段
重要

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

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

您可以使用 interface 字段配置 unnumbered BGP peering,使用以下示例配置:

FRRConfiguration CR 示例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: test
  namespace: frr-k8s-system
spec:
  bgp:
    bfdProfiles:
    - echoMode: false
      name: simple
      passiveMode: false
    routers:
    - asn: 64512
      neighbors:
      - asn: 64512
        bfdProfile: simple
        disableMP: false
        interface: net10 
1

        port: 179
        toAdvertise:
          allowed:
            mode: filtered
            prefixes:
            - 5.5.5.5/32
        toReceive:
          allowed:
            mode: filtered
      prefixes:
      - 5.5.5.5/32
Copy to Clipboard Toggle word wrap

1
激活未编号的 BGP 对等。
注意

要使用 interface 字段,您必须在两个 BGP 对等点之间建立点对点、第 2 层连接。您可以将未编号的 BGP 对等用于 IPv4、IPv6 或双栈,但您必须启用 IPv6 RAs (Router Advertisements)。每个接口都限制为一个 BGP 连接。

如果使用此字段,则无法在 spec.bgp.routers.neighbors.address 字段中指定一个值。

FRRConfiguration 自定义资源的字段在下表中描述:

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

spec.bgp.routers

数组

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

spec.bgp.routers.asn

整数

用于会话的本地后端的自主系统编号(ASN)。

spec.bgp.routers.id

string

指定 bgp 路由器的 ID。

spec.bgp.routers.vrf

string

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

spec.bgp.routers.neighbors

数组

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

spec.bgp.routers.neighbors.asn

整数

指定用于会话远程结尾的 ASN。如果使用此字段,则无法在 spec.bgp.routers.neighbors.dynamicASN 字段中指定一个值。

spec.bgp.routers.neighbors.dynamicASN

string

检测用于会话远程端的 ASN,而不明确设置它。为具有相同 ASN 的邻居指定 internal,或为具有不同 ASN 的邻居指定 external。如果使用此字段,则无法在 spec.bgp.routers.neighbors.asn 字段中指定一个值。

spec.bgp.routers.neighbors.address

string

指定要建立会话的 IP 地址。如果使用此字段,则无法在 spec.bgp.routers.neighbors.interface 字段中指定一个值。

spec.bgp.routers.neighbors.interface

string

指定建立会话时使用的接口名称。使用此字段配置未编号的 BGP 对等。必须有两个 BGP 对等点之间的点对点、第 2 层连接。您可以将未编号的 BGP 对等用于 IPv4、IPv6 或双栈,但您必须启用 IPv6 RAs (Router Advertisements)。每个接口都限制为一个 BGP 连接。spec.bgp.routers.neighbors.interface 字段只是一个技术预览功能。有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

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

字符串

指定与前缀关联的社区。

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

整数

指定排除 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

字符串

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

status

字符串

定义 FRRConfiguration 的观察状态。

7.4.8.3. FRR-K8s 如何合并多个配置

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

7.4.8.3.1. 配置冲突

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

  • 同一路由器的不同 ASN (在同一 VRF 中)
  • 同一邻居的不同 ASN (具有相同 IP / 端口)
  • 多个带有相同名称的 BFD 配置集,但不同的值

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

7.4.8.3.2. 合并

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

  • 将您要公告的 IP 集合扩展到邻居。
  • 使用 IP 集合添加额外的邻居。
  • 扩展您要关联社区的 IP 集合。
  • 允许邻居的传入路由。

每个配置都必须自包含。例如,通过利用来自其他配置的前缀,不允许在路由器部分中定义的前缀。

如果要应用的配置兼容,则合并可以正常工作,如下所示:

  • frr-K8s 结合了所有路由器。
  • frr-K8s 合并每个路由器的所有前缀和邻居。
  • frr-K8s 合并每个邻居的所有过滤器。
注意

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

7.4.9. MetalLB 日志记录、故障排除和支持

如果您需要对 MetalLB 配置进行故障排除,请查看以下部分来了解常用命令。

7.4.9.1. 设置 MetalLB 日志记录级别

MetalLB 在带有默认设置 info 的容器中使用 FRRouting(FRR)会生成大量日志。您可以通过设置 logLevel 来控制生成的日志的详细程度,如下例所示。

通过将 logLevel 设置为 debug 来深入了解 MetalLB,如下所示:

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 已安装 OpenShift CLI(oc)。

流程

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

    apiVersion: metallb.io/v1beta1
    kind: MetalLB
    metadata:
      name: metallb
      namespace: metallb-system
    spec:
      logLevel: debug
      nodeSelector:
        node-role.kubernetes.io/worker: ""
    Copy to Clipboard Toggle word wrap
  2. 应用配置:

    $ oc replace -f setdebugloglevel.yaml
    Copy to Clipboard Toggle word wrap
    注意

    使用 oc replace 可以被理解为,metallb CR 已被创建,您在此处更改了日志级别。

  3. 显示 speaker pod 的名称:

    $ oc get -n metallb-system pods -l component=speaker
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                    READY   STATUS    RESTARTS   AGE
    speaker-2m9pm           4/4     Running   0          9m19s
    speaker-7m4qw           3/4     Running   0          19s
    speaker-szlmx           4/4     Running   0          9m19s
    Copy to Clipboard Toggle word wrap

    注意

    重新创建发言人和控制器 Pod,以确保应用更新的日志记录级别。对于 MetalLB 的所有组件,会修改日志记录级别。

  4. 查看 speaker 日志:

    $ oc logs -n metallb-system speaker-7m4qw -c speaker
    Copy to Clipboard Toggle word wrap

    输出示例

    {"branch":"main","caller":"main.go:92","commit":"3d052535","goversion":"gc / go1.17.1 / amd64","level":"info","msg":"MetalLB speaker starting (commit 3d052535, branch main)","ts":"2022-05-17T09:55:05Z","version":""}
    {"caller":"announcer.go:110","event":"createARPResponder","interface":"ens4","level":"info","msg":"created ARP responder for interface","ts":"2022-05-17T09:55:05Z"}
    {"caller":"announcer.go:119","event":"createNDPResponder","interface":"ens4","level":"info","msg":"created NDP responder for interface","ts":"2022-05-17T09:55:05Z"}
    {"caller":"announcer.go:110","event":"createARPResponder","interface":"tun0","level":"info","msg":"created ARP responder for interface","ts":"2022-05-17T09:55:05Z"}
    {"caller":"announcer.go:119","event":"createNDPResponder","interface":"tun0","level":"info","msg":"created NDP responder for interface","ts":"2022-05-17T09:55:05Z"}
    I0517 09:55:06.515686      95 request.go:665] Waited for 1.026500832s due to client-side throttling, not priority and fairness, request: GET:https://172.30.0.1:443/apis/operators.coreos.com/v1alpha1?timeout=32s
    {"Starting Manager":"(MISSING)","caller":"k8s.go:389","level":"info","ts":"2022-05-17T09:55:08Z"}
    {"caller":"speakerlist.go:310","level":"info","msg":"node event - forcing sync","node addr":"10.0.128.4","node event":"NodeJoin","node name":"ci-ln-qb8t3mb-72292-7s7rh-worker-a-vvznj","ts":"2022-05-17T09:55:08Z"}
    {"caller":"service_controller.go:113","controller":"ServiceReconciler","enqueueing":"openshift-kube-controller-manager-operator/metrics","epslice":"{\"metadata\":{\"name\":\"metrics-xtsxr\",\"generateName\":\"metrics-\",\"namespace\":\"openshift-kube-controller-manager-operator\",\"uid\":\"ac6766d7-8504-492c-9d1e-4ae8897990ad\",\"resourceVersion\":\"9041\",\"generation\":4,\"creationTimestamp\":\"2022-05-17T07:16:53Z\",\"labels\":{\"app\":\"kube-controller-manager-operator\",\"endpointslice.kubernetes.io/managed-by\":\"endpointslice-controller.k8s.io\",\"kubernetes.io/service-name\":\"metrics\"},\"annotations\":{\"endpoints.kubernetes.io/last-change-trigger-time\":\"2022-05-17T07:21:34Z\"},\"ownerReferences\":[{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"name\":\"metrics\",\"uid\":\"0518eed3-6152-42be-b566-0bd00a60faf8\",\"controller\":true,\"blockOwnerDeletion\":true}],\"managedFields\":[{\"manager\":\"kube-controller-manager\",\"operation\":\"Update\",\"apiVersion\":\"discovery.k8s.io/v1\",\"time\":\"2022-05-17T07:20:02Z\",\"fieldsType\":\"FieldsV1\",\"fieldsV1\":{\"f:addressType\":{},\"f:endpoints\":{},\"f:metadata\":{\"f:annotations\":{\".\":{},\"f:endpoints.kubernetes.io/last-change-trigger-time\":{}},\"f:generateName\":{},\"f:labels\":{\".\":{},\"f:app\":{},\"f:endpointslice.kubernetes.io/managed-by\":{},\"f:kubernetes.io/service-name\":{}},\"f:ownerReferences\":{\".\":{},\"k:{\\\"uid\\\":\\\"0518eed3-6152-42be-b566-0bd00a60faf8\\\"}\":{}}},\"f:ports\":{}}}]},\"addressType\":\"IPv4\",\"endpoints\":[{\"addresses\":[\"10.129.0.7\"],\"conditions\":{\"ready\":true,\"serving\":true,\"terminating\":false},\"targetRef\":{\"kind\":\"Pod\",\"namespace\":\"openshift-kube-controller-manager-operator\",\"name\":\"kube-controller-manager-operator-6b98b89ddd-8d4nf\",\"uid\":\"dd5139b8-e41c-4946-a31b-1a629314e844\",\"resourceVersion\":\"9038\"},\"nodeName\":\"ci-ln-qb8t3mb-72292-7s7rh-master-0\",\"zone\":\"us-central1-a\"}],\"ports\":[{\"name\":\"https\",\"protocol\":\"TCP\",\"port\":8443}]}","level":"debug","ts":"2022-05-17T09:55:08Z"}
    Copy to Clipboard Toggle word wrap

  5. 查看 FRR 日志:

    $ oc logs -n metallb-system speaker-7m4qw -c frr
    Copy to Clipboard Toggle word wrap

    输出示例

    Started watchfrr
    2022/05/17 09:55:05 ZEBRA: client 16 says hello and bids fair to announce only bgp routes vrf=0
    2022/05/17 09:55:05 ZEBRA: client 31 says hello and bids fair to announce only vnc routes vrf=0
    2022/05/17 09:55:05 ZEBRA: client 38 says hello and bids fair to announce only static routes vrf=0
    2022/05/17 09:55:05 ZEBRA: client 43 says hello and bids fair to announce only bfd routes vrf=0
    2022/05/17 09:57:25.089 BGP: Creating Default VRF, AS 64500
    2022/05/17 09:57:25.090 BGP: dup addr detect enable max_moves 5 time 180 freeze disable freeze_time 0
    2022/05/17 09:57:25.090 BGP: bgp_get: Registering BGP instance (null) to zebra
    2022/05/17 09:57:25.090 BGP: Registering VRF 0
    2022/05/17 09:57:25.091 BGP: Rx Router Id update VRF 0 Id 10.131.0.1/32
    2022/05/17 09:57:25.091 BGP: RID change : vrf VRF default(0), RTR ID 10.131.0.1
    2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF br0
    2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF ens4
    2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF ens4 addr 10.0.128.4/32
    2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF ens4 addr fe80::c9d:84da:4d86:5618/64
    2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF lo
    2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF ovs-system
    2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF tun0
    2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF tun0 addr 10.131.0.1/23
    2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF tun0 addr fe80::40f1:d1ff:feb6:5322/64
    2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF veth2da49fed
    2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF veth2da49fed addr fe80::24bd:d1ff:fec1:d88/64
    2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF veth2fa08c8c
    2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF veth2fa08c8c addr fe80::6870:ff:fe96:efc8/64
    2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF veth41e356b7
    2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF veth41e356b7 addr fe80::48ff:37ff:fede:eb4b/64
    2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF veth1295c6e2
    2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF veth1295c6e2 addr fe80::b827:a2ff:feed:637/64
    2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF veth9733c6dc
    2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF veth9733c6dc addr fe80::3cf4:15ff:fe11:e541/64
    2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF veth336680ea
    2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF veth336680ea addr fe80::94b1:8bff:fe7e:488c/64
    2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF vetha0a907b7
    2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF vetha0a907b7 addr fe80::3855:a6ff:fe73:46c3/64
    2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF vethf35a4398
    2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF vethf35a4398 addr fe80::40ef:2fff:fe57:4c4d/64
    2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF vethf831b7f4
    2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF vethf831b7f4 addr fe80::f0d9:89ff:fe7c:1d32/64
    2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF vxlan_sys_4789
    2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF vxlan_sys_4789 addr fe80::80c1:82ff:fe4b:f078/64
    2022/05/17 09:57:26.094 BGP: 10.0.0.1 [FSM] Timer (start timer expire).
    2022/05/17 09:57:26.094 BGP: 10.0.0.1 [FSM] BGP_Start (Idle->Connect), fd -1
    2022/05/17 09:57:26.094 BGP: Allocated bnc 10.0.0.1/32(0)(VRF default) peer 0x7f807f7631a0
    2022/05/17 09:57:26.094 BGP: sendmsg_zebra_rnh: sending cmd ZEBRA_NEXTHOP_REGISTER for 10.0.0.1/32 (vrf VRF default)
    2022/05/17 09:57:26.094 BGP: 10.0.0.1 [FSM] Waiting for NHT
    2022/05/17 09:57:26.094 BGP: bgp_fsm_change_status : vrf default(0), Status: Connect established_peers 0
    2022/05/17 09:57:26.094 BGP: 10.0.0.1 went from Idle to Connect
    2022/05/17 09:57:26.094 BGP: 10.0.0.1 [FSM] TCP_connection_open_failed (Connect->Active), fd -1
    2022/05/17 09:57:26.094 BGP: bgp_fsm_change_status : vrf default(0), Status: Active established_peers 0
    2022/05/17 09:57:26.094 BGP: 10.0.0.1 went from Connect to Active
    2022/05/17 09:57:26.094 ZEBRA: rnh_register msg from client bgp: hdr->length=8, type=nexthop vrf=0
    2022/05/17 09:57:26.094 ZEBRA: 0: Add RNH 10.0.0.1/32 type Nexthop
    2022/05/17 09:57:26.094 ZEBRA: 0:10.0.0.1/32: Evaluate RNH, type Nexthop (force)
    2022/05/17 09:57:26.094 ZEBRA: 0:10.0.0.1/32: NH has become unresolved
    2022/05/17 09:57:26.094 ZEBRA: 0: Client bgp registers for RNH 10.0.0.1/32 type Nexthop
    2022/05/17 09:57:26.094 BGP: VRF default(0): Rcvd NH update 10.0.0.1/32(0) - metric 0/0 #nhops 0/0 flags 0x6
    2022/05/17 09:57:26.094 BGP: NH update for 10.0.0.1/32(0)(VRF default) - flags 0x6 chgflags 0x0 - evaluate paths
    2022/05/17 09:57:26.094 BGP: evaluate_paths: Updating peer (10.0.0.1(VRF default)) status with NHT
    2022/05/17 09:57:30.081 ZEBRA: Event driven route-map update triggered
    2022/05/17 09:57:30.081 ZEBRA: Event handler for route-map: 10.0.0.1-out
    2022/05/17 09:57:30.081 ZEBRA: Event handler for route-map: 10.0.0.1-in
    2022/05/17 09:57:31.104 ZEBRA: netlink_parse_info: netlink-listen (NS 0) type RTM_NEWNEIGH(28), len=76, seq=0, pid=0
    2022/05/17 09:57:31.104 ZEBRA: 	Neighbor Entry received is not on a VLAN or a BRIDGE, ignoring
    2022/05/17 09:57:31.105 ZEBRA: netlink_parse_info: netlink-listen (NS 0) type RTM_NEWNEIGH(28), len=76, seq=0, pid=0
    2022/05/17 09:57:31.105 ZEBRA: 	Neighbor Entry received is not on a VLAN or a BRIDGE, ignoring
    Copy to Clipboard Toggle word wrap

7.4.9.1.1. FRRouting(FRR)日志级别

下表描述了 FRR 日志记录级别。

Expand
表 7.15. 日志级别
日志级别描述

all

为所有日志记录级别提供所有日志信息。

debug

这些信息有助于相关人员进行问题诊断。设置为 debug,以提供详细的故障排除信息。

info

提供始终应记录的信息,但在正常情况下,不需要用户干预。这是默认的日志记录级别。

warn

任何可能导致 MetalLB 行为不一致的情况。通常 MicalLB 会自动从这类错误中恢复。

错误

MetalLB 功能有验证影响的重大错误。这些错误通常需要管理员干预才能修复。

none

关闭所有日志。

7.4.9.2. BGP 故障排除问题

作为集群管理员,如果您需要对 BGP 配置问题进行故障排除,您需要在 FRR 容器中运行命令。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令,显示 frr-k8s pod 的名称:

    $ oc -n metallb-system get pods -l component=frr-k8s
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME            READY   STATUS    RESTARTS   AGE
    frr-k8s-thsmw   6/6     Running   0          109m
    Copy to Clipboard Toggle word wrap

  2. 运行以下命令显示 FRR 的运行配置:

    $ oc exec -n metallb-system frr-k8s-thsmw -c frr -- vtysh -c "show running-config"
    Copy to Clipboard Toggle word wrap

    输出示例

    Building configuration...
    
    Current configuration:
    !
    frr version 8.5.3
    frr defaults traditional
    hostname some-hostname
    log file /etc/frr/frr.log informational
    log timestamp precision 3
    no ip forwarding
    no ipv6 forwarding
    service integrated-vtysh-config
    !
    router bgp 64500  
    1
    
     bgp router-id 10.0.1.2
     no bgp ebgp-requires-policy
     no bgp default ipv4-unicast
     no bgp network import-check
     neighbor 10.0.2.3 remote-as 64500  
    2
    
     neighbor 10.0.2.3 bfd profile doc-example-bfd-profile-full  
    3
    
     neighbor 10.0.2.3 timers 5 15
     neighbor 10.0.2.4 remote-as 64500
     neighbor 10.0.2.4 bfd profile doc-example-bfd-profile-full
     neighbor 10.0.2.4 timers 5 15
     !
     address-family ipv4 unicast
      network 203.0.113.200/30   
    4
    
      neighbor 10.0.2.3 activate
      neighbor 10.0.2.3 route-map 10.0.2.3-in in
      neighbor 10.0.2.4 activate
      neighbor 10.0.2.4 route-map 10.0.2.4-in in
     exit-address-family
     !
     address-family ipv6 unicast
      network fc00:f853:ccd:e799::/124
      neighbor 10.0.2.3 activate
      neighbor 10.0.2.3 route-map 10.0.2.3-in in
      neighbor 10.0.2.4 activate
      neighbor 10.0.2.4 route-map 10.0.2.4-in in
     exit-address-family
    !
    route-map 10.0.2.3-in deny 20
    !
    route-map 10.0.2.4-in deny 20
    !
    ip nht resolve-via-default
    !
    ipv6 nht resolve-via-default
    !
    line vty
    !
    bfd
     profile doc-example-bfd-profile-full
      transmit-interval 35
      receive-interval 35
      passive-mode
      echo-mode
      echo-interval 35
      minimum-ttl 10
     !
    !
    end
    Copy to Clipboard Toggle word wrap

    1
    router bgp 部分指示 MetalLB 的 ASN。
    2
    确认添加的每个 BGP peer 自定义资源都有一个 neighbor <ip-address> remote-as <peer-ASN> 行。
    3
    如果您配置了 BFD,请确认 BFD 配置集已与正确的 BGP peer 关联,并且 BFD 配置集出现在命令输出中。
    4
    确认 network <ip-address-range> 行与您在地址池自定义资源中指定的 IP 地址范围匹配。
  3. 运行以下命令显示 BGP 概述:

    $ oc exec -n metallb-system frr-k8s-thsmw -c frr -- vtysh -c "show bgp summary"
    Copy to Clipboard Toggle word wrap

    输出示例

    IPv4 Unicast Summary:
    BGP router identifier 10.0.1.2, local AS number 64500 vrf-id 0
    BGP table version 1
    RIB entries 1, using 192 bytes of memory
    Peers 2, using 29 KiB of memory
    
    Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
    10.0.2.3        4      64500       387       389        0    0    0 00:32:02            0        1  
    1
    
    10.0.2.4        4      64500         0         0        0    0    0    never       Active        0  
    2
    
    
    Total number of neighbors 2
    
    IPv6 Unicast Summary:
    BGP router identifier 10.0.1.2, local AS number 64500 vrf-id 0
    BGP table version 1
    RIB entries 1, using 192 bytes of memory
    Peers 2, using 29 KiB of memory
    
    Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
    10.0.2.3        4      64500       387       389        0    0    0 00:32:02 NoNeg
    10.0.2.4        4      64500         0         0        0    0    0    never       Active        0
    
    Total number of neighbors 2
    Copy to Clipboard Toggle word wrap

    1
    确认输出包含您添加的每个 BGP peer 自定义资源的行。
    2
    显示收到的 0 个消息,并且发送的消息指示没有 BGP 会话的 BGP 对等点。检查 BGP 对等点的网络连接和 BGP 配置。
  4. 运行以下命令,显示接收地址池的 BGP 对等点:

    $ oc exec -n metallb-system frr-k8s-thsmw -c frr -- vtysh -c "show bgp ipv4 unicast 203.0.113.200/30"
    Copy to Clipboard Toggle word wrap

    ipv4 替换为 ipv6,以显示接收 IPv6 地址池的 BGP 对等点。将 203.0.113.200/30 替换为地址池的 IPv4 或 IPv6 IP 地址范围。

    输出示例

    BGP routing table entry for 203.0.113.200/30
    Paths: (1 available, best #1, table default)
      Advertised to non peer-group peers:
      10.0.2.3  
    1
    
      Local
        0.0.0.0 from 0.0.0.0 (10.0.1.2)
          Origin IGP, metric 0, weight 32768, valid, sourced, local, best (First path received)
          Last update: Mon Jan 10 19:49:07 2022
    Copy to Clipboard Toggle word wrap

    1
    确认输出中包含 BGP peer 的 IP 地址。

7.4.9.3. BFD 问题故障排除

红帽支持双向转发检测(BFD)实施,在 speaker Pod 中使用 FRRouting(FRR)。BFD 实施依赖于 BFD 对等点,也被配置为带有已建立的 BGP 会话的 BGP 对等点。作为集群管理员,如果您需要排除 BFD 配置问题,则需要在 FRR 容器中运行命令。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 显示 speaker pod 的名称:

    $ oc get -n metallb-system pods -l component=speaker
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME            READY   STATUS    RESTARTS   AGE
    speaker-66bth   4/4     Running   0          26m
    speaker-gvfnf   4/4     Running   0          26m
    ...
    Copy to Clipboard Toggle word wrap

  2. 显示 BFD 对等点:

    $ oc exec -n metallb-system speaker-66bth -c frr -- vtysh -c "show bfd peers brief"
    Copy to Clipboard Toggle word wrap

    输出示例

    Session count: 2
    SessionId  LocalAddress              PeerAddress              Status
    =========  ============              ===========              ======
    3909139637 10.0.1.2                  10.0.2.3                 up  <.>
    Copy to Clipboard Toggle word wrap

    确认 PeerAddress 列包含每个 BFD 对等点。如果输出没有列出输出要包含的 BFD peer IP 地址,并与 peer 对 BGP 连接性进行故障排除。如果状态字段显示 down,请检查在节点和对等点间的链接和设备连接。您可以使用 oc get pods -n metallb-system speaker-66bth -o jsonpath='{.spec.nodeName}' 命令确定 speaker pod 的节点名称。

7.4.9.4. BGP 和 BFD 的 MetalLB 指标

OpenShift Container Platform 捕获与 BGP peer 和 BFD 配置集相关的 MetalLB 的以下 Prometheus 指标。

Expand
表 7.16. MetalLB BFD 指标
Name描述

frrk8s_bfd_control_packet_input

统计从每个 BFD peer 接收的 BFD 控制数据包的数量。

frrk8s_bfd_control_packet_output

统计发送到每个 BFD 对等点的 BFD 控制数据包的数量。

frrk8s_bfd_echo_packet_input

统计从每个 BFD 对等点接收的 BFD 回显数据包的数量。

frrk8s_bfd_echo_packet_output

计算发送到每个 BFD 的 BFD 回显数据包的数量。

frrk8s_bfd_session_down_events

统计 BFD 会话进入 down 状态的次数。

frrk8s_bfd_session_up

指示与 BFD 对等点的连接状态。1 表示会话状态为 up0 表示会话为 down

frrk8s_bfd_session_up_events

统计 BFD 会话进入 up 状态的次数。

frrk8s_bfd_zebra_notifications

统计每个 BFD Zebra 通知的数量。

Expand
表 7.17. MetalLB BGP 指标
Name描述

frrk8s_bgp_announced_prefixes_total

计算公告给 BGP 对等的负载均衡器 IP 地址前缀的数量。术语 前缀(prefix)聚合路由(aggregated route) 具有相同的含义。

frrk8s_bgp_session_up

指示与 BGP 对等点的连接状态。1 表示会话状态为 up0 表示会话为 down

frrk8s_bgp_updates_total

计算发送到每个 BGP 对等点的 BGP 更新消息数量。

frrk8s_bgp_opens_sent

计算发送到每个 BGP 对等点的 BGP 打开消息数量。

frrk8s_bgp_opens_received

计算从每个 BGP 对等点接收的 BGP 打开消息的数量。

frrk8s_bgp_notifications_sent

计算发送到每个 BGP 对等点的 BGP 通知消息数量。

frrk8s_bgp_updates_total_received

计算从每个 BGP 对等点接收的 BGP 更新消息数量。

frrk8s_bgp_keepalives_sent

计算发送到每个 BGP 对等点的 BGP keepalive 消息数量。

frrk8s_bgp_keepalives_received

计算从每个 BGP 对等点接收的 BGP keepalive 消息数量。

frrk8s_bgp_route_refresh_sent

计算发送到每个 BGP 对等点的 BGP 路由刷新消息的数量。

frrk8s_bgp_total_sent

计算发送到每个 BGP 对等点的 BGP 消息总数。

frrk8s_bgp_total_received

计算从每个 BGP 对等点接收的 BGP 消息总数。

其他资源

7.4.9.5. 关于收集 MetalLB 数据

您可以使用 oc adm must-gather CLI 命令来收集有关集群、MetalLB 配置和 MetalLB Operator 的信息。以下功能和对象与 MetalLB 和 MetalLB Operator 关联:

  • 在其中部署 MetalLB Operator 的命名空间和子对象
  • 所有 MetalLB Operator 自定义资源定义(CRD)

oc adm must-gather CLI 命令会收集红帽用来实施 BGP 和 BFD 的 FRRouting(FRR)的以下信息:

  • /etc/frr/frr.conf
  • /etc/frr/frr.log
  • /etc/frr/daemons 配置文件
  • /etc/frr/vtysh.conf

上述列表中的日志和配置文件从每个 speaker pod 中的 frr 容器收集。

除了日志和配置文件外,oc adm must-gather CLI 命令还会从以下 vtysh 命令收集输出:

  • show running-config
  • show bgp ipv4
  • show bgp ipv6
  • show bgp neighbor
  • show bfd peer

运行 oc adm must-gather CLI 命令时不需要额外的配置。

其他资源

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat