33.4. 配置 MetalLB 地址池


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

33.4.1. 关于 IPAddressPool 自定义资源

注意

在 OpenShift Container Platform 4.10 中的地址池自定义资源定义(CRD)和 API(包括在 "Load balancing with MetalLB" 文档中)在 OpenShift Container Platform 4.13 中仍然可以使用但是,在使用 AddressPool CRD 时,不支持从带有第 2 层协议或 BGP 协议的 IPAddressPool 中广告 IP 地址关联的增强功能。

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

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

metadata.name

string

指定地址池的名称。添加服务时,您可以在 metallb.universe.tf/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.universe.tf/address-pool 注解从这个池中明确请求 IP 地址,请指定 false。默认值为 true

注意

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

spec.avoidBuggyIPs

布尔值

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

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

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

priority

int

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

命名空间

数组(字符串)

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

namespaceSelectors

数组 (LabelSelector)

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

serviceSelectors

数组 (LabelSelector)

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

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

33.4.3. 地址池配置示例

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

33.4.3.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

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

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

33.4.4. 后续步骤

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat