32.5. 关于 IP 地址池的广告


您可以配置 MetalLB,以便使用第 2 层协议、BGP 协议或两者来广告 IP 地址。通过第 2 层,MetalLB 提供了容错的外部 IP 地址。使用 BGP,MetalLB 为外部 IP 地址和负载均衡提供容错功能。

MetalLB 支持将 L2 和 BGP 用于同一组 IP 地址。

MetalLB 提供了将地址池分配给特定 BGP 对等对象到网络上节点子集的灵活性。这可以实现更复杂的配置,例如促进节点隔离或网络分段。

32.5.1. 关于 BGPAdvertisement 自定义资源

BGPAdvertise 对象的字段在下表中定义:

表 32.3. BGPAdvertise 配置
字段类型描述

metadata.name

string

指定 BGP 广告的名称。

metadata.namespace

string

指定 BGP 广告的命名空间。指定 MetalLB Operator 使用的同一命名空间。

spec.aggregationLength

整数

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

spec.aggregationLengthV6

整数

可选:指定 128 位 CIDR 掩码中包含的位数。例如,在聚合长度为 124 时,speaker 可以聚合几个 fc00:f853:0ccd:e799::x/128 服务 IP 地址,并公告一个 fc00:f853:0ccd:e799::0/124 路由。

spec.communities

string

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

  • NO_EXPORT: 65535:65281
  • NO_ADVERTISE: 65535:65282
  • NO_EXPORT_SUBCONFED: 65535:65283

    注意

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

spec.localPref

整数

可选:指定这个广播的本地首选项。此 BGP 属性适用于 Autonomous System 中的 BGP 会话。

spec.ipAddressPools

string

可选:用于使用这个广告进行广告的 IPAddressPools 列表,按名称选择。

spec.ipAddressPoolSelectors

string

可选:使用这个广告进行广告的 IPAddressPools 的选择器。这可用于根据分配给 IPAddressPool 而非名称本身的标签将 IPAddressPool 与公告关联。如果这个或列表没有选择 IPAddressPool,则公告会应用到所有 IPAddressPools

spec.nodeSelectors

string

可选:NodeSelectors 允许限制节点作为负载均衡器 IP 的下一个跃点。如果为空,所有节点都会作为下一个跃点进行宣布。

spec.peers

string

可选:使用列表为每个 BGPPeer 资源指定 metadata.name 值,该资源接收 MetalLB 服务 IP 地址公告。MetalLB 服务 IP 地址从 IP 地址池分配。默认情况下,MetalLB 服务 IP 地址公告给所有配置的 BGPPeer 资源。使用此字段将公告限制到特定的 BGPpeer 资源。

32.5.2. 使用 BGP 公告和基本用例配置 MetalLB

按如下所示配置 MetalLB,使对等 BGP 路由器为每个 MetalLB 分配为服务的负载均衡器 IP 地址接收一个 203.0.113.200/32 路由和一个 fc00:f853:ccd:e799::1/128 路由。因为没有指定 localPrefcommunity 字段,所以路由会公告,并将 localPref 设置为 0,且没有 BGP 社区。

32.5.2.1. 示例:使用 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

32.5.3. 使用 BGP 广告和高级用例配置 MetalLB

按如下所示配置 MetalLB,使得 MetalLB 分配给负载均衡器的 IP 地址范围是 203.0.113.200203.0.113.203,以及 fc00:f853:ccd:e799::0fc00:f853:ccd:e799::f

为了说明两个 BGP 公告,在 MetalLB 分配 IP 地址 203.0.113.200 时,请考虑实例。以该 IP 地址为例,发言人向 BGP 对等点公告两个路由:

  • 203.0.113.200/32localPref 设置为 100,社区设置为 NO_ADVERTISE 社区的数字值。此规范指示它们可以使用此路由的对等路由器,但它们不应将有关此路由的信息传播到 BGP 对等点。
  • 203.0.113.200/30 将 MetalLB 分配的负载均衡器 IP 地址聚合到一个路由中。MetalLB 公告到 BGP 对等点的聚合路由,并将 community 属性设置为 8000:800。BGP 同行将 203.0.113.200/30 个路由传播到其他 BGP 同级服务器。当流量通过发言人路由到节点时,使用 203.0.113.200/32 路由将流量转发到集群以及与该服务关联的 pod。

当添加更多服务和 MetalLB 从池中分配更多负载均衡器 IP 地址时,对等路由器收到一个本地路由,203.0.113.20x/32,以及 203.0.113.200/30 聚合路由。您添加的每个服务都会生成 /30 路由,但 MetalLB 会将路由重复数据删除到一个 BGP 公告,然后再与对等路由器通信。

32.5.3.1. 示例:使用 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

32.5.4. 从节点的子集公告 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

32.5.5. 关于 L2Advertisement 自定义资源

l2Advertise 对象的字段在下表中定义:

表 32.4. L2 广告配置
字段类型描述

metadata.name

string

指定 L2 广告的名称。

metadata.namespace

string

指定 L2 广告的命名空间。指定 MetalLB Operator 使用的同一命名空间。

spec.ipAddressPools

string

可选:用于使用这个广告进行广告的 IPAddressPools 列表,按名称选择。

spec.ipAddressPoolSelectors

string

可选:使用这个广告进行广告的 IPAddressPools 的选择器。这可用于根据分配给 IPAddressPool 而非名称本身的标签将 IPAddressPool 与公告关联。如果这个或列表没有选择 IPAddressPool,则公告会应用到所有 IPAddressPools

spec.nodeSelectors

string

可选:NodeSelectors 将节点限制在负载均衡器 IP 的下一跃点中。如果为空,所有节点都会作为下一个跃点进行宣布。

重要

限制节点,因为下一跃点只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

spec.interfaces

string

可选:用于声明负载均衡器 IP 的接口列表。

32.5.6. 使用 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

32.5.7. 使用 L2 广告和标签配置 MetalLB

BGPAdvertisementL2Advertisement 中的 ipAddress Pools 字段用于根据分配给 IPAddressPool 的标签将 IPAddressPool 与广告相关联。

本例演示了如何配置 MetalLB,以便通过配置 ipAddressPoolSelectors 字段来广告使用 L2 协议的 IPAddressPools

先决条件

  • 安装 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 创建 L2 广告广告 IP。

    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

32.5.8. 为所选接口配置带有 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. 使用 接口 选择器创建 L2 广告广告 IP。

    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 的节点。如果节点没有所选接口,则所选节点不会宣布该服务。

32.5.9. 使用二级网络配置 MetalLB

在 OpenShift Container Platform 4.14 中,默认的网络行为是不允许在网络接口之间转发 IP 数据包。因此,当在二级接口上配置 MetalLB 时,您需要添加机器配置来只为所需的接口启用 IP 转发。

注意

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

要为二级接口启用 IP 转发,有两个选项:

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

    注意

    为特定接口启用 IP 转发提供了更精细的控制,同时为所有接口启用它应用全局设置。

流程

  1. 通过创建并应用 MachineConfig CR,为特定二级接口启用转发,如 bridge-net

    1. 创建 MachineConfig CR,为名为 bridge-net 的指定的二级接口启用 IP 转发。
    2. 将以下 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,`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`
                 verification: {}
              filesystem: root
              mode: 644
              path: /etc/sysctl.d/enable-global-forwarding.conf
        osImageURL: ""
      1
      要启用 IP 转发的节点角色,如 worker
    3. 运行以下命令来应用配置:

      $ oc apply -f enable-ip-forward.yaml
  2. 另外,您可以运行以下命令来全局启用 IP 转发:

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

32.5.10. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.