6.4. MetalLB Operator


6.4.1. 关于 MetalLB 和 MetalLB Operator

作为集群管理员,您可以将 MetalLB Operator 添加到集群中,以便在将 LoadBalancer 类型服务添加到集群中时,MetalLB 可为该服务添加外部 IP 地址。外部 IP 地址添加到集群的主机网络中。

6.4.1.1. 何时使用 MetalLB

当您有裸机集群或类似裸机的基础架构时,使用 MetalLB 有价值,并且您希望通过外部 IP 地址对应用程序进行容错访问。

您必须配置网络基础架构,以确保外部 IP 地址的网络流量从客户端路由到集群的主机网络。

使用 MetalLB Operator 部署 MetalLB 后,当添加类型为 LoadBalancer 的服务时,MetalLB 提供了一个平台原生负载均衡器。

当外部流量通过 MetalLB LoadBalancer 服务进入 OpenShift Container Platform 集群时,返回到客户端的流量具有负载均衡器的外部 IP 地址作为源 IP。

在 layer2 模式中的 MetalLB 操作通过使用与 IP 故障转移类似的机制提供对故障切换的支持。但是,MetalLB 利用基于 gosip 的协议来识别节点故障实例,而不依赖于虚拟路由器冗余协议 (VRRP) 和 keepalived。当检测到故障转移时,另一个节点会假定领导节点的角色,并且分配了一个 gratuitous ARP 消息来广播此更改。

MetalLB 在 layer3 或边框网关协议 (BGP) 模式下操作,将故障检测委派给网络。OpenShift Container Platform 节点建立连接的 BGP 路由器或路由器将识别任何节点故障并终止到该节点的路由。

最好使用 MetalLB 而不是 IP 故障转移来确保 pod 和服务的高可用性。

6.4.1.2. MetalLB Operator 自定义资源

MetalLB Operator 为以下自定义资源监控自己的命名空间:

MetalLB
当您在集群中添加 MetalLB 自定义资源时,MetalLB Operator 会在集群中部署 MetalLB。Operator 只支持单个自定义资源实例。如果删除了实例,Operator 会从集群中删除 MetalLB。
IPAddressPool

MetalLB 需要一个或多个 IP 地址池,您可以在添加类型为 LoadBalancer 的服务时分配给服务。一个 IPAddressPool,包含 IP 地址列表。列表可以是使用范围设置的单个 IP 地址,如 1.1.1.1-1.1.1.1、以 CIDR 表示法指定的范围、指定为起始和结束地址的范围,或者以连字符分隔的、两者的组合。IPAddressPool 需要一个名称。文档使用 doc-exampledoc-example-reserveddoc-example-ipv6 等名称。MetalLB 控制器IPAddressPool 中的地址池中分配 IP 地址。L2AdvertisementBGPAdvertisement 自定义资源启用从一个指定池中广告一个给定 IP。您可以使用 IPAddressPool 自定义资源中的 spec.serviceAllocation 规格将 IP 地址从 IPAddressPool 分配给服务和命名空间。

注意

单个 IPAddressPool 可以被 L2 公告和 BGP 公告来引用。

BGPPeer
BGP peer 自定义资源标识 MetalLB 进行通信的 BGP 路由器、路由器的 AS 数量、MetalLB 的 AS 编号,以及路由公告的自定义。MetalLB 将服务负载平衡器 IP 地址的路由公告给一个或多个 BGP 对等点。
BFDProfile
BFD 配置集自定义资源可为 BGP peer 配置双向转发检测(BFD)。BFD 提供比 BGP 单独提供的路径故障检测速度。
L2Advertisement
L2Advertisement 自定义资源使用 L2 协议广告一个来自 IPAddressPool 的 IP。
BGPAdvertisement
BGPAdvertisement 自定义资源使用 BGP 协议广告一个来自 IPAddressPool 的 IP。

在将 MetalLB 自定义资源添加到集群,且 Operator 部署了 MetalLB 后,controllerspeaker MetalLB 软件组件将开始运行。

MetalLB 验证所有相关自定义资源。

6.4.1.3. MetalLB 软件组件

安装 MetalLB Operator 时,metallb-operator-controller-manager 部署会启动一个 pod。pod 是 Operator 的实施。pod 监控所有相关资源的更改。

当 Operator 启动 MetalLB 实例时,它会启动一个 controller 部署和一个 speaker 守护进程集。

注意

您可以在 MetalLB 自定义资源中配置部署规格,以管理 controllerspeaker pod 如何在集群中部署和运行。有关这些部署规格的更多信息,请参阅附加资源部分

controller

Operator 会启动部署和单个 pod。当您添加类型为 LoadBalancer 的服务时,Kubernetes 使用 controller 从地址池中分配 IP 地址。如果服务失败,请验证 controller pod 日志中有以下条目:

输出示例

"event":"ipAllocated","ip":"172.22.0.201","msg":"IP address assigned by controller

speaker

Operator 为 speaker pod 启动守护进程集。默认情况下,在集群的每个节点上启动 pod。您可以在启动 MetalLB 时在 MetalLB 自定义资源中指定节点选择器,将 pod 限制到特定的节点。如果 controller 为服务分配了 IP 地址,并且服务仍不可用,请阅读 speaker pod 日志。如果 speaker pod 不可用,请运行 oc describe pod -n 命令。

对于第 2 层模式,控制器 为服务分配 IP 地址后,speaker pod 使用一种算法来确定哪些 speaker pod 将宣布负载均衡器 IP 地址。该算法涉及对节点名称和负载均衡器 IP 地址进行哈希处理。如需更多信息,请参阅"MetalLB 和外部流量策略"。speaker 使用地址解析协议 (ARP) 来宣布 IPv4 地址和邻居发现协议 (NDP) 来宣布 IPv6 地址。

对于 Border Gateway Protocol (BGP) 模式,controller 为服务分配 IP 地址后,每个 speaker pod 为其 BGP 对等点公告负载均衡器 IP 地址。您可以配置节点在 BGP 对等点上启动 BGP 会话。

对负载均衡器 IP 地址的请求会路由到具有声明 IP 地址的 speaker 的节点。节点接收数据包后,服务代理会将数据包路由到该服务的端点。在最佳情况下,端点可以位于同一节点上,也可以位于另一节点上。每次建立连接时,服务代理都会选择一个端点。

6.4.1.4. MetalLB 和外部流量策略

使用第 2 层模式时,集群中的一个节点会接收服务 IP 地址的所有流量。使用 BGP 模式时,主机网络上的路由器会打开与集群中其中一个节点的连接,用于新客户端连接。集群在进入节点后如何处理流量受外部流量策略的影响。

cluster

这是 spec.externalTrafficPolicy 的默认值。

使用 cluster 流量策略时,节点接收流量后,服务代理会将流量分发到服务中的所有容器集。此策略在 pod 之间提供统一流量分布,但它会模糊客户端 IP 地址,并可能会在 pod 中显示流量源自节点而不是客户端的应用。

local

采用 local 流量策略时,节点接收流量后,服务代理仅将流量发送到同一节点上的 pod。例如,如果节点上的 speaker pod 宣布外部服务 IP,则所有流量都发送到节点 A。流量进入节点 A 后,服务代理仅将流量发送到节点 A 上的服务的 pod。位于其他节点上的服务的 Pod 不会从节点 A 接收任何流量。在需要故障转移时,其他节点上的服务的 Pod 充当副本。

此策略不会影响客户端 IP 地址。应用容器集可以确定来自传入连接的客户端 IP 地址。

注意

在 BGP 模式中配置外部流量策略时,以下信息非常重要。

虽然 MetalLB 公告来自所有有资格的节点的负载均衡器 IP 地址,但可能会限制在路由器的容量下,以建立同等成本多路径(ECMP)路由。如果广告 IP 的节点数量大于路由器的 ECMP 组的限制,路由器将使用比广告 IP 的节点数量少的节点。

例如,如果外部流量策略设置为 local,且路由器将 ECMP 组限制设置为 16,实施 LoadBalancer 服务的 pod 部署在 30 个节点上,这会导致在 14 个节点上部署的 pod 不接收任何流量。在这种情况下,最好将该服务的外部流量策略设置为 cluster

6.4.1.5. 第 2 层模式的 MetalLB 概念

在第 2 层模式中,一个节点上的 speaker pod 向主机网络宣布服务的外部 IP 地址。从网络的角度来看,节点似乎有多个 IP 地址分配给网络接口。

注意

在第 2 层模式中,MetalLB 依赖于 ARP 和 NDP。这些协议在特定子网中实施本地地址解析。在这种情况下,客户端必须能够访问由 MetalLB 分配的 VIP,它与节点位于同一个子网中,以便 MetalLB 正常工作。

speaker pod 响应 IPv4 服务和 IPv6 的 NDP 请求。

在第 2 层模式中,服务 IP 地址的所有流量都通过一个节点进行路由。在流量进入节点后,CNI 网络供应商的服务代理会将流量分发到该服务的所有 pod。

由于服务的所有流量都通过第 2 层模式中的单一节点进入,所以严格意义上,MetalLB 不会为第 2 层实施负载平衡器。相反,MetalLB 为第 2 层实施故障转移机制,以便在 speaker pod 不可用时,不同节点上的 speaker pod 可以宣布服务 IP 地址。

当节点不可用时,自动故障转移。其他节点上的 speaker pod 检测到节点不可用,新的 speaker pod 和节点从故障节点上拥有服务 IP 地址的所有权。

MetalLB 和第 2 层模式的概念示意图

上图显示了与 MetalLB 相关的以下概念:

  • 应用程序可以通过在 172.130.0.0/16 子网上具有集群 IP 的服务获取。该 IP 地址可以从集群内部访问。服务也有一个外部 IP 地址,用于分配给服务的 MetalLB,即 192.168.100.200
  • 节点 1 和 3 具有应用程序的 pod。
  • speaker 守护进程集在每个节点上运行一个 pod。MetalLB Operator 启动这些 pod。
  • 每个 speaker pod 都是主机网络的 pod。容器集的 IP 地址与主机网络上节点的 IP 地址相同。
  • 节点 1 上的 speaker pod 使用 ARP 声明服务的外部 IP 地址 192.168.100.200。声明外部 IP 地址的 speaker pod 必须与服务的端点位于同一个节点上,端点必须为 Ready 条件。
  • 客户端流量路由到主机网络,并连接到 192.168.100.200 IP 地址。在流量进入节点后,服务代理会根据您为服务设置的外部流量策略,将流量发送到同一节点上的应用 pod 或其他节点。

    • 如果服务的外部流量策略设置为 cluster,则会从运行 speaker pod 的节点选择广告 192.168.100.200 负载均衡器 IP 地址的节点。只有该节点才能接收该服务的流量。
    • 如果服务的外部流量策略设置为 local,则会从运行 speaker pod 的节点以及至少一个服务的端点选择广告 192.168.100.200 负载均衡器 IP 地址的节点。只有该节点才能接收该服务的流量。在上图中,节点 1 或 3 将广告 192.168.100.200
  • 如果节点 1 不可用,则外部 IP 地址将故障转移到另一节点。在具有应用 pod 和服务端点实例的另一个节点上,speaker Pod 开始宣布外部 IP 地址 192.168.100.200,新节点接收客户端流量。在图中,唯一的候选项是节点 3。

6.4.1.6. BGP 模式的 MetalLB 概念

在 BGP 模式中,默认情况下每个 speaker pod 都会向每个 BGP 对等广告一个服务的负载均衡器 IP 地址。也可以通过添加可选 BGP 对等列表来广告来自给定池的 IP 地址到特定的对等池。BGP 对等点是配置为使用 BGP 协议的网络路由器。当路由器收到负载均衡器 IP 地址的流量时,路由器会选择一个带有公告 IP 地址的 speaker pod 的节点。路由器将流量发送到该节点。在流量进入节点后,CNI 网络插件的服务代理会将流量分发到该服务的所有 pod。

与集群节点相同的第 2 层网络段中直接连接的路由器可以配置为 BGP 对等点。如果直接连接的路由器没有配置为 BGP peer,您需要配置网络,以便负载均衡器 IP 地址的数据包在 BGP 对等机和运行 speaker Pod 的集群节点之间路由。

每次路由器接收负载均衡器 IP 地址的新流量时,它会创建一个新的与节点的连接。每个路由器制造商都有一个特定于实施的算法,用于选择要启动连接的节点。但是,算法通常设计为在可用节点之间分发流量,以平衡网络负载。

如果节点不可用,路由器会与具有 speaker pod 的另一个节点发起一个新的连接,以公告负载均衡器 IP 地址。

图 6.1. BGP 模式的 MetalLB 拓扑图

主机网络 10.0.1.0/24 上的 speaker pod 使用 BGP 将负载均衡器 IP 地址 203.0.113.200 播发给路由器。

上图显示了与 MetalLB 相关的以下概念:

  • 应用通过 172.130.0.0/16 子网上具有 IPv4 集群 IP 的服务进行访问。该 IP 地址可以从集群内部访问。该服务也有一个外部 IP 地址,MetalLB 分配到该服务 203.0.113.200
  • 节点 2 和 3 具有该应用的 pod。
  • speaker 守护进程集在每个节点上运行一个 pod。MetalLB Operator 启动这些 pod。您可以配置 MetalLB 来指定运行 speaker pod 的节点。
  • 每个 speaker pod 都是主机网络的 pod。容器集的 IP 地址与主机网络上节点的 IP 地址相同。
  • 每个 speaker pod 启动一个 BGP 会话,其中包含所有 BGP 对等点,并将负载均衡器 IP 地址或聚合路由公告给 BGP 对等点。speaker pod 公告它们是 Autonomous System 65010 的一部分。图显示路由器 R1 作为同一自主系统内的 BGP peer。但是,您可以将 MetalLB 配置为与属于其他自主系统的同行启动 BGP 会话。
  • 具有 speaker pod 的所有节点(公告负载均衡器 IP 地址)都可以接收该服务的流量。

    • 如果服务的外部流量策略设置为 cluster,则运行 speaker pod 的所有节点都会广告 203.0.113.200 负载平衡器 IP 地址,具有 speaker pod 的所有节点都可以接收该服务的流量。只有外部流量策略设为 cluster 时,主机前缀才会广告给路由器对等点。
    • 如果服务的外部流量策略设置为 local,则运行 speaker Pod 的所有节点都会运行,并且至少有一个运行的服务端点可能会广告 203.0.113.200 负载均衡器 IP 地址。只有这些节点才能接收该服务的流量。在上图中,节点 2 和 3 将公告 203.0.113.200
  • 您可以在添加 BGP peer 自定义资源时指定节点选择器,将 MetalLB 配置为通过指定带有特定 BGP peer 的节点选择器来控制哪些 speaker pod 启动 BGP 对等点。
  • 任何配置为使用 BGP 的路由器(如 R1)都可以设置为 BGP 同级服务器。
  • 客户端流量路由到主机网络上的其中一个节点。在流量进入节点后,服务代理会根据您为服务设置的外部流量策略,将流量发送到同一节点上的应用 pod 或其他节点。
  • 如果节点不可用,路由器检测到失败,并启动与另一节点的新连接。您可以将 MetalLB 配置为将双向转发检测(BFD)配置集用于 BGP 对等点。BFD 提供更快的链路失败检测,以便路由器可以比没有 BFD 的情况下启动新连接。

6.4.1.7. 限制和限制

6.4.1.7.1. MetalLB 的基础架构注意事项

MetalLB 主要用于内部的裸机安装,因为这些安装不包含原生负载平衡器功能。除了裸机安装外,在有些基础架构上安装 OpenShift Container Platform 可能不包括原生负载均衡器功能。例如,以下基础架构可从添加 MetalLB Operator 中受益:

  • 裸机
  • VMware vSphere
  • IBM Z® 和 IBM® LinuxONE
  • IBM Z® and IBM® LinuxONE for Red Hat Enterprise Linux (RHEL) KVM
  • IBM Power®

OpenShift SDN 和 OVN-Kubernetes 网络供应商支持 MetalLB 和 MetalLB。

6.4.1.7.2. 第 2 层模式的限制
6.4.1.7.2.1. 单节点瓶颈

MetalLB 通过单一节点路由服务的所有流量,该节点可能会成为瓶颈并限制性能。

第 2 层模式将服务的入口带宽限制为单个节点的带宽。这是使用 ARP 和 NDP 定向流量的一个根本限制。

6.4.1.7.2.2. 延迟故障转移性能

节点之间的故障转移取决于客户端的合作。发生故障转移时,MetalLB 发送粒度 ARP 数据包来通知客户端与服务 IP 关联的 MAC 地址已更改。

大多数客户端操作系统正确处理细粒度 ARP 数据包,并及时更新其邻居缓存。当客户端快速更新其缓存时,故障转移将在几秒钟内完成。客户端通常在 10 秒内故障转移到新节点。但是,一些客户端操作系统或者根本不处理饱和的 ARP 数据包,或者存在延迟缓存更新的过时实施。

Windows、macOS 和 Linux 等常见操作系统的最新版本正确实现了第 2 层故障转移。除了较旧和不太常见的客户端操作系统外,预计不会出现故障转移较慢的问题。

为最大程度减轻计划内故障转移对过时客户端的影响,在颠倒领导地位后让旧节点保持运行几分钟。旧节点可以继续转发过期客户端的流量,直到其缓存刷新。

在计划外故障转移期间,服务 IP 无法访问,直到过期的客户端刷新其缓存条目为止。

6.4.1.7.2.3. 额外网络和 MetalLB 无法使用相同的网络

将相同的 VLAN 用于 MetalLB 和源 pod 上设置的额外网络接口可能会导致连接失败。当 MetalLB IP 和源 pod 驻留在同一节点上时,会出现这种情况。

为了避免连接失败,请将 MetalLB IP 放在源 pod 所在的不同子网中。此配置可确保来自源 pod 的流量将采用默认网关。因此,流量可以使用 OVN 覆盖网络有效地到达其目的地,确保连接功能如预期一样。

6.4.1.7.3. BGP 模式限制
6.4.1.7.3.1. 节点故障可能会破坏所有活跃的连接

MetalLB 共享一个限制,这是基于 BGP 的负载平衡。当 BGP 会话终止时,如节点失败或者 speaker pod 重启时,会话终止可能会导致重置所有活跃的连接。最终用户可以 通过 peer 消息完成连接重置

所终止的 BGP 会话的结果是特定于路由器制造商的实现。但是,您可以预测 speaker pod 数量的变化会影响 BGP 会话的数量,并且与 BGP 对等点的活动连接将中断。

为了避免或降低服务中断的可能性,您可以在添加 BGP 对等点时指定节点选择器。通过限制启动 BGP 会话的节点数量,没有 BGP 会话的节点出现错误不会影响到该服务的连接。

6.4.1.7.3.2. 只支持单个 ASN 和单个路由器 ID

当您添加 BGP peer 自定义资源时,您可以指定 spec.myASN 字段来识别 MetalLB 所属的 Autonomous System Number(ASN)。OpenShift Container Platform 使用带有 MetalLB 的 BGP 实施,它要求 MetalLB 属于单个 ASN。如果您试图添加 BGP peer 并为 spec.myASN 指定与现有的 BGP peer 自定义资源不同的值,您会收到一个错误。

同样,当您添加 BGP peer 自定义资源时,spec.routerID 字段是可选的。如果为此字段指定一个值,您必须为要添加的所有其他 BGP peer 自定义资源指定相同的值。

支持单个 ASN 和单个路由器 ID 的限制与支持的 MetalLB 实施不同。

6.4.1.8. 其他资源

6.4.2. 安装 MetalLB Operator

作为集群管理员,您可以添加 MetalLB Operator,以便 Operator 可以管理集群中的 MetalLB 实例的生命周期。

MetalLB 和 IP 故障转移不兼容。如果您为集群配置了 IP 故障切换,请在安装 Operator 前执行删除 IP 故障切换的步骤。

6.4.2.1. 使用 Web 控制台从 OperatorHub 安装 MetalLB Operator

作为集群管理员,您可以使用 OpenShift Container Platform Web 控制台安装 MetalLB Operator。

先决条件

  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 在 OpenShift Container Platform Web 控制台中导航至 Operators OperatorHub
  2. Filter by keyword 框中输入关键字,或滚动以查找您想要的 Operator。例如,键入 metallb 来查找 MetalLB Operator。

    您还可以根据基础架构功能过滤选项。例如,如果您希望 Operator 在断开连接的环境中工作,请选择 Disconnected

  3. Install Operator 页面中,接受默认值并点 Install

验证

  1. 确认安装成功:

    1. 导航到 Operators Installed Operators 页面。
    2. 检查 Operator 是否安装在 openshift-operators 命名空间中,其状态是否为 Succeeded
  2. 如果 Operator 没有成功安装,请检查 Operator 的状态并查看日志:

    1. 导航到 Operators Installed Operators 页面,并检查 Status 列中是否有任何错误或故障。
    2. 导航到 Workloads Pods 页面,并检查 openshift-operators 项目中报告问题的 pod 的日志。

6.4.2.2. 使用 CLI 从 OperatorHub 安装

您可以使用 CLI 从 OperatorHub 安装 Operator,而不必使用 OpenShift Container Platform Web 控制台。您可以使用 OpenShift CLI(oc)安装 MetalLB Operator。

建议您在使用 metallb-system 命名空间中安装 Operator 的 CLI 时使用。

先决条件

  • 在裸机硬件上安装的集群。
  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 输入以下命令为 MetalLB Operator 创建命名空间:

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: metallb-system
    EOF
  2. 在命名空间中创建 Operator 组自定义资源(CR):

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: metallb-operator
      namespace: metallb-system
    EOF
  3. 确认 Operator 组已安装在命名空间中:

    $ oc get operatorgroup -n metallb-system

    输出示例

    NAME               AGE
    metallb-operator   14m

  4. 创建一个 Subscription CR:

    1. 定义 Subscription CR 并保存 YAML 文件,如 metallb-sub.yaml

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: metallb-operator-sub
        namespace: metallb-system
      spec:
        channel: stable
        name: metallb-operator
        source: redhat-operators 1
        sourceNamespace: openshift-marketplace
      1
      您必须指定 redhat-operators 值。
    2. 要创建 Subscription CR,请运行以下命令:

      $ oc create -f metallb-sub.yaml
  5. 可选: 要确保 BGP 和 BFD 指标出现在 Prometheus 中,您可以使用以下命令标记命名空间:

    $ oc label ns metallb-system "openshift.io/cluster-monitoring=true"

验证

验证步骤假定 metallb-system 命名空间中安装了 MetalLB Operator。

  1. 确认安装计划位于命名空间中:

    $ oc get installplan -n metallb-system

    输出示例

    NAME            CSV                                   APPROVAL    APPROVED
    install-wzg94   metallb-operator.4.16.0-nnnnnnnnnnnn   Automatic   true

    注意

    安装 Operator 可能需要几秒钟。

  2. 要验证是否已安装 Operator,请输入以下命令:

    $ oc get clusterserviceversion -n metallb-system \
      -o custom-columns=Name:.metadata.name,Phase:.status.phase

    输出示例

    Name                                  Phase
    metallb-operator.4.16.0-nnnnnnnnnnnn   Succeeded

6.4.2.3. 在集群中启动 MetalLB

安装 Operator 后,您需要配置 MetalLB 自定义资源的单一实例。配置自定义资源后,Operator 会在集群中启动 MetalLB。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。
  • 安装 MetalLB Operator。

流程

此流程假设 MetalLB Operator 已安装在 metallb-system 命名空间中。如果使用 Web 控制台安装,请替换命名空间的 openshift-operators

  1. 创建 MetalLB 自定义资源的单一实例:

    $ cat << EOF | oc apply -f -
    apiVersion: metallb.io/v1beta1
    kind: MetalLB
    metadata:
      name: metallb
      namespace: metallb-system
    EOF

验证

确认 MetalLB 控制器的部署和 MetalLB speaker 的守护进程集正在运行。

  1. 验证控制器的部署是否正在运行:

    $ oc get deployment -n metallb-system controller

    输出示例

    NAME         READY   UP-TO-DATE   AVAILABLE   AGE
    controller   1/1     1            1           11m

  2. 验证发言人的守护进程集是否正在运行:

    $ oc get daemonset -n metallb-system speaker

    输出示例

    NAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
    speaker   6         6         6       6            6           kubernetes.io/os=linux   18m

    示例输出显示 6 个 speaker Pod。集群中的 speaker pod 数量可能与示例输出不同。确保输出指示集群中每个节点有一个容器集。

6.4.2.4. MetalLB 的部署规格

当使用 MetalLB 自定义资源启动 MetalLB 实例时,您可以在 MetalLB 自定义资源中配置部署规格,以管理 controllerspeaker pod 如何在集群中部署并运行。使用这些部署规格来管理以下任务:

  • 为 MetalLB pod 部署选择节点。
  • 使用 pod 优先级和 pod 关联性来管理调度。
  • 为 MetalLB pod 分配 CPU 限值。
  • 为 MetalLB pod 分配容器 RuntimeClass。
  • 为 MetalLB pod 分配元数据。
6.4.2.4.1. 将 speaker pod 限制到特定的节点

默认情况下,当使用 MetalLB Operator 启动 MetalLB 时,Operator 会在集群中的每个节点上启动 speaker pod 的实例。只有具有 speaker pod 的节点可以公告负载均衡器 IP 地址。您可以使用节点选择器配置 MetalLB 自定义资源,以指定运行 speaker pod 的节点。

speaker Pod 限制到特定的节点的最常见原因是,确保只有具有特定网络上网络接口的节点公告负载均衡器 IP 地址。只有具有正在运行的 speaker pod 的节点才会公告为负载均衡器 IP 地址的目的地。

如果将 speaker 的 pod 限制到特定的节点,并为服务的外部流量策略指定 local,则必须确保该服务的应用程序 pod 部署到同一节点上。

将 speaker pod 限制为 worker 节点的配置示例

apiVersion: metallb.io/v1beta1
kind: MetalLB
metadata:
  name: metallb
  namespace: metallb-system
spec:
  nodeSelector:  1
    node-role.kubernetes.io/worker: ""
  speakerTolerations:   2
  - key: "Example"
    operator: "Exists"
    effect: "NoExecute"

1
示例配置指定将 speaker pod 分配给 worker 节点,但您可以指定分配给节点或任何有效的节点选择器的标签。
2
在本示例配置中,附加此容限的 pod 可以容忍与 key 值和 effect 值匹配的任何污点,并使用 operator 容许值。

使用 spec.nodeSelector 字段应用清单后,您可以检查 Operator 使用 oc get daemonset -n metallb-system speaker 命令部署的 pod 数量。同样,您可以使用 oc get nodes -l node-role.kubernetes.io/worker= 等命令显示与标签匹配的节点。

您可以选择允许节点使用关联性规则控制哪些 speaker pod 应该或不应该调度到节点上。您还可以通过应用容限列表来限制这些 pod。如需有关关联性规则、污点和容限的更多信息,请参阅其他资源。

6.4.2.4.2. 在 MetalLB 部署中配置 pod 优先级和 pod 关联性

您可以通过配置 MetalLB 自定义资源,选择将 pod 优先级和 pod 关联性规则分配给 controllerspeaker pod。pod 优先级指示节点上 pod 的相对重要性,并根据这个优先级调度 pod。在 controllerspeaker pod 上设置高优先级,以确保在节点上的其他 pod 上调度优先级。

Pod 关联性管理 pod 间的关系。将 pod 关联性分配给 controllerspeaker pod,以控制调度程序将 pod 放置到 pod 关系的节点上。例如,您可以使用 pod 关联性规则来确保某些 pod 位于同一节点或节点上,这有助于提高网络通信并减少这些组件之间的延迟。

先决条件

  • 您以具有 cluster-admin 权限的用户身份登录。
  • 已安装 MetalLB Operator。
  • 已在集群中启动 MetalLB Operator。

流程

  1. 创建 PriorityClass 自定义资源,如 myPriorityClass.yaml,以配置优先级级别。这个示例定义了名为 high-priorityPriorityClass,值设为 1000000。与具有较低优先级类的 pod 相比,在调度过程中分配此优先级类的 Pod 被视为优先级更高:

    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: high-priority
    value: 1000000
  2. 应用 PriorityClass 自定义资源配置:

    $ oc apply -f myPriorityClass.yaml
  3. 创建 MetalLB 自定义资源,如 MetalLBPodConfig.yaml,以指定 priorityClassNamepodAffinity 值:

    apiVersion: metallb.io/v1beta1
    kind: MetalLB
    metadata:
      name: metallb
      namespace: metallb-system
    spec:
      logLevel: debug
      controllerConfig:
        priorityClassName: high-priority 1
        affinity:
          podAffinity: 2
            requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                 app: metallb
              topologyKey: kubernetes.io/hostname
      speakerConfig:
        priorityClassName: high-priority
        affinity:
          podAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                 app: metallb
              topologyKey: kubernetes.io/hostname
    1
    指定 MetalLB 控制器 pod 的优先级类。在这种情况下,它被设置为 high-priority
    2
    指定您要配置 pod 关联性规则。这些规则指定如何调度 pod 与其他 pod 或节点。此配置指示调度程序将具有标签 app: metallb 的 pod 调度到共享同一主机名的节点。这有助于在同一节点上并置与 MetalLB 相关的 pod,可能会优化这些 pod 之间的网络通信、延迟和资源使用情况。
  4. 应用 MetalLB 自定义资源配置:

    $ oc apply -f MetalLBPodConfig.yaml

验证

  • 要在 metallb-system 命名空间中查看分配给 pod 的优先级类,请运行以下命令:

    $ oc get pods -n metallb-system -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName

    输出示例

    NAME                                                 PRIORITY
    controller-584f5c8cd8-5zbvg                          high-priority
    metallb-operator-controller-manager-9c8d9985-szkqg   <none>
    metallb-operator-webhook-server-c895594d4-shjgx      <none>
    speaker-dddf7                                        high-priority

  • 要验证调度程序是否根据 pod 关联性规则放置 pod,请运行以下命令来查看 pod 的节点或节点的元数据:

    $ oc get pod -o=custom-columns=NODE:.spec.nodeName,NAME:.metadata.name -n metallb-system
6.4.2.4.3. 在 MetalLB 部署中配置 pod CPU 限制

您可以通过配置 MetalLB 自定义资源(可选)将 pod CPU 限值分配给 controllerspeaker pod。为 controllerspeaker pod 定义 CPU 限制可帮助您管理节点上的计算资源。这样可确保节点上的所有 pod 具有必要的计算资源来管理工作负载和集群内务。

先决条件

  • 您以具有 cluster-admin 权限的用户身份登录。
  • 已安装 MetalLB Operator。

流程

  1. 创建 MetalLB 自定义资源文件,如 CPULimits.yaml,以指定 controllerspeaker pod 的 cpu 值:

    apiVersion: metallb.io/v1beta1
    kind: MetalLB
    metadata:
      name: metallb
      namespace: metallb-system
    spec:
      logLevel: debug
      controllerConfig:
        resources:
          limits:
            cpu: "200m"
      speakerConfig:
        resources:
          limits:
            cpu: "300m"
  2. 应用 MetalLB 自定义资源配置:

    $ oc apply -f CPULimits.yaml

验证

  • 要查看 pod 的计算资源,请运行以下命令,将 <pod_name> 替换为您的目标 pod:

    $ oc describe pod <pod_name>

6.4.2.5. 其他资源

6.4.2.6. 后续步骤

6.4.3. 升级 MetalLB Operator

请注意,如果您当前运行的是版本 4.10,或 MetalLB Operator 的早期版本,对 4.10 之后的任何版本的自动更新都无法正常工作。从 4.11 或更高版本的 MetalLB Operator 版本升级到更新的版本。例如,从 4.12 升级到 4.13 版本将会平稳进行。

从 4.10 及更早版本的 MetalLB Operator 的升级步骤概述如下:

  1. 删除安装的 MetalLB Operator 版本,如 4.10。确保没有删除命名空间和 metallb 自定义资源。
  2. 使用 CLI,在安装之前版本的 MetalLB Operator 的同一命名空间中安装 MetalLB Operator 4.16。
注意

此流程不适用于 MetalLB Operator 的自动 z-stream 更新,这遵循标准的方法。

有关从 4.10 及更早版本升级 MetalLB Operator 的详细信息,请参阅以下指导。作为集群管理员,使用 OpenShift CLI (oc) 或 Web 控制台删除 MetalLB Operator 来启动升级过程。

6.4.3.1. 使用 Web 控制台从集群中删除 MetalLB Operator

集群管理员可以使用 Web 控制台从所选命名空间中删除已安装的 Operator。

先决条件

  • 使用具有 cluster-admin 权限的账户访问 OpenShift Container Platform 集群 Web 控制台。

流程

  1. 导航到 Operators Installed Operators 页面。
  2. 搜索 MetalLB Operator。然后点它。
  3. Operator Details 页面右侧,从 Actions 下拉菜单中选择 Uninstall Operator

    此时会显示 Uninstall Operator? 对话框。

  4. 选择 Uninstall 来删除 Operator、Operator 部署和 pod。按照此操作,Operator 将停止运行,不再接收更新。

    注意

    此操作不会删除 Operator 管理的资源,包括自定义资源定义 (CRD) 和自定义资源 (CR) 。Web 控制台和继续运行的集群资源启用的仪表板和导航项可能需要手动清理。要在卸载 Operator 后删除这些,您可能需要手动删除 Operator CRD。

6.4.3.2. 使用 CLI 从集群中删除 MetalLB Operator

集群管理员可以使用 CLI 从所选命名空间中删除已安装的 Operator。

先决条件

  • 使用具有 cluster-admin 权限的账户访问 OpenShift Container Platform 集群。
  • 已在工作站上安装 oc 命令。

流程

  1. currentCSV 字段中检查订阅的 MetalLB Operator 的当前版本:

    $ oc get subscription metallb-operator -n metallb-system -o yaml | grep currentCSV

    输出示例

      currentCSV: metallb-operator.4.10.0-202207051316

  2. 删除订阅:

    $ oc delete subscription metallb-operator -n metallb-system

    输出示例

    subscription.operators.coreos.com "metallb-operator" deleted

  3. 使用上一步中的 currentCSV 值来删除目标命名空间中相应 Operator 的 CSV:

    $ oc delete clusterserviceversion metallb-operator.4.10.0-202207051316 -n metallb-system

    输出示例

    clusterserviceversion.operators.coreos.com "metallb-operator.4.10.0-202207051316" deleted

6.4.3.3. 编辑 MetalLB Operator Operator 组

当从任何 MetalLB Operator 版本升级到并包括 4.10 升级到 4.11 及之后的版本时,从 Operator 组自定义资源(CR)中删除 spec.targetNamespaces。无论是否使用 Web 控制台或 CLI 来删除 MetalLB Operator,都必须删除 spec。

注意

MetalLB Operator 版本 4.11 或更高版本只支持 AllNamespaces 安装模式,而 4.10 或更早的版本支持 OwnNamespaceSingleNamespace 模式。

先决条件

  • 您可以使用 cluster-admin 权限访问 OpenShift Container Platform 集群。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令,列出 metallb-system 命名空间中的 Operator 组:

    $ oc get operatorgroup -n metallb-system

    输出示例

    NAME                   AGE
    metallb-system-7jc66   85m

  2. 运行以下命令,验证与 metallb-system 命名空间关联的 Operator 组 CR 中是否存在 spec.targetNamespaces

    $ oc get operatorgroup metallb-system-7jc66 -n metallb-system -o yaml

    输出示例

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      annotations:
        olm.providedAPIs: ""
      creationTimestamp: "2023-10-25T09:42:49Z"
      generateName: metallb-system-
      generation: 1
      name: metallb-system-7jc66
      namespace: metallb-system
      resourceVersion: "25027"
      uid: f5f644a0-eef8-4e31-a306-e2bbcfaffab3
    spec:
      targetNamespaces:
      - metallb-system
      upgradeStrategy: Default
    status:
      lastUpdated: "2023-10-25T09:42:49Z"
      namespaces:
      - metallb-system

  3. 运行以下命令,编辑 Operator 组并删除 spec 部分下的 targetNamespacesmetallb-system

    $ oc edit n metallb-system

    输出示例

    operatorgroup.operators.coreos.com/metallb-system-7jc66 edited

  4. 运行以下命令,验证 spec.targetNamespaces 已从与 metallb-system 命名空间关联的 Operator 组自定义资源中删除:

    $ oc get operatorgroup metallb-system-7jc66 -n metallb-system -o yaml

    输出示例

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      annotations:
        olm.providedAPIs: ""
      creationTimestamp: "2023-10-25T09:42:49Z"
      generateName: metallb-system-
      generation: 2
      name: metallb-system-7jc66
      namespace: metallb-system
      resourceVersion: "61658"
      uid: f5f644a0-eef8-4e31-a306-e2bbcfaffab3
    spec:
      upgradeStrategy: Default
    status:
      lastUpdated: "2023-10-25T14:31:30Z"
      namespaces:
      - ""

6.4.3.4. 升级 MetalLB Operator

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。

流程

  1. 验证 metallb-system 命名空间仍然存在:

    $ oc get namespaces | grep metallb-system

    输出示例

    metallb-system                                     Active   31m

  2. 验证 metallb 自定义资源仍然存在:

    $ oc get metallb -n metallb-system

    输出示例

    NAME      AGE
    metallb   33m

  3. 按照"使用 CLI 安装 OperatorHub"中的指导来安装 MetalLB Operator 的最新 4.16 版本。

    注意

    安装最新的 MetalLB Operator 版本 4.16 时,您必须将 Operator 安装到之前安装的同一命名空间。

  4. 验证 Operator 的升级版本现在是 4.16 版本。

    $ oc get csv -n metallb-system

    输出示例

    NAME                                   DISPLAY            VERSION               REPLACES   PHASE
    metallb-operator.4.16.0-202207051316   MetalLB Operator   4.16.0-202207051316              Succeeded

6.4.3.5. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.