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

可选: Peers 限制 BGP 对等点来公告所选池的 IP。如果为空,负载均衡器 IP 会声明所有配置了 BGP 对等点。

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.