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


27.1. 配置 MetalLB 地址池

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

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

27.1.1. 关于 IPAddressPool 自定义资源

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

表 27.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

spec.avoidBuggyIPs

布尔值

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

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

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

priority

int

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

命名空间

数组(字符串)

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

namespaceSelectors

数组 (LabelSelector)

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

serviceSelectors

数组 (LabelSelector)

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

27.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
    1
    分配给 IPAddressPool 的该标签可通过 BGPAdvertisement CRD 中的 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 地址范围显示在输出中。

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

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

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

      $ oc edit network.config.openshift/cluster
    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
      ...

27.1.4. 地址池配置示例

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

27.1.4.2. 示例:保留 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

27.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
  - 2002:2:2::1-2002:2:2::100

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

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

27.1.5. 后续步骤

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.