×

您可以配置 MetalLB,以便使用第 2 层协议、BGP 协议或两者同时广告 IP 地址。使用第 2 层,MetalLB 提供容错的外部 IP 地址。使用 BGP,MetalLB 提供外部 IP 地址的容错性和负载均衡。

MetalLB 支持对同一组 IP 地址使用 L2 和 BGP 进行广告。

MetalLB 提供灵活性,可以有效地将地址池分配给特定的 BGP 对等体,从而分配到网络上的节点子集。这允许更复杂的配置,例如促进节点隔离或网络分割。

关于 BGPAdvertisement 自定义资源

BGPAdvertisements 对象的字段定义在下面的表格中

表 1. BGPAdvertisements 配置
字段 类型 描述

metadata.name

字符串

指定 BGP 广告的名称。

metadata.namespace

字符串

指定 BGP 广告的命名空间。指定与 MetalLB 运算符使用的命名空间相同的命名空间。

spec.aggregationLength

整数

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

spec.aggregationLengthV6

整数

可选:指定要在 128 位 CIDR 掩码中包含的位数。例如,如果聚合长度为124,发言者可以聚合多个fc00:f853:0ccd:e799::x/128服务 IP 地址并通告单个fc00:f853:0ccd:e799::0/124路由。

spec.communities

字符串

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

  • NO_EXPORT: 65535:65281

  • NO_ADVERTISE: 65535:65282

  • NO_EXPORT_SUBCONFED: 65535:65283

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

spec.localPref

整数

可选:指定此广告的本地首选项。此 BGP 属性适用于自治系统内的 BGP 会话。

spec.ipAddressPools

字符串

可选:使用此广告通告的IPAddressPools列表,按名称选择。

spec.ipAddressPoolSelectors

字符串

可选:用于使用此广告通告的IPAddressPools的选择器。这是根据分配给IPAddressPool的标签而不是名称本身将IPAddressPool与广告关联的。如果没有通过此列表或列表选择任何IPAddressPool,则广告将应用于所有IPAddressPools

spec.nodeSelectors

字符串

可选:NodeSelectors允许限制作为负载均衡器 IP 的下一跳通告的节点。为空时,所有节点都将作为下一跳通告。

spec.peers

字符串

可选:Peers 将通告所选池的 IP 的 BGP 对等体限制为此。为空时,负载均衡器 IP 将通告给配置的所有 BGP 对等体。

使用 BGP 广告配置 MetalLB 及其基本用例

按如下方式配置 MetalLB,以便对等 BGP 路由器为 MetalLB 分配给服务的每个负载均衡器 IP 地址接收一个203.0.113.200/32路由和一个fc00:f853:ccd:e799::1/128路由。由于未指定localPrefcommunities字段,因此路由将使用设置为零的localPref和无 BGP 社区进行通告。

示例:使用 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
    2. 应用 IP 地址池的配置

      $ oc apply -f ipaddresspool.yaml
  2. 创建一个 BGP 广告。

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

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

      $ oc apply -f bgpadvertisement.yaml

使用 BGP 广告配置 MetalLB 及其高级用例

按照以下步骤配置 MetalLB,使其在 203.0.113.200203.0.113.203 以及 fc00:f853:ccd:e799::0fc00:f853:ccd:e799::f 范围内为负载均衡服务分配 IP 地址。

为了解释这两个 BGP 通告,考虑 MetalLB 将 203.0.113.200 IP 地址分配给某个服务的情况。以该 IP 地址为例,speaker 会向 BGP 对等体通告两条路由。

  • 203.0.113.200/32localPref 设置为 100,社区属性设置为 NO_ADVERTISE 社区的数值。此规范指示对等路由器可以使用此路由,但不应将其传播给其他 BGP 对等体。

  • 203.0.113.200/30,将 MetalLB 分配的负载均衡器 IP 地址聚合到单条路由中。MetalLB 以社区属性设置为 8000:800 向 BGP 对等体通告此聚合路由。BGP 对等体将 203.0.113.200/30 路由传播到其他 BGP 对等体。当流量路由到具有 speaker 的节点时,将使用 203.0.113.200/32 路由将流量转发到集群和与服务关联的 Pod。

随着您添加更多服务以及 MetalLB 从池中分配更多负载均衡器 IP 地址,对等路由器将为每个服务接收一条本地路由 203.0.113.20x/32,以及 203.0.113.200/30 聚合路由。您添加的每个服务都会生成 /30 路由,但 MetalLB 会在与对等路由器通信之前将路由去重为一个 BGP 通告。

示例:使用 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
    2. 应用 IP 地址池的配置

      $ oc apply -f ipaddresspool.yaml
  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
    2. 应用配置

      $ oc apply -f bgpadvertisement1.yaml
    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
    4. 应用配置

      $ oc apply -f bgpadvertisement2.yaml

从节点子集通告 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
  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

在此示例中,来自 pool1 的 IP 地址仅由 NodeANodeB 通告。

关于 L2Advertisement 自定义资源

l2Advertisements 对象的字段在以下表格中定义

表 2. L2 通告配置
字段 类型 描述

metadata.name

字符串

指定 L2 通告的名称。

metadata.namespace

字符串

指定 L2 通告的命名空间。指定与 MetalLB 运算符使用的命名空间相同。

spec.ipAddressPools

字符串

可选:使用此广告通告的IPAddressPools列表,按名称选择。

spec.ipAddressPoolSelectors

字符串

可选:用于使用此广告通告的IPAddressPools的选择器。这是根据分配给IPAddressPool的标签而不是名称本身将IPAddressPool与广告关联的。如果没有通过此列表或列表选择任何IPAddressPool,则广告将应用于所有IPAddressPools

spec.nodeSelectors

字符串

可选:NodeSelectors 将节点限制为作为负载均衡器 IP 的下一跳进行通告。为空时,所有节点都将作为下一跳进行通告。

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

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

spec.interfaces

字符串

可选:用于通告负载均衡器 IP 的 interfaces 列表。

使用 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
    2. 应用 IP 地址池的配置

      $ oc apply -f ipaddresspool.yaml
  2. 创建一个 L2 通告。

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

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

      $ oc apply -f l2advertisement.yaml

使用 L2 通告和标签配置 MetalLB

BGPAdvertisementL2Advertisement 自定义资源定义中的 ipAddressPoolSelectors 字段用于基于分配给 IPAddressPool 的标签而不是名称本身将 IPAddressPool 与通告关联。

此示例演示如何通过配置 ipAddressPoolSelectors 字段来配置 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-label
        labels:
          zone: east
      spec:
        addresses:
          - 172.31.249.87/32
    2. 应用 IP 地址池的配置

      $ oc apply -f ipaddresspool.yaml
  2. 创建一个使用 ipAddressPoolSelectors 通告 IP 的 L2 通告。

    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
    2. 应用配置

      $ oc apply -f l2advertisement.yaml

为选定的接口配置使用 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
    2. 应用 IP 地址池的配置,如下例所示

      $ oc apply -f ipaddresspool.yaml
  2. 创建一个使用 interfaces 选择器通告 IP 的 L2 通告。

    1. 创建一个 YAML 文件,例如 l2advertisement.yaml,并输入如下例所示的配置详细信息

      apiVersion: metallb.io/v1beta1
      kind: L2Advertisement
      metadata:
        name: l2advertisement
        namespace: metallb-system
      spec:
        ipAddressPools:
         - doc-example-l2
         interfaces:
         - interfaceA
         - interfaceB
    2. 应用通告的配置,如下例所示

      $ oc apply -f l2advertisement.yaml

接口选择器不会影响 MetalLB 使用 L2 选择通告给定 IP 的节点的方式。如果节点没有选择的接口,则选择的节点不会通告服务。

配置具有辅助网络的 MetalLB

从 OpenShift Container Platform 4.14 开始,默认网络行为是不允许在网络接口之间转发 IP 数据包。因此,当在辅助接口上配置 MetalLB 时,您需要添加机器配置以仅为所需的接口启用 IP 转发。

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

要为辅助接口启用 IP 转发,您有两种选择

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

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

    为特定接口启用 IP 转发可以提供更精细的控制,而为所有接口启用 IP 转发则应用全局设置。

为特定接口启用 IP 转发

步骤
  1. 通过运行以下命令修补集群网络操作符,将参数routingViaHost设置为true

    $ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig": {"routingViaHost": true} }}}}' --type=merge
  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
      示例输出
      bmV0LmlwdjQuY29uZi5icmlkZ2UtbmV0LmZvcndhcmRpbmcgPSAxCm5ldC5pcHY2LmNvbmYuYnJpZGdlLW5ldC5mb3J3YXJkaW5nID0gMQpuZXQuaXB2NC5jb25mLmJyaWRnZS1uZXQucnBfZmlsdGVyID0gMApuZXQuaXB2Ni5jb25mLmJyaWRnZS1uZXQucnBfZmlsdGVyID0gMAo=
    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: 644
              path: /etc/sysctl.d/enable-global-forwarding.conf
        osImageURL: ""
      1 您要启用 IP 转发的节点角色,例如worker
      2 使用生成的 Base64 字符串填充
    4. 运行以下命令应用配置

      $ oc apply -f enable-ip-forward.yaml
验证
  1. 应用机器配置后,请按照以下步骤验证更改

    1. 通过运行以下命令进入目标节点的调试会话

      $ oc debug node/<node-name>

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

    2. 在调试 shell 中将/host设置为根目录,运行以下命令

      $ chroot /host

      调试 Pod 将宿主的根文件系统挂载到 Pod 内的/host。通过将根目录更改为/host,您可以运行包含在主机可执行路径中的二进制文件。

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

      $ cat /etc/sysctl.d/enable-global-forwarding.conf
      预期输出
      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

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

全局启用 IP 转发

  • 运行以下命令全局启用 IP 转发

$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}

其他资源