第 4 章 使用 MetalLB 进行负载平衡


4.1. 配置 MetalLB 地址池

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

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

4.1.1. 关于 IPAddressPool 自定义资源

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

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

metadata.name

string

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

metadata.namespace

string

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

metadata.label

string

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

spec.addresses

string

指定分配给服务的 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
表 4.2. MetalLB IPAddressPool 自定义资源 spec.serviceAllocation 子字段
字段类型描述

priority

int

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

命名空间

数组(字符串)

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

namespaceSelectors

数组 (LabelSelector)

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

serviceSelectors

数组 (LabelSelector)

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

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 地址范围。

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

4.1.4. 地址池配置示例

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

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

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 地址。

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 地址池分配一个或多个服务标签。

4.1.5. 后续步骤

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat