×

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

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

关于 IPAddressPool 自定义资源

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

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

metadata.name

字符串

指定地址池的名称。添加服务时,您可以在metallb.universe.tf/address-pool注释中指定此池名称,以从特定池中选择 IP 地址。文档中始终使用doc-examplesilvergold这些名称。

metadata.namespace

字符串

指定地址池的命名空间。指定与 MetalLB 运算符使用的命名空间相同的命名空间。

metadata.label

字符串

可选:指定分配给IPAddressPool的键值对。这可以在BGPAdvertisementL2AdvertisementCRD中的ipAddressPoolSelectors中引用,以将IPAddressPool与广告关联起来。

spec.addresses

字符串

指定 MetalLB 运算符要分配给服务的 IP 地址列表。您可以在单个池中指定多个范围;它们都将共享相同的设置。以 CIDR 表示法指定每个范围,或者以短划线分隔的起始和结束 IP 地址的形式指定。

spec.autoAssign

布尔值

可选:指定 MetalLB 是否自动从此池分配 IP 地址。如果您想使用metallb.universe.tf/address-pool注释显式请求从此池中的 IP 地址,请指定false。默认值为true

spec.avoidBuggyIPs

布尔值

可选:启用此选项可确保不从池中分配以 .0 和 .255 结尾的 IP 地址。默认值为false。一些较旧的消费者网络设备错误地阻止了以 .0 和 .255 结尾的 IP 地址。

您可以通过配置spec.serviceAllocation规范将 IP 地址池中的 IP 地址分配给服务和命名空间。

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

priority

整数

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

namespaces

数组(字符串)

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

namespaceSelectors

数组 (LabelSelector)

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

serviceSelectors

数组 (LabelSelector)

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

配置地址池

作为集群管理员,您可以向集群添加地址池以控制 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
    1 分配给IPAddressPool的此标签可以在BGPAdvertisementCRD中的ipAddressPoolSelectors中引用,以将IPAddressPool与广告关联起来。
  2. 应用 IP 地址池的配置

    $ oc apply -f ipaddresspool.yaml
验证
  • 查看地址池

    $ oc describe -n metallb-system IPAddressPool doc-example
    示例输出
    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>

确认地址池名称(例如doc-example)和 IP 地址范围显示在输出中。

为 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)
    1 分配给IPAddressPool的此标签可以在BGPAdvertisementCRD中的ipAddressPoolSelectors中引用,以将IPAddressPool与广告关联起来。
    2 此 IP 范围必须与网络上分配给 VLAN 的子网匹配。要支持第 2 层 (L2) 模式,IP 地址范围必须与集群节点位于同一个子网中。
  2. 应用 IP 地址池的配置

    $ oc apply -f ipaddresspool-vlan.yaml
  3. 要确保此配置应用于 VLAN,您需要将spec gatewayConfig.ipForwarding设置为Global

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

      $ oc edit network.config.openshift/cluster
    2. 更新spec.defaultNetwork.ovnKubernetesConfig部分以包含设置为GlobalgatewayConfig.ipForwarding。它应该如下所示

      示例
      ...
      spec:
        clusterNetwork:
          - cidr: 10.128.0.0/14
            hostPrefix: 23
        defaultNetwork:
          type: OVNKubernetes
          ovnKubernetesConfig:
            gatewayConfig:
              ipForwarding: Global
      ...

示例地址池配置

示例: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

示例:保留 IP 地址

您可以将autoAssign字段设置为false以阻止 MetalLB 自动分配池中的 IP 地址。添加服务时,您可以请求池中的特定 IP 地址,也可以在注释中指定池名称以请求池中的任何 IP 地址。

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

示例:IPv4 和 IPv6 地址

您可以添加使用 IPv4 和 IPv6 的地址池。您可以在addresses列表中指定多个范围,就像几个 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
  - 2002:2:2::1-2002:2:2::100

示例:将 IP 地址池分配给服务或命名空间

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

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

您可以使用matchLabels标签选择器、matchExpressions标签选择器或两者兼用,用于namespaceSelectorsserviceSelectors规范。此示例演示每个规范的一个标签选择器。

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
1 为地址池分配优先级。数字越小,优先级越高。
2 以列表格式将一个或多个命名空间分配到 IP 地址池。
3 使用列表格式中的标签选择器将一个或多个命名空间标签分配到 IP 地址池。
4 使用列表格式中的标签选择器将一个或多个服务标签分配到 IP 地址池。